Rozpoznávanie reči pomocou desktopových aplikácií .NET. Ultrarýchle rozpoznávanie reči bez serverov pomocou skutočného príkladu Offline rozpoznávanie reči v systéme Android 6.0

) pomocou skutočného príkladu ovládania domácich spotrebičov Hello World.
Prečo domáce spotrebiče? Áno, pretože vďaka takémuto príkladu to viete oceniť rýchlosť a presnosťčo možno dosiahnuť použitím úplne lokálne rozpoznávanie reči bez serverov Google ASR alebo Yandex SpeechKit.
K článku pripájam aj celý zdrojový kód programu a samotnú montáž pre Android.

Prečo zrazu?

Keď som na to nedávno narazil, spýtal som sa autora, prečo chce pre svoj program použiť rozpoznávanie reči na serveri (podľa môjho názoru to bolo zbytočné a viedlo to k určitým problémom). Na tento účel by som mohol podrobnejšie opísať použitie alternatívnych metód pre projekty, kde nie je potrebné nič rozpoznávať a slovník pozostáva z konečnej množiny slov. A to aj s ukážkou praktickej aplikácie...

Prečo potrebujeme niečo iné okrem Yandex a Google?

Pre túto veľmi „praktickú aplikáciu“ som si vybral tému hlasové ovládanie pre inteligentnú domácnosť.
Prečo práve tento príklad? Pretože ukazuje niekoľko výhod úplne lokálneho rozpoznávania reči oproti rozpoznávaniu pomocou cloudových riešení. menovite:
  • Rýchlosť- nie sme závislí od serverov, a preto nezávisíme od ich dostupnosti, šírky pásma atď. faktory
  • Presnosť- náš engine pracuje iba so slovníkom, ktorý zaujíma našu aplikáciu, čím sa zvyšuje kvalita rozpoznávania
  • cena- nemusíme platiť za každú požiadavku na server
  • Hlasová aktivácia- ako ďalší bonus k prvým bodom - môžeme neustále „počúvať vysielanie“ bez plytvania návštevnosťou a bez načítania serverov

Poznámka

Dovoľte mi hneď urobiť výhradu, že tieto výhody možno považovať za výhody len pre určitú triedu projektov, Kde sme vieme s istotou vopred, akým slovníkom a akou gramatikou bude používateľ pracovať. Teda vtedy, keď nepotrebujeme rozpoznať ľubovoľný text (napríklad SMS správu alebo vyhľadávací dopyt). V opačnom prípade je rozpoznávanie cloudu nevyhnutné.

Android teda dokáže rozpoznať reč bez internetu!
Áno, áno... Len na JellyBean. A to len z pol metra, nie viac. A toto uznanie je rovnaký diktát, len s použitím oveľa menšieho modelu. Nemôžeme ho teda spravovať ani konfigurovať. A čo nám vráti nabudúce, nevedno. Hoci akurát na SMS!

Čo urobíme?

Implementujeme hlasové diaľkové ovládanie pre domáce spotrebiče, ktoré bude fungovať presne a rýchlo, z niekoľkých metrov a dokonca aj na lacných, mizerných, veľmi lacných Android smartfónoch, tabletoch a hodinkách.
Logika bude jednoduchá, ale veľmi praktická. Aktivujeme mikrofón a vyslovíme jeden alebo viac názvov zariadení. Aplikácia ich rozpozná a zapína a vypína v závislosti od aktuálneho stavu. Alebo od nich dostane majetok a vysloví ho príjemným ženským hlasom. Napríklad aktuálna teplota v miestnosti.

Praktických aplikácií je veľa

Ráno ste bez toho, aby ste otvorili oči, buchli dlaňou na obrazovku smartfónu na nočnom stolíku a zavelili ste „Dobré ráno!“ - spustí sa scenár, zapne sa kávovar a hučí, hrá príjemná hudba, roztiahnu sa závesy.
Zavesme si lacný (2 tisíc, nie viac) smartfón na stenu v každej izbe. Po práci ideme domov a do prázdna zavelíme „Smart Home! Svetlá, TV! - Nemyslím si, že je potrebné hovoriť, čo bude ďalej.

Prepisy



Gramatika popisuje čo čo môže používateľ povedať. Aby Pocketsphinx vedela, Ako vysloví, je potrebné ku každému slovu z gramatiky napísať, ako znie v príslušnom jazykovom modeli. Teda prepis každé slovo. To sa nazýva slovník.

Prepisy sú opísané pomocou špeciálnej syntaxe. Napríklad:
chytrý uu m n ay j dom d oo m

V zásade nič zložité. Dvojhláska v prepise označuje stres. Obojstranná spoluhláska je mäkká spoluhláska, po ktorej nasleduje samohláska. Všetky možné kombinácie pre všetky zvuky ruského jazyka.

Je jasné, že nemôžeme vopred opísať všetky prepisy v našej aplikácii, pretože vopred nepoznáme mená, ktoré používateľ svojim zariadeniam dá. Preto takéto prepisy vygenerujeme „za behu“ podľa niektorých pravidiel ruskej fonetiky. Ak to chcete urobiť, môžete implementovať nasledujúcu triedu PhonMapper, ktorá môže prijať reťazec ako vstup a vygenerovať preň správny prepis.

Hlasová aktivácia

Ide o schopnosť nástroja na rozpoznávanie reči neustále „počúvať vysielanie“ s cieľom reagovať na vopred určenú frázu (alebo frázy). Zároveň budú vyradené všetky ostatné zvuky a reč. To nie je to isté ako opísať gramatiku a jednoducho zapnúť mikrofón. Nebudem tu uvádzať teóriu tejto úlohy a mechaniku jej fungovania. Dovoľte mi povedať, že nedávno programátori pracujúci na Pocketsphinx implementovali takúto funkciu a teraz je k dispozícii priamo v API.

Jedna vec určite stojí za zmienku. Pre aktivačnú frázu musíte nielen špecifikovať prepis, ale aj vybrať vhodný prahová hodnota citlivosti. Príliš malá hodnota povedie k mnohým falošným pozitívam (to je vtedy, keď ste nepovedali aktivačnú frázu, ale systém ju rozpozná). A príliš vysoká - na imunitu. Preto je toto nastavenie mimoriadne dôležité. Približný rozsah hodnôt - od 1e-1 do 1e-40 v závislosti od aktivačnej frázy.

Aktivácia snímača priblíženia

Táto úloha je špecifická pre náš projekt a nesúvisí priamo s uznaním. Kód je možné vidieť priamo v hlavnej činnosti.
Ona realizuje SensorEventListener a v momente priblíženia (hodnota snímača je menšia ako maximálna) zapne časovač, pričom po určitom oneskorení skontroluje, či je snímač stále zablokovaný. Toto sa robí na odstránenie falošných poplachov.
Keď sa senzor opäť nezablokuje, zastavíme rozpoznávanie a získame výsledok (pozri popis nižšie).

