Arduino 39: SYNTEZATOR MOWY
HTML-код
- Опубликовано: 13 сен 2024
- Syntezator mowy czyli jak zrobić urządzenie mówiące dowolnym, wcześniej nagranym głosem. O fonemach i problemach z "gadającymi" interfejsami.
Kod, na którym bazuje odcinek, można pobrać stąd:
adamsmialek.co...
Zapraszam do wsparcia mojego kanału:
patronite.pl/s...
PayPal.Me/smialekadam
oraz do subskrybowania:
www.youtube.co...
#Arduino #speech #syntezatormowy
oglądam pańskie materiał aby zrozumieć podstawy na które nie mam już czasu, dziękuję
*_W roku 1994 na pracę dyplomową z kolegą zmajstrowałem na Z80 8KB ROM + 32KB SRAM + 64 KB EPROM (sample) gadający zegar, było kupa zabawy a właściwie to cała tabela startów, stopów sampli by gadacz wymawiał czas w płynny zrozumiały sposób._*
_Także Adamie mój szacun za takie dość "dyletanckie" acz ciekawe podejście do tego typu zagadnienia jakim jest fonetyka._
Mógłbyś kiedyś zrobić film o tym urządzonku! Wtedy to było coś nowatorskiego! Może nie mega, bo już takie rozwiązania były, ale też na pewno synteza mowy była dużo mniej popularna niż dziś i dużo mniej zaawansowana. I wciąż powodowała duże wow! W każdym bądź razie fajny temat pracy!
Bardzo ciekawy odcinek, choć po cichu liczyłem, że pokaże Pan prace nad jedną głoską czyli jak brzmi przycięta i jak nie. Najciekawsze, że problemy z odnajdywaniem głosek i ich rozwiązanie, wydały mi się łatwiejsze do zrozumienia, niż większość operacji przy starych wyświetlaczach.
👍 👍 👍 I kolejny fajny odcinek, dający pewne pojęcie o syntezie mowy! Choć oczywiście do prawdziwej syntezy wciąż daleko...
Wstęp mnie zaskoczył i rozbawił.
Panie Adamie, jestem osobą niewidomą która właśnie korzysta z czytników ekranu i syntezatorów mowy. syntezator rzeczywiście gada jak ten z końca lat osiemdziesiątych np. Przystawka do komputera Spektrum, Ale sama wiedza na temat tworzenia syntezy mowy bardzo przystępnie przedstawiona.
I2S dla arduino czy pythona jest tanie i mowi naturalnie - dla prostych urzadzen stosuje tanie syntezatory mowy ktore maja zdania czy zwroty zapisane w pamieci - format MP3 . W cenie 500 zl sa kamery inteligentne AI ktore rozpoznaja przedmioty i modul za 20 zl moze powiedzic co widzi - za 4000 mozna zbudowac system, ktory bedzie odszukiwal przedmioty - np. gdzie jest czerwony kubek ? - odpowiedz - na stoliku po twojej lewej stronie. Tyle kosztuje jeden, zwykly pocisk artyleryjski 155 mm.
Piękne ale nie usłyszałem nawet jednego wyrazu.
8:42 😊
Super odcinek ale w 17:58 brzmi groźnie 😊
A nie zastanawiał się pan nad podejściem opartym o fonemy i ich składowe - szum i ton. 1 i 2 harmoniczna ich przebieg jest charakterystyczny dla głosek i ich kontrola zapewni płynne przejścia między głoskami. Plozywne to tylko szum.
Tak pewno byłoby też ciekawie, ale byłoby z tym więcej pracy i jest to mniej intuicyjne. Chętnie bym się tym pobawił dłużej, ale nie ma kiedy. Dobrym pomysłem byłoby przejście na sylaby, przy wytypowaniu powiedzmy setki najczęściej spotykanych.
👍👍👍👍
Oprócz DZI jest jeszcze 4 literowy przypadek DZI + samogłoska, gdzie I staje się praktycznie nieme.
Jak się to zachowuje jeśli wychodzimy poza rozmiar string? Np. x wskazuje na przedostatni znak a odczytujemy x+2 ?
Coś przypadkowego się pojawi. Ale szansa, że to będzie któraś z kombinacji istniejących jest marna, więc po prostu zagra cisza. Błędu nie będzie.
😱
Jest coś takiego jak "voice cloning" - a właściwie usługi klonujące głos na bazie próbek głosu. Zresztą, są one zaawansowane dzięki CNN (Convulsional Neural Networks) - konwulsyjnym sieciom neuronowym, a zarazem dzięki bibliotekom generującym głos w danym języku.
Ale nie wiem czy takie rozwiązania rodem z AI mają odbicie w obecnych bibliotekach Arduino.
p.s. pamiętam swoje zabawy przy klonie Ivony, jaką było Expressivo. Ono operowało lepszymi formami tworzenia dykcji komputerowego głosu.
To jest zabawa na bardzo wstępnych założeniach, robiona na szybko i jest propozycją wyjściową do czegoś bardziej zaawansowanego. Zresztą jak większość moich projektów, które mają raczej pobudzać do działania, a nie dawać gotowe rozwiązania.
@G12GilbertProduction nie "Convulsional" (konwulsja, spazm, podryg) tylko Convolutional, czyli po polsku konwolucyjna lub splotowa
witam.
jest gotowa biblioteka do syntezy mowy.
na c64 tez byla realizowana taka synteza.
na polskim kardridzu. black box v8. i nie uzywala sampli.
moze kiedys zrobisz filmik o takiej realizacji syntezy.
byly tez specjalne chipy do syntezy. ale tylko w angielskiej formie. brzmialy jeszcze gorzej niz ten z c64..
pozdrawiam.
Te wszystkie rozwiązania mają jedną wadę: nie gadają głosem właściciela :)
Z tym kartridżem to jak napisałeś, coś zaczęło chodzić mi po głowie... Ale w jaki sposób ta synteza była realizowana?
W rzeczywistości trzeba by analizować całe słowa a nawet całe zdania i pewnie też w grę może wchodzić jakieś buforowanie. Zapytanie Arduino na przykład o godzinę czy tam temperaturę z jakiegoś czujnika nie powinno stanowić większego problemu ale realizacja syntezatora mowy przez odgrywanie z plików samych liter to kompletne nieporozumienie. Już to widzę jak Arduino wypowie godzinę 12:45 jako jeden dwa cztery pięć a nie dwunasta czterdzieści pięć albo temperaturę 27 st. jako dwa siedem zamiast dwadzieścia siedem.
Oczywiście, że nieporozumienie, dlatego pokazałem jak na początek radzić sobie z głoskami, które nie mają swoich reprezentantów znakowych. Po tej dawce wiedzy każdy już sobie może rozbudowywać program w nieskończoność.
@ Rozrośnie się tak że pamięci nie wystarczy, nie mówiąc już o wydajności. Trzeba by kupić Mega 2560 do takich zabaw. Tłumaczenie cyfr na słowa byłoby jednak znacznie prostsze. Co nie zmienia faktu że odcinek ma niezłą wartość edukacyjną.
No ale tu właśnie przetłumaczyłem cyfry na słowa :) Tylko, że w odmianie głównej, co nie znaczy, że nie można sobie zrobić drugiej grupy w odmianie porządkowej. Poza tym tego typu idea wystąpiła w poprzednim odcinku.
zrobilem w Ardulino i mowi naturalnie godzine - mozna zapisac slownik - ale kto to wczyta do pamieci ( czas i koszty) ?
@@mark-robots Normalnie na karcie SD się zapisuje w postaci plików dźwiękowych. A potem wczytuje i wybiera odpowiednie. Słownik też można tam jakoś zapisać w postaci pliku tekstowego żeby wiedziało co ma wybierać.
AI na Arduino - Future is beeing made today!
Wiele lat temu zrobilem sobie gadajacy zegar z samplami w pamieci SPI, a samo odtwarzanie sampli tez bylo reczne - bez biblioteki. Prototyp latwiej bylo sprawdzic z karta SD.Jak kogos interesuje jak to slychac to demo w filmiku
watch?v=3xSZnY-yeYA
Dasz w końcu ten kod, czy nie 😉
@@paprukas Kto chcial to dostal :)
Ok.
no HAL 9000 to to nie jest ale ...
Badzmy szczerzy. Nic z tego samplera nie idzie zrozumiec. C64 + black box 8.1 robi to tysiac razy lepiej. Nie wspominajac o tym, ze umie spiewac...
No cóż, poświęciłem temu godzinę. Nic tylko siąść i dopracować sample, dorobić więcej fonemów i będzie dobrze.
@ skoro tylko godzinę. to faktycznie twój mózg robi robote.pozdro..
Dłubanina na calego!
Sama idea jest ok ale wykonanie to delikatnie mówiąc nieporozumienie.
Nie wiem skąd taki bezsensowny pomysł z milionem instrukcji IF! Tak wiem było o tym w filmie ale jest coś takiego magicznego jak TABLICA.
Lepiej było by na początku zrobić analizę tekstu a potem tylko odtwarzać dźwięki - było by płynniej. Jak ktoś wspomniał na C64 z marnym 1MHz brzmi to lepiej.
Do tego RZ w wyrazie ZMARZLINA czytane jak R Z a nie Ż. Jest jeszcze dużo takich wyjątków jak np WSCHÓD, a mówimy fshut.
Trochę bezrefleksyjną ta krytyka i zdradza nieznajomość rzeczy. Po pierwsze, szybkość pracy pętli jest wielokrotnie wyższa od wymagań algorytmu mowy. Przerwy są powodowane wyłącznie pobieżnym dobraniem fazy attack i release próbek. Po drugie, to właśnie w takich przypadkach, samych wyjątków, stosuje się if-y zamiast tablic, bo w każdych warunkach można podjąć indywidualne działania, co w przypadku syntezatorów mowy jest nieodzowne. Resztę przedstawiłem w filmie i w razie wątpliwości proszę go obejrzeć z uwagą.
Jeśli chodzi o takie hobbystyczne projekty, to jak najbardziej można sobie pisać milion ifów, choć nie jest to wedle najlepszych praktyk, nikt nam nie zabroni. Jednak przy rozbudowywaniu takiego projektu można by się pokusić o inny sposób na zakodowanie tego, który nie będzie wymagał tylu linijek
Brzbi jak Major Suchodolski
Niestety (albo stety) już świętej pamięci.
Zamiast tych if-ów mozna zrobić SdPlay.setFile(litera+".afm")
No a co w przypadku np. ą? :)
@ ja bym to zrobił w ten sposób że pierwsza obsługa wyjątków a potem zwykle litery. Pisałem komentarz w trakcie oglądania filmu
@ każdy inny sposób byłby lepszy.. Zawsze można zrobić kilka warunków na zakresy a-z, 0,9 a polskie z jakiejś statycznej mapy / tabeli asocjacyjnej wczytać.
I zaciemnić obraz całości początkującym. Tutaj jest ukazana ewolucja, do której dokładam kolejne wyjątki i skupiam się na nich, a nie na kodzie. O kodzie jest w innych odcinkach, mówiłem o takich sprawach wiele razy.
Zabawa może i ciekawa, ale nie wyszło z tego coś co dało by się zrozumieć.
Ah a jakby zamiast ręcznego analizowania kodów UTF-8 wrzucić tam poprawny dekoder UTF-8 do tego tablicę sekwencji wraz z przypisanymi do nich nazwami plików (od najdłuższych do najkrótszych), to by się to pewnie zamiast tego spagetti ifów dało upchnąć w jednym do {} while i paru ifach ;D Ale ok, ok, edukacja. ;)
Różne są metody dojścia do prawdy :) Metoda z if-ami ma tę zaletę, że łatwo dokładać kolejne wyjątki i wbrew pozorom, jest dość przejrzysta.
@ Mi się to tam źle czyta. Ale jak dla początkujących, meh, ok. No i jest jeszcze ta sprawa, że jakby przełączyć terminal z UTF8 na coś jedno bajtowego (WIN1250?) to cala zabawa z wielo-bajtowymi znakami wcale by nie była potrzebna. ;)
Pewno, ale zakładałem, że używamy narzędzi jakimi są. Chyba nie da się przestawić standardu bez głębszego grzebania w środowisku IDE. Tym razem chodziło mi właśnie o umiejętność pracy na danych zastanych.
@ Metoda z if'ami jest oczywiście nie najlepsza i na pewno dałby się to zrobić znacznie zwięźlej, natomiast zakładając że if'y są bardziej "przejrzyste" to może zamiast męczyć atmegę sprawdzaniem kolejnych warunków (nawet po znalezieniu danej litery) warto by zastosować else if'y. W takim wypadku po znalezieniu odpowiedniej litery zamiast sprawdzać kolejne warunki program przejdzie do końca pętli. Dodatkowo ostatni złożony warunek "if (litera < 48 || (litera > 57 && litera < 65) || (litera > 90 && litera < 97) || (litera > 122 && litera < 128))" zastępujemy wtedy samym słowem "else". Wydaje się, że do samego pokazania jak taki syntezator miałby działać to jest taki program wystarczający, ale de facto za dużo nie da się tam już dopisać żeby urządzenie robiło coś innego niż syntezę mowy. Co do wychodzenia poza zakres tablicy (jeżeli dobrze liczę) przykładowe zdanie kończące się na literę "c" może zostać przeczytane jako "ci","ch" lub "cz" z prawdopodobieństwem ok. 2,3%. Przy czytaniu większej liczby zdań może to być znaczące.
2,3% dla c, ale mamy jeszcze sporo innych liter, dla których nie będzie drugiego ani trzeciego bajtu i w sumie to się pewno zdarzy raz na tysiąc razy. Ale oczywiście to jest wersja na początek tylko i wymaga rozbudowania do zastosowań bardziej użytecznych (np. status READY dla żądania wysłania kolejnej partii tekstu). Else siedzą u mnie w warunkach badań drugiego i trzeciego bajtu, nie chciałem zaciemniać jeszcze bardziej całości. Jak mówiłem, czas pracy jest tu zupełnie niekrytyczny, nawet kilkumilisekundowe lagi nie mają znaczenia.