Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Rozpoznawanie pol( )ceń głosowych

And! 24 Lis 2004 19:08 5031 10
  • #1 24 Lis 2004 19:08
    And!
    Admin grupy Projektowanie

    Czy ktoś się oriętuje jakie algorytmy stosuję się do określania podobieństwa próbek dźwiękowych ?

    Widizałem program (KM Remote) w którym trzeba kilkarotnie powiedzieć komendę
    program wyliczał sobie wzorzec i potem reagował na komendy.

    Ciekawe czy budowa algorytmu określającego podobieństwo sampli dźwięku jest złożona.
    [h]

    0 10
  • #2 26 Lis 2004 20:26
    Paweł Es.
    Pomocny dla użytkowników

    Złozoność zależy od tego co chcesz uzyskać. Jeżeli jest jeden mówca to jest mniejszy problem, jeżeli masz rozpoznawać wielu mówców wydających te same komendy to jest większy problem. Niestety wbrew pozorom 2 (i więcej) osoby mówiące to samo nigdy nie robią tego w ten sam sposób. Różnice wynikają z budowy anatomicznej "narządu" głosowego, nawyków, wychowania, nastroju, i przebywanego właśnie kataru czy innej gardłowej przypadłości.

    Ludzie różnią się:

    - głośnością wymawiania poszczególnych częsci wyrazu
    - czasem artykulacji
    - wysokością głosu
    - przebiegiem zmian tej wysokości przy wymawianiu słów
    - położeniem częstotliwości formantowych (lokalnych wzmocnień widma)w widmie mowy (zwykłe A ma różny rozkład widmowy nie tylko u różnych mówców ale i w zależności od głoski poprzedzającej lub następującej).
    - szerokością formantów
    - przebiegiem częstotliwości formantowych w czasie wymawiania
    - sposobem artykulacji co wpływa na przebieg amplitudy.

    do tego

    - niektóre głoski stają się dźwięczne lub bezdźwięczne w zależności od tego jaka jest następna głoska, np:

    piszemy kózka - ale wymawiamy kuska
    piszemy sześćset ale wymawiamy szejset
    np. słowo spód na końcu zdania zostanie wymówione sput
    ale w środku zdania "Kładź na spód Alojzy" będzie "spud"

    Zwykłe zapisanie fali dźwiękowej nic nie da, bo wystarczy zmiana głośności porównywanej próbki i całe porównanie bierze w łeb.
    Ogólnie jest to zadanie złożone (można próbować rozdzielić sygnał wejściowy na podpasma i analizować je oddzielnie - np. mierząc poziomy sygnału i ilość przejść przez zero w paśmie).

    Dużo prościej jest zrobić dzieciaka poczekać aż podrośnie i wydawać mu polecenia - zrozumie każde (możliwe, że nie każde wykona) i nie trzeba się głowić nad algorytmami :)

    0
  • #3 26 Lis 2004 20:45
    And!
    Admin grupy Projektowanie

    Myslalem nad transformacja fouriera
    a potem zapisania wzorca zmian czestotliwosci.

    Problem tylko z algorytmem ktory bedzie okrelal podobiestwo nagranej probki z probkami nadchodzacymi z karty dziwekowej

    0
  • #4 27 Lis 2004 03:30
    shg
    Specjalista techniki cyfrowej

    jeżeli ma być jedna osoba, to wystarczy transformata Fouriera, potem normalizacja, tak, aby np. średnia wartość próbek (po transformacie) wynosiła 0.5, albo maksymalna 1, nie wiem co będzie lepsze. i potem policzyć korelację ze wzorcami sporządzonymi w ten sam sposób, ale powtórzonych 3 razy i uśrednionych.

    Po próbkowaniu, a przed transformatą warto by było wykonać kompresję dynamiki sygnału.

    Komendy należy wypowiadać z szybkością zbliżoną do wzorca.

    Na amigę jest taka biblioteka do rozpoznawania głosu, potrafi odróżnić od siebie słowa z tego zdania z bardzo dużą trafnością (w moim wypadku to było 100%):
    "Peter ... Piper ... Picked ... A Peck Of ... Pickled ... Peppers."

    Tu można ściągnąć bibliotekę i jakieś info o niej, na dole strony, nazywa się voice.library:
    http://uk.aminet.net/aminetbin/find?voice

    Oczywiście biblioteka radzi sobie bez problemów także z językiem polskim.

    Z problemem szybkości wypowiadanych poleceń też można sobie poradzić i do tego łatwo i skutecznie.
    Wystarczt zastosować tzw. time streching, wszystkie wzorce skrócić/wydłużyć do np. 1s i to samo robiś ze spróbkowanymi komendami. Wykonanie tego w domenie czasu nie jest proste, ale w domenie częstotliwości to bułka z masłem (pod warunkiem odrzucenia informacji o fazie przetwarzanego sygnału, która na szczęście nas nie interesuje).

    Częstotliwość próbkowania 6.4kHz, 32 prążki widma. i dalej po 1 bicie (!) na każdy prążek, stąd ta normalizacja, o której wspomniałem, chociaż pewnie i tak należało by ustalić jakiś próg klasyfikacji dla każdego prążka, jest/nie ma.
    Tu cytat z doc'a do biblioteki, reszta tekstu jest raczej mało interesująca, bo dotyczy wykorzystania biblioteki we własnych programach.

    Cytat:
    A frequency map of each incoming word or phrase is computed for comparison with maps learned and stored in MapBuffer. Each map consists of a frequency analysis of 3/4 second of audio data at 72 points in time. For each of these 72 time points, the data is examined for frequency content at 32 points between 0 Hz and 3200 Hz. A frequency map is made up of 72, 32 bit words corresponding to the 72 time points analyzed. For each of these 32 bit words, bit 0 is set if the signal contains frequency components from 0-100 Hz. Bit 1 is set if the signal contains frequency components from 100-200 Hz. Bit 2 is set if the signal contains frequency components from 200-300 Hz etc. This function returns the address of this frequency map for possible additional experimental uses. Note that this internal frequency map does not have the 16 byte ASCII header as do the frequency maps stored in MapBuffer.


    Wydaje mi się, że kiedyś miałem źródło tej biblioteki, jeżeli nie ściągnięte, to były efektem jakaiejś zabawy w reverse engineering, w razie potrzeby mogę to powtórzyć, ale kod źródłowy będzie raczej mało czytelny bez znajomości systemy amigi i asemblera MC680x0...

    0
  • #5 27 Lis 2004 12:37
    And!
    Admin grupy Projektowanie

    Ciekawe rozwizanie z tym jednym bitem na prazek.

    Wprawdzie chcialem zmniejszyc rozdzielczosc mocy sygnalu w danym pasmie ale nie spodziewalem sie ze mozna doprowadzic do sytuacji
    czestotliwosc w pasmie jest lub niema !

    Normalizacja dlugosci zapisanej probki jest dlamnie oczywista.

    Czy mozesz przyblizyc normalizacje probek (ich dlugosci) pobieranych z mikrofonu ? (mam wybrac probke dluzsza od najdluzszej spoedziewanej i potem znormalizowac ?)

    Jakos nie moge zrozumiec jak to ma zadzialac dla roznej dlugosci wypowiadanych komend. (chodzi mi o pobieranie probek z mikrofonu nie zapisanych wzorcow)

    0
  • #6 27 Lis 2004 16:18
    shg
    Specjalista techniki cyfrowej

    Algorytmy stosuje się dokładnie takie same, jak do zmiany rozmiaru grafiki :D

    na osi X czas, czyli kolejne transformaty
    na osi Y częstotliwość
    kolor to moc poszczególnych prążków

    widmo1.gif - to powiedzmy efekt przepuszczenia przez fouriera naszej spróbkowanej komendy
    no i zakładamy, że była ona dłuższa od wzorca (widmo2.gif), wystarczy teraz odpowiednio "zagęścić" kolejne transformaty, jeżeli komenda zostanie wypowiedziana zbyt szybko, to transformaty "rozciągamy". Najlepiej zastosować w obu przypadkach jakąś choćby najprostszą interpolację (np. liniową) przy rozciąganiu i coś, co przypomina bilinear filtering, tylko, że odwrócony i tylko w jednym wymiarze przy zagęszczaniu (w sumie to ten niby-bilinear filtering można stosować zarówno do rozciągania, jak i skracania).

    W praktyce można to zrealizować tak:
    Założenie - częstotliwość próbkowania 6.4kHz
    - Z mikrofonu mamy powiedzmy 2048 próbek (co daje nam 0.32sekundy)
    - wykonujemy na nich 32 transformaty fouriera, z każdej dostajemy po 32 prążki, każdemu z wyników transformaty odpowiada (32*2)/6400=0.01s spróbkowanego sygnału.
    - układamy wszystko w macierz - każda kolumna to wynik jednej transformaty (jak widać na załączonych obrazkach).
    Zaczynamy sprawdzać wzorce.
    - Wzorzec pierwszy trwa powiedzmy 1.3s, przeliczamy, z ilu transformat składa się wzorzec 1.3*6400/(32*2)=130 transformat.
    - Bierzemy kolejne wiersze macierzy, z każdego z nich mamy sygnał zawierający tyle próbek, ile transformat (czyli u nas 32).
    - Teraz bawimy się w resampling. Z pomocą przychodzi nam interpolacja. Tworzymy nowy bufor o długości takiej jak wzorzec (130) i za pomocą interpolacji "rozciągamy" nasze 32 próbki na 130 próbek, albo, jak kto woli wykonyjemy resampling z 6.4kHz na 6400*130/32=26kHz.
    - W ten sam sposób postępujemy ze wszystkimi wierszami macierzy i otrzymujemy macierz o 32 wierszach i 130kolumnach.
    - Liczymy korelację otrzymanej macierzy ze wzorcem.
    - W ten sam sposób postępujemy ze wszystkimi wzorcami i jako rozpoznany wybieramy ten o największym współczynniku korelacji.
    - Jeżeli współczynnik korelacji będzie miał niską wartość, powiedzmy<0.6 (aczkolwiek nie wiem, czy to dobry przykład, trzeba by określić eksperymentalnie), to komendę kalsyfikujemy jako nieznaną i odrzucamy.

    Gdybyśmy spróbowali rozciągnąć lub skrócić dopiero co pobraną próbkę (przed transformatą fouriera), to w efekcie zmieni się także zarejestrowana częstotliwość i otrzymamy błędne wyniki porównania (większość zostanie odrzucona). Wykonując normalizację długości po transformacie Fouriera wszystkie częstotliwości mamy zachowane.

    W sumie, to normalizacja długości pożera dość sporo mocy obliczeniowej, a jej zastosowanie ogranicza się w zasadzie do możliwości wydawania poleceń na ciężkim kacu :D W praktyce niewielkie różnice w szybkości wypowiadanej komendy (rzędu nawet 20%) nie mają znaczącego wpływu na wynik rozpoznania, a i mówienie w tempie, w jakim zostały zarejestrowane wzorce nie powinno sprawiać większych trudności.

    0
  • #7 28 Lis 2004 18:11
    alfrednovi
    Poziom 19  

    Cześć!
    Najprostsza metoda o jakiej słyszałem to liczenie "przejść przez zero".
    Nagrywamy polecenie 5-10 razy, wykrywamy początek słowa, dzielimy na 20-100ms segmenty i liczymy średnią ilość przejść przez zero w danym segmencie, dobieramy zakres tolerancji (eksperymentalnie).
    Sporo roboty przy tworzeniu wzorca ale samo rozpoznawanie jest szybkie.

    Pozdrawiam!
    Alfrednovi

    0
  • Pomocny post
    #8 13 Gru 2004 18:43
    maxdutka
    Poziom 14  

    Proponuje poszukać coś o sieciach neuronowych.

    0
  • Pomocny post
    #10 01 Maj 2005 15:40
    marek_Łódź
    Poziom 36  

    maxdutka napisał:
    Proponuje poszukać coś o sieciach neuronowych.

    Sieci neuronowe są jednym z kluczowych elementów w systemach rozpoznawania mowy. Stosuje się je do identyfikacji wcześniej obrobionych (przez dsp) sygnałów, metodami, które zasygnalizowano powyżej. Po takim "przetrawieniu" parametry obiektu (widmo, przejścia przez zero itp) służą do nauczenia sieci neuronowej, która w procesie "uczenia" tworzy "uogólnienia" danego obiektu (słowa), wykorzystywane potem w procesie identyfikacji-klasyfikacji.

    Polecam materiały firmy Statsoft do programu Statistica-Sieci Neuronowe (było dostępne w księgarniach Elektronika) i podręczniki prof Tadeusiewicza.

    0
  • #11 13 Maj 2006 19:16
    LeszekGajecki
    Poziom 1  

    Dla zainteresowanych polecam ogólnie zagadnienie rozpoznawania mowy z uzyciem dużego słownika wyrazów (Speech Recognition with Large Vocabulary). Stosuje sie tu ukryte modele Markowa -HMM, choć były też prace z pogranicza sieci neuronowych i Modeli Markowskich. Dobrym materiałem (z HMM) może być np. praca doktorska dr Duchateau http://www.esat.kuleuven.be/psi/spraak/cgi-bin/get_file.cgi?/duchato/phd/phd2.ps ( ESAT-PSI SPEECH Group -KU Leuven ) . Są też inne materiały, słyszałem np. o takim : X. Huang, A. Acero and H.-W. Hon "Spoken Language Processing", Prentice Hall 2001. Albo skorzystać z dostępu do czasopism zagranicznych -często on-line bibliotek uczelnianych. Ogólnie dużo się dzieje w tej dziedzinie

    0