Začnime s rozpoznávaním

Pocketsphinx poskytuje pohodlné API na konfiguráciu a spustenie procesu rozpoznávania. Toto sú triedy SpechRecognizer A SpeechRecognizerSetup.
Takto vyzerá konfigurácia a spustenie rozpoznávania:

PhonMapper phonMapper = new PhonMapper(getAssets().open("dict/ru/hotwords")); Gramatická gramatika = new Grammar(names, phonMapper); gramatika.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); Súbor hmmDir = new File(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); Súbor jsgf = nový Súbor(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, gramatika.getJsgf()); saveFile(dikt, gramatika.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, kľúčové slovo); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Tu najprv skopírujeme všetky potrebné súbory na disk (Pocketpshinx vyžaduje, aby bol na disku akustický model, gramatika a slovník s prepismi). Potom sa nakonfiguruje samotný rozpoznávací mechanizmus. Sú uvedené cesty k súborom modelu a slovníka, ako aj niektoré parametre (prah citlivosti pre aktivačnú frázu). Ďalej sa nakonfiguruje cesta k súboru s gramatikou, ako aj aktivačná fráza.

Ako môžete vidieť z tohto kódu, jeden nástroj je nakonfigurovaný na rozpoznávanie gramatiky aj aktivačnej frázy. Prečo sa to robí? Aby sme mohli rýchlo prepínať medzi tým, čo aktuálne potrebujeme rozpoznať. Takto vyzerá spustenie procesu rozpoznávania aktivačnej frázy:

MRecognizer.startListening(KWS_SEARCH);
A takto sa rozpoznáva reč podľa danej gramatiky:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Druhý argument (voliteľný) je počet milisekúnd, po ktorých sa rozpoznávanie automaticky ukončí, ak nikto nič nepovie.
Ako vidíte, na vyriešenie oboch problémov môžete použiť iba jeden motor.

Ako získať výsledok rozpoznávania

Ak chcete získať výsledok rozpoznávania, musíte zadať aj prijímač udalostí, ktorý implementuje rozhranie RecognitionListener.
Má niekoľko metód, ktoré volá pocketsphinx, keď nastane jedna z udalostí:
  • onBeginningOfSpeech- motor počul nejaký zvuk, možno to bola reč (alebo možno nie)
  • onEndOfSpeech- zvuk končí
  • onPartialResult- existujú medzivýsledky rozpoznávania. Pre aktivačnú frázu to znamená, že to fungovalo. Argumentovať Hypotéza
  • onResult- konečný výsledok uznania. Táto metóda sa zavolá po jej zavolaní zastaviť pri SpeechRecognizer. Argumentovať Hypotéza obsahuje rozpoznávacie údaje (reťazec a skóre)

Implementáciou metód onPartialResult a onResult jedným alebo druhým spôsobom môžete zmeniť logiku rozpoznávania a získať konečný výsledok. V prípade našej aplikácie sa to robí takto:

@Override public void onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @Override public void onPartialResult(Hypothesis hypothesis) ( if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) else ( Log.d(TAG, text); ) ) @Override public void onResult(hypothesis hypothesis) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); Text reťazca = hypotéza != null ? (hypotéza.getHypnustrll) , "onResult " + text); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( if (text != null) ( Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); process(text ); ) mRecognizer.startListening(KWS_SEARCH); ) )

Keď prijmeme udalosť onEndOfSpeech a zároveň rozpoznáme príkaz, ktorý sa má vykonať, musíme zastaviť rozpoznávanie, po čom sa okamžite zavolá onResult.
V onResult musíte skontrolovať, čo bolo práve rozpoznané. Ak ide o príkaz, musíte ho spustiť na vykonanie a prepnúť motor, aby rozpoznal aktivačnú frázu.
V onPartialResult nás zaujíma iba rozpoznanie aktivačnej frázy. Ak ho zistíme, okamžite spustíme proces rozpoznávania príkazov. Vyzerá to takto:

Súkromné ​​synchronizované void startRecognition() ( if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) návrat; mRecognizer.cancel(); nový ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME.start.MAXTonenerG. TONE_CDMA_PIP, 200); post(400, nové Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000); Log.distening príkazy"); post(4000, mStopRecognitionCallback); ) )); )
Tu najprv zahráme malý signál, ktorým upozorníme používateľa, že sme ho počuli a sme pripravení na jeho príkaz. Počas tejto doby by mal byť mikrofón vypnutý. Preto rozpoznávanie spustíme po krátkom timeoute (trochu dlhšom ako je trvanie signálu, aby sme nepočuli jeho ozvenu). Spustí tiež vlákno, ktoré násilne zastaví rozpoznávanie, ak používateľ hovorí príliš dlho. V tomto prípade sú to 3 sekundy.

Ako zmeniť rozpoznaný reťazec na príkazy

Všetko je tu špecifické pre konkrétnu aplikáciu. V prípade nahého príkladu jednoducho vytiahneme z riadku názvy zariadení, vyhľadáme požadované zariadenie a buď zmeníme jeho stav pomocou HTTP požiadavky na ovládač inteligentnej domácnosti, alebo nahlásime jeho aktuálny stav (ako napr. termostat). Túto logiku možno vidieť v triede Controller.

Ako syntetizovať reč

Syntéza reči je inverzná operácia rozpoznávania. Tu je to naopak – musíte previesť riadok textu na reč, aby ho používateľ počul.
V prípade termostatu musíme prinútiť naše zariadenie Android hovoriť o aktuálnej teplote. Pomocou API Prevod textu na reč je to celkom jednoduché (vďaka Googlu za úžasné ženské TTS pre ruský jazyk):

Súkromné ​​void speak(String text) ( synchronizované (mSpeechQueue) ( ​​​​​mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = nová HashMap (2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "pravda"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, parametre); ))

Asi poviem niečo banálne, ale pred procesom syntézy je potrebné deaktivovať rozpoznávanie. Na niektorých zariadeniach (napríklad na všetkých zariadeniach Samsung) je vo všeobecnosti nemožné počúvať mikrofón a zároveň niečo syntetizovať.
Koniec syntézy reči (to znamená koniec procesu hovoreného textu syntetizátorom) možno sledovať v poslucháčovi:

Súkromné ​​finále TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) ( synchronizované (mSpeechQueue) (Empech.m.) (Empech.mpeech(Su) mRecognizer.startListening( KWS_SEARCH); ) ) ) );

V ňom jednoducho skontrolujeme, či sa vo fronte syntézy nenachádza niečo iné, a povolíme rozpoznávanie aktivačnej frázy, ak tam nie je nič iné.

