opis problemu
Chcę używać rozpoznawania głosu jako części projektu sprzętowego, który chciałbym być całkowicie samowystarczalny (używam małych urządzeń o niskiej mocy i niskiej prędkości, takich jak Arduino i Raspberry Pi, Kinects itp., Nie działający tradycyjny komputer z system operacyjny jest zaangażowany, więc projekt zamknięty / samowystarczalny).
Rozpoznawanie głosu może być bardzo skomplikowane w zależności od wymaganego poziomu zaawansowania. Mam, jak sądzę, stosunkowo prosty zestaw wymagań. Chcę tylko rozpoznać własny głos i mam mały słownik zawierający około 20 słów, które chciałbym rozpoznać. Dlatego nie wymagam skomplikowanych bibliotek rozpoznawania mowy i tekstu ani żadnego z doskonałych programów innych firm, które znajduję za pośrednictwem wyszukiwarek internetowych (nie brakuje ich!). Uważam, że moje wymagania są „na tyle proste” (w granicach rozsądku), że mogę napisać własne rozwiązanie. Zastanawiam się, czy ktoś napisał taki proces w ten sposób i czy moja metoda ma poważne wady? Czy istnieje lepszy sposób, aby to zrobić bez konieczności posiadania wysokiego poziomu matematyki lub konieczności pisania złożonego algorytmu? Oto rozwiązanie, które próbowałem wymyślić poniżej.
Opis rozwiązania
Będę pisać w C, ale chcę omówić proces agnostyczny języka, skupiając się na samym procesie. Więc zignorujmy to, jeśli możemy.
1. Zapamiętam wstępnie mój słownik słów, aby pasował do tych, które są wypowiadane. Możemy sobie wyobrazić, że mam 20 nagrań z 20 różnych słów, a może krótkie frazy lub zdania dwóch lub trzech słów. Uważam, że dzięki temu proces porównywania dwóch nagranych plików jest łatwiejszy niż faktyczna konwersja audio na tekst i porównywanie dwóch ciągów.
2) Mikrofon jest podłączony do mojego urządzenia sprzętowego obsługującego mój kod. [1] Kod stale pobiera próbki o stałej długości, na przykład 10 ms długości, i przechowuje na przykład 10 kolejnych próbek, w stylu rejestrowania cyklicznego. [2] (Wymyślam te liczby z góry mojej głowy, więc są to tylko przykłady opisujące ten proces).
[1] Prawdopodobnie byłoby to połączone przez filtr pasmowoprzepustowy i wzmacniacz operacyjny, podobnie jak w przypadku nagrań słownikowych, aby zminimalizować przechowywane i zebrane próbki audio.
[2] Nie jestem pewien, jak dokładnie wezmę próbkę, muszę jednak opracować metodę, jeśli stworzę liczbę liczbową (liczba całkowita / liczba zmiennoprzecinkowa / podwójna), która reprezentuje dźwięk próbki 10 ms (być może wartość CRC lub suma MD5 itp. próbki dźwięku) lub strumień liczb (być może strumień odczytów częstotliwości). Ostatecznie „próbka” będzie liczbą lub liczbami liczbowymi. Ta część będzie wymagała znacznie większego sprzętu, więc nie do dyskusji tutaj.
3) Kod sprawdza, czy jest przechowywanych 10 kolejnych próbek i szuka wzrostu głośności, aby wskazać wypowiedziane słowo lub frazę (przerwa od ciszy), a następnie zwiększa się, gdy kolejne próbki są zbierane, na przykład 500 próbek. Oznaczałoby to, że przechwytuje 5 sekund dźwięku w próbkach 10 ms.
To są te próbki lub „wycinki”, które są porównywane między dźwiękiem przechowywanym a dźwiękiem przechwyconym. Jeśli wystarczająco wysoki odsetek przechwyconych próbek pasuje do przechowywanych równoważnych, kod przyjmuje to samo słowo.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4 Gdy kod zgromadzi pełny strumień próbek, następnie odcina próbki puste na początku, aby wygenerować następujące nagranie audio. Może również przesunąć zestaw próbek do tyłu i do przodu o kilka miejsc, aby lepiej dopasować do przechowywanej próbki.
To daje przykładowy zestaw jak poniżej:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5 Uważam, że posiadając wartość procentową określającą, jak blisko musi być każda próbka, próbka 7 różni się wartością 1, która jest mniejsza niż% 1, oraz wartością procentową dla całkowitej liczby próbek, która musi mieścić się w procentach odpowiadających próbce , kod ma łatwo dostrojony poziom dokładności.
Nigdy wcześniej nie robiłem czegoś takiego z dźwiękiem, może to być dużo pracy. Dlatego zadaję to pytanie, jeśli być może znasz już odpowiedź na to pytanie, aby była oczywista (jakakolwiek może być ta odpowiedź). Mam nadzieję, że nie będzie to trudne obliczeniowo zadanie, ponieważ sprzęt, którego będę używał, będzie działał z małą sekundą. W setkach Megaherców (być może 1 Ghz za pomocą przetaktowanego Rasp Pi). Jest to więc dość prymitywny sposób dopasowania próbek audio przy użyciu niższej mocy obliczeniowej. Nie dążę do natychmiastowych rezultatów, ale mniej niż 30 sekund na przyzwoity dowód koncepcji.
PS Nie mam przedstawiciela, który oznaczyłby to nowym tagiem, takim jak „audio”, „rozpoznawanie dźwięku”, „głos”, „rozpoznawanie głosu” itp.