Ultrarapidă serverele de recunoaștere vocală, fără un exemplu real
În acest articol, voi spune și cum să fixați în mod corespunzător și rapid motor rus de recunoaștere a vorbirii la Pocketsphinx (pentru iOS) OpenEars de port pe exemplu real Hello World, de control electrocasnice arată.
De ce electrocasnice? Pentru că datorită acestui exemplu, se poate estima viteza și precizia. care poate fi realizat cu ajutorul recunoașterii vocale în întregime locale fără a Google de tip server de ASR sau Yandex SpeechKit.
Pe hârtie, eu fac, de asemenea, programul meu sursă și ansamblul în sine sub Android.
De ce dintr-o dată?
De ce avem nevoie de nimic altceva, cu excepția Yandex și Google?
Deoarece „aplicarea practică“ foarte am ales tema de control vocal acasă inteligente.
De ce acest exemplu? Deoarece este posibil pentru a vedea câteva beneficii ale recunoașterii vorbirii complet locale înainte de a Recognition utilizând soluții cloud. Și anume:
- Viteza - nu suntem dependenți de servere și, prin urmare, nu sunt dependente de disponibilitatea acestora, de lățime de bandă, etc. factor
- Precizia - motorul nostru funcționează numai cu dicționarul pe care sunteți interesat în cererea noastră, sporind astfel calitatea recunoașterii
- Costul - nu trebuie să plătească pentru fiecare cerere către server
- Activarea vocală - ca un bonus la primul punct - putem întotdeauna „asculta eter“, fără a cheltui de trafic și de serverul de încărcare
Doar specifică faptul că aceste beneficii pot fi luate în considerare numai pentru beneficiile unei anumite categorii de proiecte. în cazul în care știm exact dinainte. unele de vocabular și gramatică, care vor fi operate de către utilizator. Adică, atunci când nu trebuie să recunoască orice text (de exemplu, un mesaj SMS sau interogare de căutare). În caz contrar, nu se poate face fără detectarea nor.
Deoarece Android este capabil să recunoască vorbirea fără Internet!
Da, da ... Doar JellyBean. Și doar o jumătate de metru, nu mai mult. Și această recunoaștere - aceasta este aceeași dictarea, doar cu un model mult mai mic. Deci, gestiona și personaliza, de asemenea, noi nu putem. Și ne va da înapoi data viitoare - este necunoscut. Deși SMS-ok la momentul!
Ce facem?
Microfonul va fi activat sau voce, sau făcând clic pe pictograma microfon, sau chiar pune doar o mână pe ecran. Ecranul, la rândul său poate fi complet oprit.
Pentru această greutate aplicații practice
Ce este Pocketsphinx
Vom fi în măsură să „hrănească“ modelul de limbă rusă de recunoaștere a motorului (o puteți găsi în codul sursă) și gramatica de interogări de utilizator. Acest lucru este exact ceea ce va recunoaște cererea noastră. Nimic altceva nu va recunoaște. În consecință, aproape niciodată nu va da ceva, care nu ne așteptăm.
Formatul gramatica JSGF este folosit Pocketsphinx, precum și multe alte proiecte similare. Poate fi suficient de flexibil pentru a descrie variațiile de fraze care va pronunță utilizatorul. În cazul nostru, gramatica va fi construit din numele dispozitivului care se află în rețeaua noastră, ca aceasta:
Pocketsphinx poate lucra, de asemenea pe modelul limbaj statistic, care vă permite să recunoască vorbirea spontană, nu descrie gramatica de context. Dar pur și simplu nu este necesar pentru problema noastră. gramatica noastră ar conține numai numele de dispozitive. După ce procesul de recunoaștere Pocketsphinx ne întoarce la linia obișnuită de text în cazul în care dispozitivul va merge unul câte unul.
Semnul plus indică faptul că utilizatorul apelat poate nu unul, ci mai multe dispozitive în succesiune.
Aplicația primește lista de dispozitive de la controler inteligent acasă (a se vedea mai jos), și generează o clasă de gramatică gramatica.
transcrieri
Gramatica descrie ceea ce se poate vorbi un utilizator. Pentru a Pocketsphinx ști cum se va vorbi, este necesar ca fiecare cuvânt de gramatica pentru a scrie, așa cum apare în modelul de limbă corespunzătoare. Aceasta este transcrierea fiecărui cuvânt. Aceasta se numește un dicționar.
Transcrierea sunt descrise folosind sintaxă specială. De exemplu:
În principiu, nimic complicat. Dublu vocală transcriere se referă la accentul. Dubla consoană - moale consoană urmată de o vocală. Toate combinațiile posibile de sunete pentru toate limba română pot fi găsite în cea mai mare parte a modelului de limbă.
Este clar că nu putem descrie toate pre-transcrierea în cererea noastră pentru că noi nu știm dinainte numele celor care dau dispozitivele lor de utilizator. Prin urmare, vom genenrirovat „din zbor“, astfel transcripția prin anumite reguli de fonetică rusești. Pentru a face acest lucru, puteți implementa o clasă care este PhonMapper. care poate primi de intrare a liniei și de a genera transcrierea corectă pentru ea.
activare vocală
Acest motor de recunoaștere a vorbirii tot timpul „pentru a asculta de a difuza“ pentru a răspunde la o frază predeterminată (sau fraze). În acest caz, toate celelalte sunete, și va fi aruncat. Acest lucru nu este aceeași cu cea descrisă gramatica și doar porniți microfonul. Dă-aici o teorie a acestei probleme și mecanicii de modul în care funcționează, nu o voi face. Cu excepția a spune doar că recent programatorii care lucrează la PocketSphinx, pus în aplicare această funcție, iar acum este disponibil „din cutie“ în API-ul.
Un lucru demn de menționat este obligatorie. Pentru fraza de activare nu trebuie să specifice numai transcrierea, dar, de asemenea, pentru a selecta pragul de valoare corespunzătoare. Prea scăzută va conduce la mai multe rezultate fals pozitive (atunci când nu vorbești fraza de activare, sistemul îl recunoaște). O prea mare - la imunitate. Prin urmare, această setare este de o importanță deosebită. O gamă exemplară de valori - de la 1e-1e-1 până la 40, în funcție de fraza de activare.
Activarea senzorului de proximitate
Această problemă este specifică proiectul nostru și să recunoască în mod direct irelevante. Codul poate fi văzut în mod direct în activitatea de bază.
Se pune în aplicare SensorEventListener și la momentul aproximarea (valoarea senzorului este mai mică decât valoarea maximă) include un cronometru, de verificare după o anumită întârziere, fie blocate în continuare senzor. Acest lucru se face pentru a evita rezultate fals pozitive.
În cazul în care senzorul nu este blocat din nou, ne oprim recunoașterea, primirea rezultat (a se vedea descrierea de mai jos).
rula Recunoașterea
Pocketsphinx oferă un API convenabil pentru a configura și a începe procesul de recunoaștere. Această clasă SppechRecognizer și SpeechRecognizerSetup.
Aici este configurația și recunoașterea start-up:
Aici, copiați mai întâi toate fișierele necesare de pe disc (Pocketpshinx necesită spațiu pe disc acustic model de gramatică și vocabular cu transcrieri). Apoi se configurează motorul de recunoaștere. Specificați calea către modelul de fișiere și vocabularul, precum și unele dintre parametrii (prag de sensibilitate pentru fraza de activare). În continuare, calea de fișier este configurat cu gramatica, precum și fraza de activare.
După cum puteți vedea din acest cod, un motor este configurat o dată pentru gramatica, și să recunoască fraza de activare. De ce face asta? Pentru a ne permite pentru a comuta rapid între faptul că la momentul în care trebuie să recunoască. Aici este începutul procesului de recunoaștere fraza de activare:
Și acest lucru este - discurs raspozanvanie dat gramatica:
Al doilea argument (opțional) - numărul de milisecunde după care recunoașterea va fi reziliat în mod automat în cazul în care nimeni nu spune nimic.
După cum puteți vedea, puteți folosi doar un singur motor pentru a rezolva ambele probleme.
Cum se obține rezultatul recunoașterii
Pentru a obține rezultatul de recunoaștere, trebuie să specificați, de asemenea, un ascultător eveniment, punerea în aplicare a RecognitionListener interfață.
Ea are mai multe metode, care sunt numite pocketsphinx-ohm atunci când unul dintre evenimentele:
- onBeginningOfSpeech - motor a auzit un zgomot, poate (sau poate nu) este
- onEndOfSpeech - sunet sa încheiat
- onPartialResult - au rezultate intermediare de recunoaștere. Pentru activare fraza asta înseamnă că a funcționat. Argumentul Ipoteză conține informații despre recunoașterea (line și scor)
- onResult - rezultatul recunoașterii finale. Această metodă va fi numit după un apel la metoda de oprire în SpeechRecognizer. Argumentul Ipoteză conține informații despre recunoașterea (line și scor)
Realizând un fel sau alte metode onPartialResult și onResult, puteți schimba logica de recunoaștere și pentru a obține rezultatul final. Iată cum se face în cazul aplicației noastre:
Când vom ajunge onEndOfSpeech evenimentului, iar dacă în același timp, recunoaștem comanda de a executa, este necesar să se oprească recunoașterea, după care va imediat chemat onResult.
În onResult nevoie pentru a verifica ceea ce tocmai a fost recunoscut. Dacă o echipă, trebuie să-l rulați în performanța motorului și porniți recunoașterea frazelor de activare.
În onPartialResult suntem interesați doar în semn de recunoaștere a frazelor de activare. Dacă vom găsi, apoi executați imediat procesul de recunoaștere a comenzii. Iată cum arată:
Aici vom juca primul semnal mic pentru a alerta utilizatorul că suntem gata să audă și echipa sa. În acest moment al microfonului ar trebui să fie oprit. Prin urmare, vom rula de detectare, după un interval de timp scurt (puțin mai mult decât durata semnalului, astfel încât să nu-l auzi ecou). De asemenea, se execută un flux care oprește recunoașterea forțată, în cazul în care un utilizator vorbește prea mult timp. În acest caz, este de 3 secunde.
Cum de a transforma șirul recunoscut în comanda
Ei bine, aici totul este specific pentru o anumită aplicație. În cazul exemplului gol, pur și simplu scoate de nume de dispozitiv de linie, îl caută dispozitivul dorit și fie schimbați starea utilizând o solicitare HTTP la domiciliu inteligent controler, fie pentru a anunța starea sa actuală (la fel ca în cazul termostatului). Această logică poate fi văzut în controlerul de clasă.
Cum de a sintetiza vorbire
Sinteza vorbire - este operația inversă a recunoașterii. Aici, dimpotrivă - este necesar pentru a converti un șir de text în vorbire sale utilizator auzit.
În cazul termostatului, trebuie să facem dispozitivul nostru Android pentru a spune temperatura curentă. Cu TextToSpeech API este destul de ușor (datorită Google pentru TTS femei frumoase pentru limba română):
Voi spune, probabil, banal, dar este necesar să dezactivați recunoașterea procesului de sinteză, înainte. Pe unele dispozitive (de exemplu, toate Samsung) nu nevozsozhno simultan asculta un microfon și ceva pentru a sintetiza.
Sfârșitul sintezei vorbirii (adică până la sfârșitul procesului de vorbire sintetizator de text) pot fi urmărite în ascultător:
În ea, pur și simplu, vom verifica dacă există ceva în coada de așteptare pentru sinteza, și includ fraza de activare raspozanvanie, dacă nimic altceva.
Asta-i tot?
Da! După cum puteți vedea, rapid și identifica cu exactitate direct pe dispozitiv este într-o clipă, datorită prezenței unor astfel de proiecte mari precum Pocketsphinx. Acesta oferă un API foarte user-friendly, care poate fi utilizat în rezolvarea problemelor asociate cu recunoașterea comenzilor vocale.
În acest exemplu, ne-am strâns la problema kokrentnoy recunoașterea deplină - controlul vocal al dispozitivelor inteligente de origine. Datorită recunoașterii locale, am atins o viteză foarte mare și pentru a minimiza erorile.
Este clar că același cod poate fi utilizat pentru alte sarcini legate de voce. Nu trebuie să fie casa inteligentă.
Toate sursele, precum și ansamblul de aplicare foarte pot fi găsite în depozitul de pe GitHub.
De asemenea, pe canalul meu YouTube, puteți vedea unele dintre celelalte implementări de control vocal, și nu doar sisteme pentru case inteligente.