A to je všetko?

Áno! Ako vidíte, rýchle a efektívne rozpoznanie reči priamo na zariadení nie je vôbec ťažké, vďaka prítomnosti takých úžasných projektov, ako je Pocketsphinx. Poskytuje veľmi pohodlné API, ktoré možno použiť pri riešení problémov súvisiacich s rozpoznávaním hlasových príkazov.

V tomto príklade sme pripojili uznanie k úplne špecifickej úlohe - hlasové ovládanie zariadení inteligentnej domácnosti. Vďaka lokálnemu rozpoznaniu sme dosiahli veľmi vysokú rýchlosť a minimalizovali chyby.
Je jasné, že rovnaký kód možno použiť aj pre iné úlohy súvisiace s hlasom. Nemusí to byť inteligentná domácnosť.

  • hlasové ovládanie
  • hlasový motor
  • Pridať značky

    Žiadny program nemôže úplne nahradiť manuálnu prácu pri prepisovaní nahratej reči. Existujú však riešenia, ktoré dokážu výrazne urýchliť a uľahčiť preklad reči do textu, teda zjednodušiť prepis.

    Prepis je záznam zvukového alebo video súboru v textovej forme. Na internete existujú platené platené úlohy, kedy je interpretovi za prepis textu zaplatená určitá suma.

    Užitočný je preklad reči do textu

    • študentov prekladať nahraté audio alebo video prednášky do textu,
    • blogeri prevádzkujúci webové stránky a blogy,
    • spisovatelia, novinári na písanie kníh a textov,
    • informační podnikatelia, ktorí potrebujú text po svojom webinári, prejave atď.,
    • ľudia, ktorí majú problémy s písaním – môžu nadiktovať list a poslať ho rodine alebo priateľom,
    • iné možnosti.

    Popíšeme najefektívnejšie nástroje dostupné na PC, mobilných aplikáciách a online službách.

    1 Webová stránka speechpad.ru

    Ide o online službu, ktorá vám umožňuje prekladať reč do textu pomocou prehliadača Google Chrome. Služba funguje s mikrofónom a hotovými súbormi. Samozrejme, kvalita bude oveľa vyššia, ak použijete externý mikrofón a budete si diktovať sami. Služba však odvádza dobrú prácu aj pri videách na YouTube.

    Kliknite na „Povoliť nahrávanie“, odpovedzte na otázku „Používanie mikrofónu“ – kliknite na „Povoliť“.

    Dlhé pokyny o používaní služby je možné zbaliť kliknutím na tlačidlo 1 na obr. 3. Inzercie sa môžete zbaviť vyplnením jednoduchej registrácie.

    Ryža. 3. Služba rečového bloku

    Hotový výsledok sa dá ľahko upraviť. Ak to chcete urobiť, musíte buď manuálne opraviť zvýraznené slovo, alebo ho znova nadiktovať. Výsledky práce sa ukladajú na váš osobný účet, dajú sa stiahnuť aj do počítača.

    Zoznam video lekcií o práci s rečovým blokom:

    Videá môžete prepisovať z Youtube alebo z počítača, budete však potrebovať mixér, ďalšie podrobnosti:

    Video "prepis zvuku"

    Služba funguje v siedmich jazykoch. Je tu malé mínus. Spočíva v tom, že ak potrebujete prepísať hotový zvukový súbor, jeho zvuk je počuť cez reproduktory, čo vytvára ďalšie rušenie vo forme ozveny.

    2 Servisný diktát.io

    Skvelá online služba, ktorá vám umožní preložiť reč do textu zadarmo a jednoducho.

    Ryža. 4. Diktát služby.io

    1 na obr. 4 – Ruský jazyk je možné zvoliť na konci stránky. V prehliadači Google Chrome je jazyk vybratý, ale z nejakého dôvodu v Mozille takáto možnosť neexistuje.

    Je pozoruhodné, že bola implementovaná možnosť automatického uloženia hotového výsledku. Predídete tak náhodnému vymazaniu v dôsledku zatvorenia karty alebo prehliadača. Táto služba nerozpoznáva hotové súbory. Pracuje s mikrofónom. Pri diktovaní je potrebné pomenovať interpunkčné znamienka.

    Text je rozpoznaný celkom správne, nie sú v ňom žiadne pravopisné chyby. Interpunkčné znamienka môžete vkladať sami z klávesnice. Hotový výsledok je možné uložiť do počítača.

    3 RealSpeaker

    Tento program vám umožňuje jednoducho preložiť ľudskú reč do textu. Je navrhnutý tak, aby fungoval na rôznych systémoch: Windows, Android, Linux, Mac. S jeho pomocou môžete previesť reč počutú do mikrofónu (môže byť napríklad zabudovaná do prenosného počítača), ako aj nahranú do zvukových súborov.

    Rozumie 13 svetovým jazykom. K dispozícii je beta verzia programu, ktorá funguje ako online služba:

    Musíte prejsť na vyššie uvedený odkaz, vybrať ruský jazyk, nahrať svoj zvukový alebo video súbor do online služby a zaplatiť za jeho prepis. Po prepise môžete výsledný text skopírovať. Čím väčší je súbor na prepis, tým viac času zaberie jeho spracovanie, ďalšie podrobnosti:

    V roku 2017 existovala bezplatná možnosť prepisu pomocou RealSpeaker, ale v roku 2018 takáto možnosť neexistuje. Je veľmi mätúce, že prepísaný súbor je k dispozícii všetkým používateľom na stiahnutie; možno sa to zlepší.

    Kontakty vývojára (VKontakte, Facebook, Youtube, Twitter, e-mail, telefón) programu nájdete na stránke jeho webovej stránky (presnejšie v päte stránky):

    4 Speechlogger

    Alternatíva k predchádzajúcej aplikácii pre mobilné zariadenia so systémom Android. K dispozícii zadarmo v obchode s aplikáciami:

    Text sa upraví automaticky a pridajú sa interpunkčné znamienka. Veľmi pohodlné na diktovanie poznámok alebo vytváranie zoznamov. Vo výsledku bude text veľmi slušnej kvality.

    5 Dračí diktát

    Ide o aplikáciu, ktorá je bezplatne distribuovaná pre mobilné zariadenia od spoločnosti Apple.

    Program môže pracovať s 15 jazykmi. Umožňuje vám upraviť výsledok a vybrať požadované slová zo zoznamu. Musíte jasne vyslovovať všetky zvuky, nerobiť zbytočné pauzy a vyhýbať sa intonácii. Niekedy sú chyby v koncovkách slov.

    Aplikáciu Dragon Dictation využívajú majitelia napríklad na diktovanie nákupného zoznamu v obchode pri pohybe po byte. Keď sa tam dostanem, môžem si pozrieť text v poznámke a nemusím počúvať.

    Bez ohľadu na program, ktorý používate vo svojej praxi, buďte pripravení skontrolovať výsledky a vykonať určité úpravy. Len tak získate bezchybný text bez chýb.

    Užitočné služby:

    Dostávajte najnovšie články o počítačovej gramotnosti priamo do vašej schránky.
    Už viac 3 000 predplatiteľov

    .

    Produkty a technológie:

    Visual Studio, C#, knižnice reči .NET

    V článku sa diskutuje:

    • pridanie podpory rozpoznávania reči do konzolovej aplikácie;
    • spracovanie rozpoznanej reči;
    • inštalácia knižníc na rozpoznávanie reči;
    • porovnanie Microsoft.Speech a System.Speech;
    • Pridanie podpory rozpoznávania reči do aplikácie Windows Forms.

    S príchodom Windows Phone Cortana, osobnej asistentky aktivovanej rečou (ako aj náprotivku z ovocinárskej spoločnosti, o ktorej sa nedá nadarmo hovoriť), sa aplikácie s podporou reči stávajú čoraz výraznejšie pri vývoji softvéru. V tomto článku vám ukážem, ako začať s rozpoznávaním a syntézou reči v aplikáciách konzoly Windows, aplikáciách Windows Forms a Windows Presentation Foundation (WPF).

    Všimnite si, že môžete tiež pridať funkcie reči do aplikácií pre Windows Phone, webových aplikácií ASP.NET, aplikácií pre Windows Store, Windows RT a Xbox Kinect, ale techniky sa líšia od techník popísaných v tomto článku.

    Dobrým spôsobom, ako získať predstavu o tom, o čom presne bude tento článok, je pozrieť sa na snímky obrazovky dvoch rôznych demo programov na ryža. 1 A 2 . Po spustení konzolovej aplikácie na ryža. 1 okamžite povie frázu „Som hore“. Samozrejme, demo aplikáciu počas čítania tohto článku nebudete počuť, takže zobrazuje text toho, čo počítač hovorí. Potom používateľ povie príkaz „Speech on“. Demo aplikácia odpovedá rozpoznaným textom a následne interne počúva a odpovedá na požiadavky na pridanie dvoch čísel.

    Ryža. 1. Rozpoznávanie a syntéza reči v konzolovej aplikácii


    Ryža. 2. Rozpoznávanie reči v aplikácii Windows Forms

    Používateľ požiadal aplikáciu, aby pridala jednotku a dve, potom dve a tri. Aplikácia rozpoznávala hovorené príkazy a dávala odpovede hlasom. Užitočnejšie spôsoby využitia rozpoznávania reči popíšem neskôr.

    Používateľ potom povedal „Speech off“, čo je hlasový príkaz, ktorý deaktivuje počúvanie príkazov na pridanie, ale úplne nezakáže rozpoznávanie reči. Po tomto slovnom príkaze bol nasledujúci príkaz na sčítanie jednotky a dvojky ignorovaný. Nakoniec používateľ opäť zapol počúvanie príkazov a vyslovil nezmyselný príkaz „Klatu barada nikto“, ktorý aplikácia rozpoznala ako príkaz na úplnú deaktiváciu rozpoznávania reči a ukončenie sa.

    Zapnuté ryža. 2 zobrazuje aplikáciu Windows Forms s povolenou fiktívnou rečou. Táto aplikácia rozpoznáva hovorené príkazy, ale nereaguje na ne hlasovým výstupom. Pri prvom spustení aplikácie nebolo začiarknuté políčko Speech On, čo znamená, že rozpoznávanie reči nebolo aktívne. Používateľ zaškrtol toto políčko a potom povedal „Ahoj“. Aplikácia reagovala zobrazením rozpoznaného textu v ovládacom prvku ListBox v spodnej časti okna.

    Používateľ potom povedal: "Nastav textové pole 1 na červené." Aplikácia rozpoznala reč a odpovedala: „Nastaviť textové pole 1 na červenú“, čo je takmer (ale nie celkom) presne to, čo používateľ povedal. Hoci na ryža. 2 Nie je to vidieť, text v ovládacom prvku TextBox v hornej časti okna je skutočne červený.

    Potom používateľ povedal: „Nastavte textové pole 1 na biele.“ Aplikácia to rozpoznala ako „nastaviť textové pole 1 biele“ a urobila to. Používateľ na záver povedal: „Dovidenia“ a aplikácia zobrazila tento text, ale neurobila nič s Windows Forms, hoci mohla napríklad zrušiť začiarknutie políčka Speech On.

    Použitie objektu syntetizátora je celkom jednoduché.

    V nasledujúcich častiach vás prevediem procesom vytvárania oboch ukážkových programov vrátane inštalácie potrebných knižníc reči .NET. Tento článok predpokladá, že máte aspoň stredne pokročilé programovacie zručnosti, ale neviete nič o rozpoznávaní a syntéze reči.

    Pridanie podpory rozpoznávania reči do konzolovej aplikácie

    Ak chcete vytvoriť ukážku zobrazenú v ryža. 1, spustil som Visual Studio a vytvoril som novú konzolovú aplikáciu C# s názvom ConsoleSpeech. Nástroje reči som úspešne používal s Visual Studio 2010 a 2012, ale každá relatívne novšia verzia by mala byť v poriadku. Po načítaní kódu šablóny do editora som premenoval súbor Program.cs v okne Solution Explorer na popisnejší ConsoleSpeechProgram.cs a Visual Studio mi premenovalo triedu Program.

    Ďalej som pridal odkaz na súbor Microsoft.Speech.dll, ktorý sa nachádza v C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly. Táto knižnica DLL v mojom počítači chýbala a musel som si ju stiahnuť. Inštalácia súborov potrebných na pridanie rozpoznávania reči a syntézy do aplikácie nie je taká triviálna. Proces inštalácie podrobne vysvetlím v ďalšej časti, ale teraz predpokladajme, že vo vašom systéme je Microsoft.Speech.dll.

    Pridaním odkazu na rečovú knižnicu DLL som odstránil všetky príkazy using z hornej časti kódu okrem toho, ktorý ukazoval na najvyšší systém názvov. Potom som pridal pomocou príkazov pre menné priestory Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis a System.Globalization. Prvé dva menné priestory sú mapované na rečovú knižnicu DLL. Všimnite si, že existujú aj menné priestory ako System.Speech.Recognition a System.Speech.Synthesis, ktoré môžu byť mätúce. Čoskoro vysvetlím rozdiel medzi nimi. Priestor názvov Globalizácia bol k dispozícii predvolene a nevyžadoval pridanie nového odkazu do projektu.

    Všetok zdrojový kód aplikácie demo konzoly je k dispozícii na adrese ryža. 3 a je k dispozícii aj v zdrojovom balíku priloženom k ​​tomuto článku. Odstránil som všetku štandardnú manipuláciu s chybami, aby som sa čo najviac vyhol zatemňovaniu hlavných myšlienok.

    Ryža. 3. Zdrojový kód aplikácie demo konzoly

    pomocou systému; pomocou Microsoft.Speech.Recognition; pomocou Microsoft.Speech.Synthesis; pomocou System.Globalization; menný priestor ConsoleSpeech ( class ConsoleSpeechProgram ( statický SpeechSynthesizer ss = nový SpeechSynthesizer(); statický SpeechRecognitionEngine sre; statický bool done = nepravda; statický bool speechOn = true; static void Main(string args) ( try ( ss.SetOuneLidioDevice.Default) ("\n(Hovorím: som hore)"); ss.Speak("Som hore"); CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; sre.Speechrecognized += sre_Speechrecognized; voľby ch_startstopcommands = Nové voľby (); ch_startstopcommands.add ("Reč je zapnutá"); ch_startstopcommands.add ("S Peech Off "); ch_startStopcommands Off "); = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = new Grammar(gb_StartStop); Choices ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_Numbers.;Ch_Numbers.Add Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Čo je"); gb_WhatIsXplusY.Append(čísla_ch); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(čísla_ch); Gramatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); while (hotovo == false) ( ; ) Console.WriteLine("\nHit< enter >zatvorte shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Hlavná statická void sre_SpeechRecognized(odosielateľ objektu, SpeechRecognizedEventArgs e ) ( string txt = e.Result.Text; float dôvera = e.Result.Confidence; Console.WriteLine("\nRozpoznané: " + txt); if (dôvera< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Reč je teraz ZAPNUTÁ"); speechOn = true; ) if (txt.IndexOf("reč je vypnutá") >= 0) ( Console.WriteLine("Reč je teraz VYPNUTÁ"); speechOn = false; ) if (speechOn == false) return; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)odosielateľ). RecognizeAsyncCancel(); done = true; Console.WriteLine("(Hovorí: Zbohom)"); ss.Speak("Zbohom"); ) if (txt.IndexOf("Čo") >= 0 && txt.IndexOf("plus") >= 0) (reťazcové slová = txt.Split(" "); int num1 = int.Parse(slová); int num2 = int.Parse(slová); int sum = num1 + num2; Console.WriteLine("(Vyslovené: " + slová + " plus " + slová + " sa rovná " + súčet + ")"); ss.SpeakAsync(slová + " plus " + slová + " rovná sa " + súčet); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Po príkazoch using sa ukážkový kód spustí takto:

    menný priestor ConsoleSpeech ( trieda ConsoleSpeechProgram ( statický SpeechSynthesizer ss = nový SpeechSynthesizer(); statický SpeechRecognitionEngine sre; statický bool done = nepravda; statický bool speechOn = true; static void Main(string args) ( ...

    Objekt SpeechSynthesizer na úrovni triedy umožňuje aplikácii syntetizovať reč. Objekt SpeechRecognitionEngine umožňuje aplikácii počúvať a rozpoznávať hovorené slová alebo frázy. Booleovská premenná done určuje, kedy sa celá aplikácia ukončí. Logická premenná speechOn riadi, či aplikácia počúva akékoľvek iné príkazy okrem príkazu na ukončenie programu.

    Ide o to, že konzolová aplikácia neakceptuje vstup z klávesnice, takže vždy počúva príkazy. Ak je však speechOn nepravda, rozpozná a vykoná sa iba príkaz na ukončenie programu; ostatné príkazy sú rozpoznané, ale ignorované.

    Hlavná metóda začína takto:

    try ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Hovorím: som hore)"); ss.Speak("Som hore");

    Inštancia objektu SpeechSynthesizer bola vytvorená, keď bol deklarovaný. Použitie objektu syntetizátora je celkom jednoduché. Metóda SetOutputToDefaultAudioDevice odosiela výstup do reproduktorov pripojených k vášmu počítaču (výstup môžete poslať aj do súboru). Metóda Speak vezme strunu a potom ju hovorí. Takto je to jednoduché.

    Rozpoznávanie reči je oveľa zložitejšie ako syntéza reči. Hlavná metóda pokračuje vytvorením objektu resolvera:

    CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized;

    Po prvé, objekt CultureInfo určuje jazyk, ktorý sa má rozpoznať, v tomto prípade americkú angličtinu. Objekt CultureInfo sa nachádza v priestore názvov Globalization, na ktorý sme odkazovali pomocou príkazu using. Potom po zavolaní konštruktora SpeechRecognitionEngine je hlasový vstup priradený predvolenému zvukovému zariadeniu – najčastejšie mikrofónu. Všimnite si, že väčšina notebookov má vstavaný mikrofón, ale stolné počítače budú vyžadovať externý mikrofón (v súčasnosti často kombinovaný so slúchadlami).

    Kľúčovou metódou pre objekt rozpoznávania je obslužná rutina udalosti SpeechRecognized. Ak pri používaní Visual Studio napíšete "sre.SpeechRecognized +=" a počkáte zlomok sekundy, IntelliSense automaticky ukončí váš výraz s názvom obsluhy udalosti - sre_SpeechRecognized. Odporúčam vám stlačením klávesu Tab prijať návrh a použiť tento názov ako predvolený.

    Choices ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // z technického hľadiska je // toto Add(new string ( "4" )); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Čo je"); gb_WhatIsXplusY.Append(čísla_ch); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(čísla_ch); Gramatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Tri hlavné objekty sú tu množina Choices, šablóna GrammarBuilder a ovládací prvok Grammar. Keď vytváram gramatiku na rozpoznávanie, začnem tým, že uvediem niekoľko konkrétnych príkladov toho, čo potrebujem rozpoznať. Povedzme: "Koľko je jedna plus dva?" a "Koľko je tri plus štyri?"

    Potom definujem zodpovedajúcu generickú šablónu, napríklad „Čo je plus ?. Šablóna je GrammarBuilder a konkrétne hodnoty, ktoré sa odovzdávajú do šablóny, sú množinou možností. Objekt Grammar zapuzdruje šablónu a možnosti.

    V demo programe obmedzím pridania na 1 až 4 a pridám ich ako reťazce do sady Choices. Efektívnejší prístup:

    čísla reťazcov = nový reťazec ("1", "2", "3", "4" ); Choices ch_Numbers = new Choices(numbers);

    Menej efektívny prístup k vytvoreniu množiny možností predstavujem z dvoch dôvodov. Po prvé, pridávanie po jednom riadku bol jediný prístup, ktorý som videl v iných príkladoch rozpoznávania reči. Po druhé, možno si myslíte, že pridávanie po jednom riadku by vôbec nemalo fungovať; Visual Studio IntelliSense v reálnom čase ukazuje, že jedno z preťažení Add akceptuje parameter typu params reťazcových fráz. Ak ste si nevšimli kľúčové slovo params, možno ste predpokladali, že metóda Add akceptuje iba polia reťazcov a nie jeden reťazec. Ale nie je to tak: prijíma oboje. Odporúčam prejsť pole.

    Vytvorenie množiny volieb zo sekvenčných čísel je trochu špeciálny prípad a umožňuje programový prístup, ako napríklad:

    čísla reťazcov = nový reťazec; pre (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    Po vytvorení možností na vyplnenie slotov GrammarBuilder demo program vytvorí GrammarBuilder a potom kontrolnú gramatiku:

    GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Čo je"); gb_WhatIsXplusY.Append(čísla_ch); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(čísla_ch); Gramatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Demo program používa podobnú šablónu na vytvorenie gramatiky pre príkazy štart a stop:

    Voľby ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("reč zapnutá"); ch_StartStopCommands.Add("reč vypnutá"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Gramatika g_StartStop = new Grammar(gb_StartStop);

    Gramatiky sa dajú definovať veľmi flexibilne. Tu sú príkazy „speech on“, „speech off“ a „klatu barada nikto“ umiestnené v jednej gramatike, keďže spolu logicky súvisia. Tieto tri príkazy je možné definovať v troch rôznych gramatikách, alebo príkazy "speech on" a "speech off" umiestniť do jednej gramatiky a príkaz "klatu barada nikto" do druhej.

    Po vytvorení všetkých objektov Gramatiky ich vložíte do nástroja na rozpoznávanie reči a rozpoznávanie reči sa aktivuje:

    sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple);

    Argument RecognizeMode.Multiple je potrebný, keď máte viac ako jednu gramatiku, čo bude prípad všetkých programov okrem tých najjednoduchších. Hlavná metóda sa vykonáva takto:

    Kým (hotovo == false) ( ; ) Console.WriteLine("\nHit< enter >zatvorte shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Hlavné

    Podivne vyzerajúca prázdna slučka while vám umožňuje ponechať spustený shell konzolovej aplikácie. Cyklus bude dokončený, keď je boolovská premenná done na úrovni triedy nastavená na hodnotu true obslužným programom udalosti rozpoznávania reči.

    Rozpoznané spracovanie reči

    Kód na spracovanie udalostí rozpoznávania reči začína takto:

    static void sre_SpeechRecognized(odosielateľ objektu, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; plávajúca spoľahlivosť = e.Result.Confidence; Console.WriteLine("\nRozpoznané: " + txt); if (dôvera< 0.60) return; ...

    Rozpoznaný text je uložený vo vlastnosti Result.Text objektu SpeechRecognizedEventArgs. Prípadne môžete použiť sadu Result.Words. Vlastnosť Result.Confidence ukladá hodnotu medzi 0,0 a 1,0, čo je hrubý odhad toho, ako dobre sa hovorený text zhoduje s ľubovoľnou gramatikou spojenou s rozpoznávačom. Demo program inštruuje obsluhu udalosti, aby ignorovala text s nízkou dôverou v rozpoznaný text.

    Hodnoty spoľahlivosti sa značne líšia v závislosti od zložitosti gramatiky, kvality mikrofónu a ďalších faktorov. Napríklad, ak demo program potrebuje rozpoznať iba čísla 1 až 4, hodnoty spoľahlivosti na mojom počítači sú zvyčajne okolo 0,75. Ak však gramatika musí rozpoznať čísla od 1 do 100, hodnoty spoľahlivosti klesnú na približne 0,25. Stručne povedané, vo všeobecnosti by ste mali experimentovať s hodnotami spoľahlivosti, aby ste dosiahli dobré výsledky rozpoznávania reči.

    if (txt.IndexOf("reč je zapnutá") >= 0) ( Console.WriteLine("Reč je teraz zapnutá"); speechOn = true; ) if (txt.IndexOf("reč je vypnutá") >= 0) ( Konzola .WriteLine("Reč je teraz VYPNUTÁ"); speechOn = false; ) if (speechOn == false) return;

    Aj keď to na prvý pohľad nemusí byť úplne zrejmé, táto logika by mala dávať zmysel, ak sa nad tým zamyslíte. Potom sa spracuje príkaz tajného ukončenia:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)odosielateľ).RecognizeAsyncCancel(); done = true; Console.WriteLine("(Hovorí: Zbohom)"); ss.Speak("Zbohom"); )

    Všimnite si, že nástroj na rozpoznávanie reči skutočne dokáže rozpoznať nezmyselné slová. Ak objekt Grammar obsahuje slová, ktoré nie sú vo vstavanom slovníku objektu, Grammar sa pokúsi identifikovať tieto slová pomocou sémantickej heuristiky, ak je to možné, a zvyčajne je celkom úspešná. Preto som použil „klatu“ namiesto správneho „klaatu“ (zo starého sci-fi filmu).

    Tiež si všimnite, že nie ste povinní spracovať celý text rozpoznaný Gramatikou (“klatu barada nikto”) – potrebujete len dostatok informácií na jednoznačnú identifikáciu gramatickej frázy (“klatu” a “barada”).

    If (txt.IndexOf("Čo") >= 0 && txt.IndexOf("plus") >= 0) ( string words = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(slová); int sum = num1 + num2; Console.WriteLine("(Vyslovené: " + slová + " plus " + slová + " sa rovná " + súčet + ")"); ss.SpeakAsync(slová + " plus " + slová + " rovná sa " + súčet); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Upozorňujeme, že text v časti Results.Text rozlišuje veľké a malé písmená ("Čo" a "Čo"). Po rozpoznaní frázy ju možno analyzovať na konkrétne slová. V tomto prípade má rozpoznaný text tvar „Čo je x plus y“, takže „Čo“ je vložené do slov a dve pridané čísla (ako reťazce) sú uložené v slovách a slovách.

    Inštalácia knižníc

    Vysvetlenie ukážkového programu predpokladá, že na vašom počítači sú nainštalované všetky potrebné knižnice reči. Ak chcete vytvoriť a spustiť ukážkové programy, musíte nainštalovať štyri balíky: SDK (poskytuje možnosť vytvárať ukážky vo Visual Studio), runtime (spúšťa ukážky po ich vytvorení) a rozpoznané a syntetizované (vyslovované) jazyky.

    Ak chcete nainštalovať súpravu SDK, vyhľadajte na internete výraz „Speech Platform 11 SDK“. Tým sa dostanete na správnu stránku v Centre sťahovania softvéru spoločnosti Microsoft ( ryža. 4). Kliknutím na tlačidlo Stiahnuť sa zobrazia možnosti zobrazené v ryža. 5. SDK sa dodáva v 32- a 64-bitovej verzii. Dôrazne odporúčam používať 32-bitovú verziu bez ohľadu na bitovú veľkosť vášho systému. 64-bitová verzia nefunguje s niektorými aplikáciami.


    Ryža. 4. Hlavná stránka inštalácie súpravy SDK v Centre sťahovania softvéru spoločnosti Microsoft


    Ryža. 5. Nainštalujte súpravu Speech SDK

    Nepotrebujete nič viac ako jeden súbor .msi pod x86 (pre 32-bitové systémy). Výberom tohto súboru a kliknutím na tlačidlo Ďalej môžete spustiť inštalačný program priamo odtiaľto. Knižnice reči neposkytujú veľa spätnej väzby o dokončení inštalácie, takže nehľadajte žiadne správy o úspechu.


    Ryža. 6. Inštalácia runtime prostredia

    Je mimoriadne dôležité vybrať rovnakú verziu platformy (11 v ukážke) a bitovú hĺbku (32 alebo 64) ako SDK. Opäť dôrazne odporúčam 32-bitovú verziu, aj keď používate 64-bitový systém.

    Potom môžete nastaviť jazyk rozpoznávania. Stránka na stiahnutie je k dispozícii na adrese ryža. 7. Demo program používa súbor MSSpeech_SR_en-us_TELE.msi (anglicky-U.S.). SR znamená rozpoznávanie reči a TELE znamená telefonovanie; to znamená, že rozpoznaný jazyk je navrhnutý tak, aby fungoval so zvukovým vstupom nízkej kvality, napríklad z telefónu alebo stolného mikrofónu.


    Ryža. 7. Nastavenie rozpoznaného jazyka

    Nakoniec môžete nastaviť jazyk a hlas pre syntézu reči. Stránka na stiahnutie je k dispozícii na adrese ryža. 8. Demo program používa súbor MSSpeech_TTS_en-us_Helen.msi. TTS (text-to-speech) je v podstate synonymom syntézy reči. Všimnite si dva dostupné hlasy angličtina, U.S. Existujú aj iné anglické hlasy, ale nie U.S. Vytváranie súborov jazyka syntézy je veľmi náročná úloha. Môžete si však zakúpiť a nainštalovať ďalšie hlasy od rôznych spoločností.


    Ryža. 8. Nastavenie jazyka hlasu a syntézy

    Je zaujímavé, že hoci jazyk rozpoznávania reči a jazyk syntézy hlasu/reči sú v skutočnosti úplne odlišné veci, oba balíky sú možnosti na tej istej stránke sťahovania. Používateľské rozhranie Download Center vám umožňuje skontrolovať jazyk rozpoznávania aj jazyk syntézy, ale pokúsiť sa ich nainštalovať súčasne bolo pre mňa katastrofou, preto ich odporúčam nainštalovať samostatne.

    Porovnanie Microsoft.Speech s System.Speech

    Ak ste nováčikom v rozpoznávaní a syntéze reči pre aplikácie Windows, môžete sa ľahko zmiasť dokumentáciou, pretože existuje viacero platforiem reči. Konkrétne, okrem knižnice Microsoft.Speech.dll, ktorú používajú ukážkové programy v tomto článku, existuje knižnica s názvom System.Speech.dll, ktorá je súčasťou operačného systému Windows. Tieto dve knižnice sú podobné v tom zmysle, že ich API sú takmer, ale nie úplne identické. Preto, ak hľadáte príklady spracovania reči na internete a vidíte skôr úryvky kódu ako kompletné programy, nie je vôbec zrejmé, či ide o príklad System.Speech alebo Microsoft.Speech.

    Ak ste novým spracovaním reči, použite knižnicu Microsoft.Speech a nie System.Speech na pridanie podpory reči do vašej aplikácie .NET.

    Aj keď obe knižnice zdieľajú spoločnú základnú kódovú základňu a podobné API, rozhodne sa líšia. Niektoré kľúčové rozdiely sú zhrnuté v tabuľky 1.

    Tabuľka 1. Hlavné rozdiely medzi Microsoft.Speech a System.Speech

    System.Speech DLL je súčasťou OS, takže je nainštalovaný na každom systéme Windows. Microsoft.Speech DLL (a súvisiace runtime a jazyky) musí byť stiahnutý a nainštalovaný v systéme. Rozpoznávanie pomocou System.Speech zvyčajne vyžaduje školenie pre konkrétneho používateľa, keď používateľ prečíta nejaký text a systém sa naučí porozumieť výslovnosti tohto používateľa. Rozpoznávanie pomocou Microsoft.Speech funguje okamžite pre každého používateľa. System.Speech dokáže rozpoznať takmer každé slovo (hovorí sa tomu voľný diktát). Microsoft.Speech rozpozná iba slová a frázy, ktoré sú v objekte Grammar definovanom v programe.

    Pridanie podpory rozpoznávania reči do aplikácie Windows Forms

    Proces pridávania podpory rozpoznávania reči a syntézy do aplikácie Windows Forms alebo WPF je podobný ako v prípade konzolovej aplikácie. Ak chcete vytvoriť ukážkový program zobrazený v ryža. 2, spustil som Visual Studio, vytvoril som novú aplikáciu C# Windows Forms a premenoval som ju na WinFormSpeech.

    Po načítaní kódu šablóny do editora som v okne Solution Explorer pridal odkaz na súbor Microsoft.Speech.dll – rovnako ako v konzolovom programe. V hornej časti zdrojového kódu som odstránil nepotrebné príkazy pomocou a ponechal som len odkazy na menné priestory System, Data, Drawing a Forms. Potom som pridal dva príkazy s použitím pre menné priestory Microsoft.Speech.Recognition a System.Globalization.

    Demo na platforme Windows Forms nepoužíva syntézu reči, preto neodpájam knižnicu Microsoft.Speech.Synthesis. Pridanie syntézy reči do aplikácie Windows Forms je rovnaké ako v konzolovej aplikácii.

    Vo Visual Studio v režime návrhu som do formulára pretiahol ovládacie prvky TextBox, CheckBox a ListBox. Dvakrát kliknite na CheckBox a Visual Studio automaticky vytvorilo kostru metódy obsluhy udalosti CheckChanged.

    Pripomeňme, že program demo konzoly okamžite začal počúvať hovorené príkazy a pokračoval v tom, kým sa neskončil. Tento prístup by sa dal použiť v aplikácii Windows Forms, ale namiesto toho som sa rozhodol umožniť používateľovi zapnúť a vypnúť rozpoznávanie reči pomocou ovládacieho prvku CheckBox (t. j. začiarkavacieho políčka).

    Zdrojový kód v súbore Form1.cs demo programu, kde je definovaná čiastočná trieda, je zobrazený na ryža. 9. Objekt mechanizmu rozpoznávania reči je deklarovaný a vytvorený ako člen formulára. V konštruktore formulára pripojím obsluhu udalosti SpeechRecognized a potom vytvorím a načítam dva objekty Grammars:

    public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1SreHramelloGramadLocadA); GrammarAsync(g_SetTextBox) ; // sre.RecognizeAsync() je // v obslužnom nástroji udalosti CheckBox)

    Ryža. 9. Pridajte podporu rozpoznávania reči do Windows Forms

    pomocou systému; pomocou System.Data; pomocou System.Drawing; pomocou System.Windows.Forms; pomocou Microsoft.Speech.Recognition; pomocou System.Globalization; menný priestor WinFormSpeech ( verejná čiastočná trieda Form1: Form ( statické CultureInfo ci = new CultureInfo("en-us"); statický SpeechRecognitionEngine sre = nový SpeechRecognitionEngine(ci); public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre .SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodbye); sre.Text. obslužný program udalosti CheckBox ) statická gramatika GetHelloGoodbyeGrammar() ( Choices ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("ahoj"); ch_HelloGoodbye.Add("zbohom"); GrammarBuilder gb_result = new Grammar_HelloBulder =(nový) GrammarHelloBulder ) ; return g_result; ) static Grammar GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(new string ( "red", "white", "blue" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("nastaviť textové pole 1"); gb_result.Append(ch_Colors); Gramatika g_vysledok = new Grammar(gb_result); return g_result; ) private void checkBox1_CheckedChanged(object sender, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // zakázané sre.RecognizeAsync)Cancel void sre_SpeechRecognized(odosielateľ objektu, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("Počul som, že hovoríš: " + txt); ))); // Špecifiká WinForm if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) (reťazcové slová = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = words; ))); // Špecifiká WinForm ) ) ) // Formulár ) // ns

    Mohol som vytvoriť dva objekty Grammar priamo, ako v programe konzoly, ale namiesto toho, aby bol kód trochu prehľadnejší, som definoval dve pomocné metódy (GetHelloGoodbyeGrammar a GetTextBox1TextGrammar), ktoré túto úlohu vykonávajú.

    statická gramatika GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(nový reťazec ( "červená", "biela", "modrá" )); GrammarBuilder gb_result = nový GrammarBuilder(); gb_result.Append("nastaviť text box 1"); gb_result.Append(ch_Colors); Grammar g_result = new Grammar(gb_result); return g_result; )

    Táto pomocná metóda rozpozná frázu „nastaviť textové pole 1 červené“. Od používateľa sa však nevyžaduje, aby túto frázu presne vyslovoval. Napríklad by mohol povedať „Prosím, nastavte text v textovom poli 1 na červenú“ a nástroj na rozpoznávanie reči by stále rozpoznal frázu ako „nastaviť textové pole 1 na červenú“ – aj keď s nižšou hodnotou spoľahlivosti ako presná zhoda s gramatikou. šablóna. Inými slovami, pri vytváraní objektov Gramatiky nemusíte brať do úvahy všetky variácie fráz. To radikálne zjednodušuje používanie rozpoznávania reči.

    Obsluha udalosti pre CheckBox je definovaná takto:

    private void checkBox1_CheckedChanged(object sender, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // vypnuté sre.RecognizeAsync)Cancel

    Objekt mechanizmu rozpoznávania reči sre (motor rozpoznávania reči) vždy existuje počas životnosti aplikácie Windows Forms. Tento objekt sa aktivuje a deaktivuje volaniami metód RecognizeAsync a RecognizeAsyncCancel, keď používateľ prepne začiarkavacie políčko.

    Definícia obsluhy udalosti SpeechRecognized začína takto:

    void sre_SpeechRecognized(odosielateľ objektu, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; ...

    Okrem viac-menej neustále používaných vlastností Result.Text a Result.Confidence má objekt Result niekoľko ďalších užitočných, ale zložitejších vlastností, ktoré možno budete chcieť preskúmať; napríklad Homophones a ReplacementWordUnits. Okrem toho modul rozpoznávania reči poskytuje niekoľko užitočných udalostí, ako je SpeechHypothesized.

    this.Invoke((Action)(() => listBox1.Items.Add("Počul som, že hovoríš: " + txt)));

    Teoreticky je použitie delegáta MethodInvoker v tejto situácii o niečo efektívnejšie ako akcia, pretože MethodInvoker je súčasťou menného priestoru Windows.Forms, a preto je špecifický pre aplikácie Windows Forms. Akčný delegát je všestrannejší. Tento príklad ukazuje, že pomocou nástroja na rozpoznávanie reči môžete úplne manipulovať s aplikáciou Windows Forms – ide o neuveriteľne výkonnú a užitočnú funkciu.

    Záver

    Informácie uvedené v tomto článku by vám mali pomôcť hneď začať, ak chcete preskúmať syntézu a rozpoznávanie reči v aplikáciách .NET. Zvládnutie samotnej technológie je hračka, keď prekonáte hrbole počiatočnej krivky učenia a inštalácie komponentov. Skutočnou výzvou pri syntéze a rozpoznávaní reči je pochopenie, kedy je to skutočne užitočné.

    Pomocou konzolových programov môžete vytvárať zaujímavé konverzácie tam a späť, kde sa používateľ pýta a program odpovedá, výsledkom čoho je v podstate prostredie podobné Cortane. Musíte byť opatrní, pretože keď reč vychádza z reproduktorov počítača, zachytí ju mikrofón a môže byť znovu rozpoznaná. Ocitol som sa v niekoľkých celkom zábavných situáciách, keď som položil otázku, aplikácia ju rozpoznala a odpovedala, no vyslovená odpoveď spustila ďalšiu udalosť rozpoznávania a skončil som so zábavnou, nekonečnou rečovou slučkou.

    Ďalším možným využitím reči v programe konzoly je rozpoznávanie príkazov ako "Spustiť poznámkový blok" a "Spustiť Word". Inými slovami, takýto konzolový program možno použiť na vašom počítači na vykonávanie akcií, ktoré by si inak vyžadovali veľa manipulácie s klávesnicou a myšou.

    James McCaffrey(Dr. James McCaffrey) pracuje pre Microsoft Research v Redmonde, Washington. Podieľal sa na tvorbe niekoľkých produktov spoločnosti Microsoft, vrátane Internet Explorer a Bing. Možno ho kontaktovať na [chránený e-mailom].

    Za recenziu tohto článku ďakujem odborníkom z Microsoft Research Robovi Gruenovi, Markovi Marronovi a Curtisovi von Vehovi.