Rozpoznávání řeči pomocí desktopových aplikací .NET. Ultra rychlé rozpoznávání řeči bez serverů pomocí skutečného příkladu Offline rozpoznávání řeči v Androidu 6.0

) pomocí skutečného příkladu ovládání domácích spotřebičů Hello World.
Proč domácí spotřebiče? Ano, protože díky takovému příkladu to můžete ocenit rychlost a přesnost kterých lze dosáhnout použitím zcela místní rozpoznávání řeči bez serverů Google ASR nebo Yandex SpeechKit.
K článku přikládám i veškerý zdrojový kód programu a samotné sestavení pro Android.

Proč najednou?

Když jsem na to nedávno narazil, zeptal jsem se autora, proč chce pro svůj program používat rozpoznávání řeči založené na serveru (podle mého názoru to bylo zbytečné a vedlo to k určitým problémům). Za tímto účelem bych mohl podrobněji popsat použití alternativních metod pro projekty, kde není potřeba nic rozpoznávat a slovník se skládá z konečné množiny slov. A to i s ukázkou praktické aplikace...

Proč potřebujeme něco jiného než Yandex a Google?

Pro tuto velmi „praktickou aplikaci“ jsem si vybral téma hlasové ovládání pro chytrou domácnost.
Proč zrovna tento příklad? Protože ukazuje několik výhod zcela lokálního rozpoznávání řeči oproti rozpoznávání pomocí cloudových řešení. A to:
  • Rychlost- nejsme závislí na serverech, a proto nezávisíme na jejich dostupnosti, šířce pásma atd. faktory
  • Přesnost- náš engine pracuje pouze se slovníkem, který zajímá naši aplikaci, čímž se zvyšuje kvalita rozpoznávání
  • Cena- nemusíme platit za každý požadavek na server
  • Hlasová aktivace- jako další bonus k prvním bodům - můžeme neustále „poslouchat vysílání“, aniž bychom plýtvali provozem a bez načítání serverů

Poznámka

Dovolím si ihned učinit výhradu, že tyto výhody lze považovat za výhody pouze pro určitou třídu projektů, Kde jsme víme jistě předem, s jakým slovníkem a jakou gramatikou bude uživatel pracovat. Tedy když nepotřebujeme rozpoznat libovolný text (například SMS zprávu nebo vyhledávací dotaz). Jinak je rozpoznávání cloudu nepostradatelné.

Android tedy dokáže rozpoznat řeč i bez internetu!
Ano, ano... Pouze na JellyBean. A to jen z půl metru, víc ne. A toto rozpoznání je stejný diktát, jen s použitím mnohem menšího modelu. Nemůžeme to tedy spravovat ani konfigurovat. A co nám vrátí příště, se neví. I když tak akorát na SMS!

Co děláme?

Implementujeme hlasové dálkové ovládání pro domácí spotřebiče, které bude fungovat přesně a rychle, z několika metrů a to i na levných, mizerných, velmi levných Android smartphonech, tabletech a hodinkách.
Logika bude jednoduchá, ale velmi praktická. Aktivujeme mikrofon a vyslovíme jeden nebo více názvů zařízení. Aplikace je rozpozná a zapíná a vypíná v závislosti na aktuálním stavu. Nebo od nich dostane jmění a vysloví to příjemným ženským hlasem. Například aktuální teplota v místnosti.

Praktických aplikací je mnoho

Ráno, aniž bys otevřel oči, jsi plácl dlaní na obrazovku smartphonu na nočním stolku a zavelel „Dobré ráno!“ - scénář se spustí, kávovar se zapne a hučí, hraje příjemná hudba, rozhrnou se závěsy.
Pověsme si na zeď v každé místnosti levný (2 tisíce, ne více) smartphone. Po práci jdeme domů a zavelíme do prázdna „Smart Home! Světla, televize! - Myslím, že není třeba říkat, co bude dál.

Přepisy



Gramatika popisuje co co může uživatel říct. Aby Pocketsphinx věděla, Jak vysloví, je nutné ke každému slovu z gramatiky napsat, jak zní v odpovídajícím jazykovém modelu. To znamená transkripce každé slovo. To se nazývá slovník.

Přepisy jsou popsány pomocí speciální syntaxe. Například:
chytrý uu m n ay j dům d oo m

V zásadě nic složitého. Dvojhláska v transkripci označuje stres. Dvojitá souhláska je měkká souhláska následovaná samohláskou. Všechny možné kombinace pro všechny zvuky ruského jazyka.

Je jasné, že nemůžeme předem popsat všechny přepisy v naší aplikaci, protože předem neznáme názvy, které uživatel svým zařízením dá. Proto budeme takové přepisy generovat „za běhu“ podle některých pravidel ruské fonetiky. Chcete-li to provést, můžete implementovat následující třídu PhonMapper, která může přijímat řetězec jako vstup a generovat pro něj správný přepis.

Hlasová aktivace

Jedná se o schopnost enginu pro rozpoznávání řeči neustále „poslouchat vysílání“ za účelem reakce na předem určenou frázi (nebo fráze). Současně budou vyřazeny všechny ostatní zvuky a řeč. To není totéž jako popsat gramatiku a jen zapnout mikrofon. Nebudu zde uvádět teorii tohoto úkolu a mechaniku jeho fungování. Dovolte mi jen říci, že nedávno programátoři pracující na Pocketsphinx implementovali takovou funkci a nyní je k dispozici po vybalení v API.

Jedna věc rozhodně stojí za zmínku. Pro aktivační frázi musíte nejen specifikovat přepis, ale také vybrat vhodný prahová hodnota citlivosti. Příliš malá hodnota povede k mnoha falešně pozitivním výsledkům (to je situace, kdy jste aktivační frázi neřekli, ale systém ji rozpozná). A příliš vysoká - na imunitu. Proto je toto nastavení obzvláště důležité. Přibližný rozsah hodnot - od 1e-1 do 1e-40 v závislosti na aktivační frázi.

Aktivace senzoru přiblížení

Tento úkol je specifický pro náš projekt a nesouvisí přímo s uznáním. Kód lze vidět přímo v hlavní činnosti.
Ona implementuje SensorEventListener a v okamžiku přiblížení (hodnota senzoru je menší než maximum) zapne časovač a po určité prodlevě zkontroluje, zda je senzor stále blokován. To se provádí za účelem odstranění falešných poplachů.
Když senzor není znovu zablokován, zastavíme rozpoznávání a získáme výsledek (viz popis níže).

Začněme rozpoznáváním

Pocketsphinx poskytuje pohodlné API pro konfiguraci a spuštění procesu rozpoznávání. Toto jsou třídy SpechRecognizer A Nastavení rozpoznávání řeči.
Takto vypadá konfigurace a spuštění rozpoznávání:

PhonMapper phonMapper = new PhonMapper(getAssets().open("dict/ru/hotwords")); Gramatická gramatika = new Grammar(names, phonMapper); gramatika.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); Soubor hmmDir = new File(dataFiles.getHmm()); Soubor dict = nový Soubor(dataFiles.getDict()); Soubor jsgf = new File(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, klíčové slovo); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Zde nejprve zkopírujeme všechny potřebné soubory na disk (Pocketpshinx vyžaduje, aby byl na disku akustický model, gramatika a slovník s přepisy). Poté je nakonfigurován samotný rozpoznávací modul. Jsou uvedeny cesty k souborům modelu a slovníku a také některé parametry (práh citlivosti pro aktivační frázi). Dále se nakonfiguruje cesta k souboru s gramatikou a také aktivační fráze.

Jak můžete vidět z tohoto kódu, jeden engine je nakonfigurován pro rozpoznávání gramatiky i aktivační fráze. Proč se to dělá? Abychom mohli rychle přepínat mezi tím, co aktuálně potřebujeme rozpoznat. Takto vypadá spuštění procesu rozpoznávání aktivační fráze:

MRecognizer.startListening(KWS_SEARCH);
A takto se rozpoznává řeč podle dané gramatiky:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Druhý argument (nepovinný) je počet milisekund, po kterých se rozpoznávání automaticky ukončí, pokud nikdo nic neřekne.
Jak vidíte, k vyřešení obou problémů můžete použít pouze jeden motor.

Jak získat výsledek rozpoznání

Chcete-li získat výsledek rozpoznávání, musíte také zadat posluchače událostí, který implementuje rozhraní RecognitionListener.
Má několik metod, které volá pocketsphinx, když nastane jedna z událostí:
  • na začátku řeči- motor slyšel nějaký zvuk, možná to byla řeč (nebo možná ne)
  • onEndOfSpeech- zvuk končí
  • onPartialResult- existují mezivýsledky rozpoznávání. Pro aktivační frázi to znamená, že to fungovalo. Argument Hypotéza
  • onResult- konečný výsledek uznání. Tato metoda bude volána po zavolání metody stop na SpeechRecognizer. Argument Hypotéza obsahuje rozpoznávací data (řetězec a skóre)

Implementací metod onPartialResult a onResult tím či oním způsobem můžete změnit logiku rozpoznávání a získat konečný výsledek. V případě naší aplikace se to dělá 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 řetězce = hypotéza != null ?(TAG) hypothesis.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); ) )

Když přijmeme událost onEndOfSpeech a zároveň rozpoznáme příkaz, který se má provést, musíme rozpoznání zastavit, načež se okamžitě zavolá onResult.
V onResult musíte zkontrolovat, co bylo právě rozpoznáno. Pokud se jedná o příkaz, musíte jej spustit pro provedení a přepnout motor, aby rozpoznal aktivační frázi.
V onPartialResult nás zajímá pouze rozpoznání aktivační fráze. Pokud jej detekujeme, okamžitě spustíme proces rozpoznávání příkazů. Vypadá to takto:

Soukromé synchronizované void startRecognition() ( if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); nový ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAXTonenereGenerator(ToneG). 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. příkazy"); post(4000, mStopRecognitionCallback); ) )); )
Zde nejprve zahrajeme malý signál, kterým upozorníme uživatele, že jsme ho slyšeli a jsme připraveni na jeho příkaz. Během této doby by měl být mikrofon vypnutý. Rozpoznávání tedy spustíme po krátkém timeoutu (o něco delším, než je doba trvání signálu, abychom neslyšeli jeho ozvěnu). Spustí také vlákno, které násilně zastaví rozpoznávání, pokud uživatel mluví příliš dlouho. V tomto případě jsou to 3 sekundy.

Jak převést rozpoznaný řetězec na příkazy

Vše je zde specifické pro konkrétní aplikaci. V případě nahého příkladu jednoduše vytáhneme z řádku názvy zařízení, vyhledáme požadované zařízení a buď změníme jeho stav pomocí HTTP požadavku na ovladač chytré domácnosti, nebo nahlásíme jeho aktuální stav (jako např. termostat). Tuto logiku lze vidět ve třídě Controller.

Jak syntetizovat řeč

Syntéza řeči je inverzní operace rozpoznávání. Tady je to naopak – je potřeba převést řádek textu na řeč, aby jej uživatel slyšel.
V případě termostatu musíme přimět naše zařízení Android mluvit o aktuální teplotě. Pomocí API Text na řeč je to docela snadné (díky Googlu za úžasné ženské TTS pro ruský jazyk):

Private void speak(String text) ( synchronizováno (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, "true"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, parametry); ))

Asi řeknu něco banálního, ale před procesem syntézy je nutné deaktivovat rozpoznávání. Na některých zařízeních (například na všech zařízeních Samsung) je obecně nemožné poslouchat mikrofon a zároveň něco syntetizovat.
Konec syntézy řeči (tj. konec procesu mluveného textu syntezátorem) lze sledovat v posluchači:

Soukromá konečná verze TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) ( synchronizováno (mSpeechQueue if) (Empech.poleu.) (Empech.poleu.) mRecognizer.startListening( KWS_SEARCH); ) ) ) );

V něm jednoduše zkontrolujeme, zda se ve frontě syntézy nenachází ještě něco, a pokud nic jiného není, povolíme rozpoznání aktivační fráze.

A to je všechno?

Ano! Jak můžete vidět, rychlé a efektivní rozpoznání řeči přímo na zařízení není vůbec obtížné, díky přítomnosti takových úžasných projektů, jako je Pocketsphinx. Poskytuje velmi pohodlné API, které lze použít při řešení problémů souvisejících s rozpoznáváním hlasových příkazů.

V tomto příkladu jsme připojili uznání ke zcela specifickému úkolu - hlasové ovládání zařízení chytré domácnosti. Díky místnímu rozpoznání jsme dosáhli velmi vysoké rychlosti a minimalizovali chyby.
Je jasné, že stejný kód lze použít pro jiné úlohy související s hlasem. Nemusí to být nutně chytrá domácnost.

  • hlasová kontrola
  • hlasový motor
  • Přidat štítky

    Žádný program nemůže zcela nahradit ruční práci s přepisem nahrané řeči. Existují však řešení, která mohou výrazně urychlit a usnadnit překlad řeči do textu, tedy zjednodušit přepis.

    Přepis je záznam zvukového nebo video souboru v textové podobě. Na internetu existují placené placené úkoly, kdy je interpretovi za přepis textu zaplacena určitá částka.

    Překlad řeči na text je užitečný

    • studenti překládat nahrané audio nebo video přednášky do textu,
    • blogeři provozující webové stránky a blogy,
    • spisovatelé, novináři pro psaní knih a textů,
    • informační podnikatelé, kteří potřebují text po svém webináři, projevu atd.,
    • lidé, kteří mají potíže s psaním – mohou nadiktovat dopis a poslat ho rodině nebo přátelům,
    • jiné možnosti.

    Popíšeme nejúčinnější nástroje dostupné na PC, mobilních aplikacích a online službách.

    1 Webová stránka speechpad.ru

    Jedná se o online službu, která vám umožňuje překládat řeč do textu pomocí prohlížeče Google Chrome. Služba funguje s mikrofonem a hotovými soubory. Kvalita bude samozřejmě mnohem vyšší, pokud použijete externí mikrofon a budete si diktovat sami. Služba však odvádí dobrou práci i s videi na YouTube.

    Klikněte na „Povolit nahrávání“, odpovězte na otázku „Používání mikrofonu“ – to provedete kliknutím na „Povolit“.

    Dlouhé pokyny k používání služby lze sbalit kliknutím na tlačítko 1 na obr. 3. Inzerce se můžete zbavit dokončením jednoduché registrace.

    Rýže. 3. Služba Speechpad

    Hotový výsledek lze snadno upravit. Chcete-li to provést, musíte zvýrazněné slovo buď ručně opravit, nebo jej znovu nadiktovat. Výsledky práce se ukládají na váš osobní účet, lze je také stáhnout do počítače.

    Seznam video lekcí o práci s řečovým blokem:

    Videa můžete přepisovat z Youtube nebo ze svého počítače, budete však potřebovat mixér, další podrobnosti:

    Video "přepis zvuku"

    Služba funguje v sedmi jazycích. Je tam malé mínus. Spočívá v tom, že pokud potřebujete přepsat hotový zvukový soubor, pak je jeho zvuk slyšet přes reproduktory, což vytváří další rušení ve formě ozvěny.

    2 Servisní diktát.io

    Skvělá online služba, která vám umožní překládat řeč do textu zdarma a snadno.

    Rýže. 4. Servisní diktát.io

    1 na Obr. 4 – Ruský jazyk lze vybrat na konci stránky. V prohlížeči Google Chrome je jazyk vybrán, ale z nějakého důvodu v Mozille taková možnost neexistuje.

    Je pozoruhodné, že byla implementována možnost automatického ukládání hotového výsledku. Tím zabráníte náhodnému smazání v důsledku zavření karty nebo prohlížeče. Tato služba nerozpoznává hotové soubory. Pracuje s mikrofonem. Při diktování je potřeba pojmenovat interpunkční znaménka.

    Text je rozpoznán zcela správně, nejsou zde žádné pravopisné chyby. Interpunkční znaménka můžete vkládat sami z klávesnice. Hotový výsledek lze uložit do počítače.

    3 RealSpeaker

    Tento program umožňuje snadno překládat lidskou řeč do textu. Je navržen pro práci na různých systémech: Windows, Android, Linux, Mac. S jeho pomocí můžete slyšenou řeč převést do mikrofonu (může být například zabudována do notebooku), ale i nahranou do zvukových souborů.

    Rozumí 13 světovým jazykům. K dispozici je beta verze programu, která funguje jako online služba:

    Musíte následovat výše uvedený odkaz, vybrat ruský jazyk, nahrát svůj zvukový nebo video soubor do online služby a zaplatit za jeho přepis. Po přepisu můžete výsledný text zkopírovat. Čím větší je soubor pro přepis, tím více času zabere jeho zpracování, další podrobnosti:

    V roce 2017 existovala bezplatná možnost přepisu pomocí RealSpeaker, ale v roce 2018 žádná taková možnost neexistuje. Je velmi matoucí, že přepsaný soubor je k dispozici všem uživatelům ke stažení, snad se to zlepší.

    Kontakty vývojáře (VKontakte, Facebook, Youtube, Twitter, e-mail, telefon) programu naleznete na stránce jeho webu (přesněji v patičce webu):

    4 Speechlogger

    Alternativa k předchozí aplikaci pro mobilní zařízení se systémem Android. K dispozici zdarma v obchodě s aplikacemi:

    Text se automaticky upraví a přidají se interpunkční znaménka. Velmi vhodné pro diktování poznámek nebo vytváření seznamů. Ve výsledku bude text velmi slušné kvality.

    5 Dračí diktát

    Jedná se o aplikaci, která je zdarma distribuována pro mobilní zařízení od společnosti Apple.

    Program může pracovat s 15 jazyky. Umožňuje upravit výsledek a vybrat požadovaná slova ze seznamu. Musíte jasně vyslovovat všechny zvuky, nedělat zbytečné pauzy a vyhýbat se intonaci. Někdy jsou v koncích slov chyby.

    Aplikace Dragon Dictation slouží majitelům například k diktování nákupního seznamu v obchodě při pohybu po bytě. Když se tam dostanu, můžu se podívat na text v poznámce a nemusím poslouchat.

    Ať už ve své praxi používáte jakýkoli program, buďte připraveni zkontrolovat výsledky a provést určité úpravy. Jedině tak získáte bezchybný text bez chyb.

    Také užitečné služby:

    Dostávejte nejnovější články o počítačové gramotnosti přímo do vaší schránky.
    Již více 3000 odběratelů

    .

    Produkty a technologie:

    Visual Studio, C#, .NET řečové knihovny

    Článek pojednává o:

    • přidání podpory rozpoznávání řeči do konzolové aplikace;
    • zpracování rozpoznané řeči;
    • instalace knihoven pro rozpoznávání řeči;
    • srovnání Microsoft.Speech a System.Speech;
    • Přidání podpory rozpoznávání řeči do aplikace Windows Forms.

    S příchodem Windows Phone Cortana, osobní asistentky aktivované řečí (a také protějšku z ovocných společností, o kterém se nedá nadarmo mluvit), se aplikace s podporou řeči stávají stále důležitějšími ve vývoji softwaru. V tomto článku vám ukážu, jak začít s rozpoznáváním a syntézou řeči v konzolových aplikacích Windows, aplikacích Windows Forms a Windows Presentation Foundation (WPF).

    Všimněte si, že můžete také přidat funkce řeči do aplikací pro Windows Phone, webových aplikací ASP.NET, aplikací pro Windows Store, Windows RT a Xbox Kinect, ale tyto techniky se liší od technik popsaných v tomto článku.

    Dobrým způsobem, jak získat představu o tom, o čem přesně bude tento článek pojednávat, je podívat se na snímky obrazovky dvou různých demo programů na rýže. 1 A 2 . Po spuštění konzolové aplikace na rýže. 1 okamžitě řekne větu „Jsem vzhůru“. Demo aplikaci samozřejmě při čtení tohoto článku neuslyšíte, takže zobrazuje text toho, co počítač říká. Poté uživatel řekne příkaz „Speech on“. Demo aplikace odpoví rozpoznaným textem a poté interně naslouchá a reaguje na požadavky na přidání dvou čísel.

    Rýže. 1. Rozpoznávání a syntéza řeči v konzolové aplikaci


    Rýže. 2. Rozpoznávání řeči v aplikaci Windows Forms

    Uživatel požádal aplikaci, aby přidala jedničku a dvojku, pak dvojku a trojku. Aplikace rozpoznávala mluvené příkazy a odpovídala hlasem. Další užitečné způsoby použití rozpoznávání řeči popíšu později.

    Uživatel poté řekl „Speech off“, což je hlasový příkaz, který deaktivuje poslech dalších příkazů, ale zcela nevypne rozpoznávání řeči. Po tomto slovním příkazu byl další příkaz k přidání jedničky a dvojky ignorován. Nakonec uživatel znovu zapnul poslech příkazů a vyslovil nesmyslný příkaz „Klatu barada nikto“, který aplikace rozpoznala jako příkaz k úplné deaktivaci rozpoznávání řeči a ukončení.

    Na rýže. 2 ukazuje aplikaci Windows Forms s povolenou fiktivní řečí. Tato aplikace rozpoznává mluvené příkazy, ale nereaguje na ně hlasovým výstupem. Při prvním spuštění aplikace nebylo zaškrtávací políčko Speech On zaškrtnuto, což znamená, že rozpoznávání řeči nebylo aktivní. Uživatel toto zaškrtávací políčko zaškrtl a poté řekl „Ahoj“. Aplikace reagovala zobrazením rozpoznaného textu v ovládacím prvku ListBox ve spodní části okna.

    Uživatel poté řekl: „Nastav textové pole 1 na červené“. Aplikace rozpoznala řeč a odpověděla: „Nastavit textové pole 1 na červenou“, což je téměř (ale ne tak docela) přesně to, co uživatel řekl. I když na rýže. 2 Není to vidět, text v ovládacím prvku TextBox v horní části okna je opravdu červený.

    Potom uživatel řekl: "Nastavte textové pole 1 na bílé." Aplikace to rozpoznala jako „nastavit textové pole 1 bílé“ a udělala to. Uživatel na závěr řekl: „Nashledanou“ a aplikace tento text zobrazila, ale neudělala nic s Windows Forms, i když mohla například zrušit zaškrtnutí políčka Speech On.

    Použití objektu syntezátoru je celkem jednoduché.

    V následujících částech vás provedu procesem tvorby obou ukázkových programů, včetně instalace potřebných knihoven řeči .NET. Tento článek předpokládá, že máte alespoň středně pokročilé znalosti programování, ale nevíte nic o rozpoznávání a syntéze řeči.

    Přidání podpory rozpoznávání řeči do konzolové aplikace

    Chcete-li vytvořit ukázku zobrazenou v rýže. 1, spustil jsem Visual Studio a vytvořil novou konzolovou aplikaci C# s názvem ConsoleSpeech. Řečové nástroje jsem úspěšně používal s Visual Studio 2010 a 2012, ale jakákoli relativně nedávná verze by měla být v pořádku. Po načtení kódu šablony do editoru jsem přejmenoval soubor Program.cs v okně Solution Explorer na popisnější ConsoleSpeechProgram.cs a Visual Studio mi přejmenovalo třídu Program.

    Dále jsem přidal odkaz na soubor Microsoft.Speech.dll, který se nachází v C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly. Tato knihovna DLL v mém počítači chyběla a musel jsem si ji stáhnout. Instalace souborů potřebných k přidání rozpoznávání řeči a syntézy do aplikace není tak triviální. Proces instalace podrobně vysvětlím v další části, ale prozatím předpokládejme, že Microsoft.Speech.dll je ve vašem systému.

    Přidáním odkazu na řečovou knihovnu DLL jsem odstranil všechny příkazy using z horní části kódu kromě toho, který ukazoval na jmenný prostor nejvyšší úrovně System. Poté jsem přidal pomocí příkazů pro jmenné prostory Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis a System.Globalization. První dva jmenné prostory jsou mapovány na knihovnu DLL řeči. Všimněte si, že existují také jmenné prostory jako System.Speech.Recognition a System.Speech.Synthesis, které mohou být matoucí. Brzy vysvětlím rozdíl mezi nimi. Obor názvů Globalizace byl k dispozici ve výchozím nastavení a nevyžadoval přidání nového odkazu do projektu.

    Veškerý zdrojový kód aplikace demo konzole je k dispozici na adrese rýže. 3, a je také k dispozici ve zdrojovém balíčku přiloženém k tomuto článku. Odstranil jsem veškeré standardní zpracování chyb, abych se co nejvíce vyhnul zatemnění hlavních myšlenek.

    Rýže. 3. Zdrojový kód aplikace demo konzole

    pomocí systému; pomocí Microsoft.Speech.Recognition; pomocí Microsoft.Speech.Synthesis; pomocí System.Globalization; jmenný prostor ConsoleSpeech ( class ConsoleSpeechProgram ( statický SpeechSynthesizer ss = nový SpeechSynthesizer(); statický SpeechRecognitionEngine sre; statický bool done = false; statický bool speechOn = true; static void Main(string args) ( try ( ss.SetOuneLidioDevice.Default) ("\n(mluvení: Jsem vzhůru)"); ss.Speak("Jsem vzhůru"); CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; SRE.SpeECHRECHNIZED += SRE_SPEECHRECHRECOGNIZED; Choices ch_startStopcommands = Nové volby (); Ch_StartStopcommands.add ("řeč zapnutá"); ch_startstopcommands.add ("S Peech Off "); m "S Peech Off"); nahoře = 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("Co 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 >zavřít shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Hlavní statická void sre_SpeechRecognized(odesílatel objektu, SpeechRecognizedEventArgs e ) ( string txt = e.Result.Text; plovoucí spolehlivost = e.Result.Confidence; Console.WriteLine("\nRozpoznáno: " + txt); if (spolehlivost< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("řeč je nyní zapnuta"); speechOn = true; ) if (txt.IndexOf("řeč vypnuta") >= 0) ( Console.WriteLine("řeč je nyní VYPNUTA"); speechOn = false; ) if (speechOn == false) return; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)odesílatel). RecognizeAsyncCancel(); done = true; Console.WriteLine("(mluvení: Sbohem)"); ss.Speak("Sbohem"); ) if (txt.IndexOf("Co") >= 0 && txt.IndexOf("plus") >= 0) (řetězcová slova = txt.Split(" "); int num1 = int.Parse(slova); int num2 = int.Parse(slova); int součet = num1 + num2; Console.WriteLine("(řečeno: " + slova + " plus " + slova + " se rovná " + součet + ")"); ss.SpeakAsync(slova + " plus " + slova + " rovná se " + součet); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Po příkazech using začne ukázkový kód takto:

    jmenný prostor ConsoleSpeech ( třída ConsoleSpeechProgram ( statický SpeechSynthesizer ss = nový SpeechSynthesizer(); statický SpeechRecognitionEngine sre; statický bool done = false; statický bool speechOn = true; static void Main(string args) ( ...

    Objekt SpeechSynthesizer na úrovni třídy umožňuje aplikaci syntetizovat řeč. Objekt SpeechRecognitionEngine umožňuje aplikaci poslouchat a rozpoznávat mluvená slova nebo fráze. Booleovská proměnná done určuje, kdy se celá aplikace ukončí. Logická proměnná speechOn řídí, zda aplikace naslouchá jiným příkazům než příkazu k ukončení programu.

    Myšlenka je taková, že konzolová aplikace nepřijímá vstup z klávesnice, takže vždy naslouchá příkazům. Pokud je však speechOn false, bude rozpoznán a proveden pouze příkaz k ukončení programu; ostatní příkazy jsou rozpoznány, ale ignorovány.

    Hlavní metoda začíná takto:

    try ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(mluvení: Jsem vzhůru)"); ss.Speak("Jsem vzhůru");

    Instance objektu SpeechSynthesizer byla vytvořena při jeho deklaraci. Použití objektu syntezátoru je celkem jednoduché. Metoda SetOutputToDefaultAudioDevice odesílá výstup do reproduktorů připojených k vašemu počítači (výstup můžete také odeslat do souboru). Metoda Speak vezme řetězec a poté jej vysloví. Takhle je to snadné.

    Rozpoznávání řeči je mnohem složitější než syntéza řeči. Hlavní metoda pokračuje vytvořením objektu resolveru:

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

    Za prvé, objekt CultureInfo určuje jazyk, který má být rozpoznán, v tomto případě americkou angličtinu. Objekt CultureInfo je v oboru názvů Globalizace, na který jsme odkazovali pomocí příkazu using. Poté se po zavolání konstruktoru SpeechRecognitionEngine hlasový vstup přiřadí výchozímu zvukovému zařízení – nejčastěji mikrofonu. Všimněte si, že většina notebooků má vestavěný mikrofon, ale stolní počítače budou vyžadovat externí mikrofon (dnes často kombinovaný se sluchátky).

    Klíčovou metodou pro objekt rozpoznávání je obslužná rutina události SpeechRecognized. Pokud při používání sady Visual Studio zadáte „sre.SpeechRecognized +=" a počkáte zlomek sekundy, IntelliSense automaticky ukončí váš výraz názvem obslužné rutiny události - sre_SpeechRecognized. Navrhuji, abyste stisknutím klávesy Tab přijali návrh a použili tento název jako výchozí.

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

    Tři hlavní objekty jsou zde sada voleb, šablona GrammarBuilder a ovládací prvek Grammar. Když vytvářím gramatiku pro rozpoznávání, začnu uvedením některých konkrétních příkladů toho, co potřebuji rozpoznat. Řekněme: "Kolik je jedna plus dvě?" a "Kolik je tři plus čtyři?"

    Poté definuji odpovídající generickou šablonu, například „Co je Plus ? Šablona je GrammarBuilder a konkrétní hodnoty, které jsou předány šabloně, jsou sadou voleb. Objekt Grammar zapouzdřuje šablonu a volby.

    V demo programu omezuji přidávání na 1 až 4 a přidávám je jako řetězce do sady Choices. Efektivnější přístup:

    čísla řetězců = nový řetězec ("1", "2", "3", "4" ); Volby ch_Numbers = new Choices(čísla);

    Představuji méně efektivní přístup k vytváření sady voleb ze dvou důvodů. Za prvé, přidání jednoho řádku po druhém byl jediný přístup, který jsem viděl v jiných příkladech rozpoznávání řeči. Za druhé, můžete si myslet, že přidávání jednoho řádku najednou by vůbec nemělo fungovat; Visual Studio IntelliSense v reálném čase ukazuje, že jedno z přetížení Add přijímá parametr typu params řetězcové fráze. Pokud jste si nevšimli klíčového slova params, možná jste předpokládali, že metoda Add přijímá pouze pole řetězců a ne jediný řetězec. Ale není tomu tak: přijímá obojí. Doporučuji předat pole.

    Vytvoření sady voleb ze sekvenčních čísel je poněkud zvláštní případ a umožňuje programový přístup, jako je:

    čísla řetězců = nový řetězec; for (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    Po vytvoření voleb pro vyplnění slotů GrammarBuilder demo program vytvoří GrammarBuilder a poté řídící gramatiku:

    GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Co 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žívá podobnou šablonu k vytvoření gramatiky pro příkazy start a stop:

    Volby ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("řeč zapnuta"); ch_StartStopCommands.Add("řeč 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 lze definovat velmi flexibilně. Zde jsou příkazy „speech on“, „speech off“ a „klatu barada nikto“ umístěny v jedné gramatice, protože spolu logicky souvisí. Tyto tři příkazy mohly být definovány ve třech různých gramatikách, nebo příkazy "speech on" a "speech off" mohly být umístěny do jedné gramatiky a příkaz "klatu barada nikto" do druhé.

    Jakmile vytvoříte všechny objekty Grammar, vložíte je do nástroje pro rozpoznávání řeči a rozpoznávání řeči se aktivuje:

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

    Argument RecognizeMode.Multiple je potřeba, když máte více než jednu gramatiku, což bude případ všech programů kromě těch nejjednodušších. Hlavní metoda se dokončí takto:

    While (hotovo == false) ( ; ) Console.WriteLine("\nHit< enter >zavřít shell\n"); Console.ReadLine(); ) catch (exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main

    Podivně vypadající prázdná smyčka while vám umožňuje udržovat shell konzolové aplikace spuštěný. Smyčka bude dokončena, když je booleovská proměnná done na úrovni třídy nastavena na hodnotu true obslužnou rutinou události rozpoznávání řeči.

    Rozpoznané zpracování řeči

    Kód pro zpracování událostí rozpoznávání řeči začíná takto:

    static void sre_SpeechRecognized(odesílatel objektu, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; plovoucí spolehlivost = e.Result.Confidence; Console.WriteLine("\nRecognized: " + txt); if (spolehlivost< 0.60) return; ...

    Rozpoznaný text je uložen ve vlastnosti Result.Text objektu SpeechRecognizedEventArgs. Případně můžete použít sadu Result.Words. Vlastnost Result.Confidence ukládá hodnotu mezi 0,0 a 1,0, což je hrubý odhad toho, jak dobře mluvený text odpovídá jakékoli gramatice přidružené k rozpoznávači. Demo program instruuje obsluhu události, aby ignorovala text s nízkou důvěrou v rozpoznaný text.

    Hodnoty spolehlivosti se značně liší v závislosti na složitosti vaší gramatiky, kvalitě mikrofonu a dalších faktorech. Pokud například demo program potřebuje rozpoznat pouze čísla 1 až 4, hodnoty spolehlivosti na mém počítači jsou obvykle kolem 0,75. Pokud však gramatika musí rozpoznat čísla od 1 do 100, hodnoty spolehlivosti klesnou na přibližně 0,25. Stručně řečeno, měli byste obecně experimentovat s hodnotami spolehlivosti, abyste dosáhli dobrých výsledků rozpoznávání řeči.

    if (txt.IndexOf("řeč je zapnutá") >= 0) ( Console.WriteLine("Řeč je nyní zapnuta"); speechOn = true; ) if (txt.IndexOf("řeč vypnuta") >= 0) ( Konzole .WriteLine("řeč je nyní VYPNUTA"); speechOn = false; ) if (speechOn == false) return;

    I když to na první pohled nemusí být úplně zřejmé, tato logika by měla dávat smysl, pokud se nad tím zamyslíte. Poté je zpracován příkaz tajného ukončení:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)odesílatel).RecognizeAsyncCancel(); done = true; Console.WriteLine("(mluvení: Sbohem)"); ss.Speak("Sbohem"); )

    Všimněte si, že modul rozpoznávání řeči skutečně dokáže rozpoznat nesmyslná slova. Pokud objekt Grammar obsahuje slova, která nejsou ve vestavěném slovníku objektu, Grammar se pokusí tato slova identifikovat pomocí sémantické heuristiky, je-li to možné, a je obvykle docela úspěšná. Proto jsem použil "klatu" místo správného "klaatu" (ze starého sci-fi filmu).

    Také si uvědomte, že nemusíte zpracovávat veškerý text, který Gramatika rozpozná („klatu barada nikto“) – stačí mít dostatek informací k jednoznačné identifikaci gramatické fráze („klatu“ a „barada“).

    If (txt.IndexOf("Co") >= 0 && txt.IndexOf("plus") >= 0) ( string words = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(slova); int suma = num1 + num2; Console.WriteLine("(mluvení: " + slova + " plus " + slova + " se rovná " + součet + ")"); ss.SpeakAsync(slova + " plus " + slova + " rovná se " + součet); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Všimněte si, že text v Results.Text rozlišuje velká a malá písmena ("Co" a "co"). Po rozpoznání fráze ji lze analyzovat na konkrétní slova. V tomto případě je rozpoznaný text ve tvaru „Co je x plus y“, takže „Co“ je umístěno ve slovech a dvě přidaná čísla (jako řetězce) jsou uložena ve slovech a slovech.

    Instalace knihoven

    Vysvětlení ukázkového programu předpokládá, že jsou na vašem počítači nainstalovány všechny potřebné knihovny řeči. Chcete-li vytvořit a spustit ukázkové programy, musíte nainstalovat čtyři balíčky: SDK (poskytuje možnost vytvářet ukázky ve Visual Studiu), runtime (spouští ukázky po jejich vytvoření) a uznávané a syntetizované (vyslovované) jazyky.

    Chcete-li nainstalovat SDK, vyhledejte na internetu „Speech Platform 11 SDK“. Tím se dostanete na správnou stránku v centru pro stahování Microsoft Download Center ( rýže. 4). Kliknutím na tlačítko Stáhnout se zobrazí možnosti zobrazené v rýže. 5. SDK je k dispozici ve 32bitové a 64bitové verzi. Důrazně doporučuji používat 32bitovou verzi bez ohledu na bitovou velikost vašeho systému. 64bitová verze nefunguje s některými aplikacemi.


    Rýže. 4. Hlavní stránka instalace sady SDK v centru stahování Microsoft Download Center


    Rýže. 5. Nainstalujte Speech SDK

    Nepotřebujete nic víc než jeden soubor .msi pod x86 (pro 32bitové systémy). Výběrem tohoto souboru a kliknutím na tlačítko Další můžete spustit instalační program přímo odtud. Knihovny řeči neposkytují mnoho zpětné vazby o dokončení instalace, takže nehledejte žádné zprávy o úspěchu.


    Rýže. 6. Instalace runtime prostředí

    Je nesmírně důležité vybrat stejnou verzi platformy (11 v ukázce) a bitovou hloubku (32 nebo 64) jako SDK. Opět důrazně doporučuji 32bitovou verzi, i když běžíte na 64bitovém systému.

    Poté můžete nastavit jazyk rozpoznávání. Stránka ke stažení je k dispozici na adrese rýže. 7. Demo program používá soubor MSSpeech_SR_en-us_TELE.msi (anglicky-U.S.). SR znamená rozpoznávání řeči a TELE znamená telefonii; to znamená, že rozpoznaný jazyk je navržen tak, aby fungoval se zvukovým vstupem nízké kvality, například z telefonu nebo stolního mikrofonu.


    Rýže. 7. Nastavení rozpoznaného jazyka

    Nakonec můžete nastavit jazyk a hlas pro syntézu řeči. Stránka ke stažení je k dispozici na adrese rýže. 8. Demo program používá soubor MSSpeech_TTS_en-us_Helen.msi. TTS (text-to-speech) je v podstatě synonymem pro syntézu řeči. Všimněte si dvou dostupných hlasů Angličtina, U.S. Existují další anglické hlasy, ale ne U.S. Vytváření souborů jazyka syntézy je velmi obtížný úkol. Můžete si však zakoupit a nainstalovat další hlasy od různých společností.


    Rýže. 8. Nastavení jazyka hlasu a syntézy

    Je zajímavé, že ačkoli jazyk rozpoznávání řeči a jazyk syntézy hlasu/řeči jsou ve skutečnosti zcela odlišné věci, oba balíčky jsou možnosti na stejné stránce pro stahování. Uživatelské rozhraní Download Center vám umožňuje zkontrolovat jazyk rozpoznávání i jazyk syntézy, ale pokus o jejich instalaci současně pro mě byl katastrofální, takže je doporučuji nainstalovat samostatně.

    Porovnání Microsoft.Speech s System.Speech

    Pokud jste nováčkem v rozpoznávání a syntéze řeči pro aplikace Windows, můžete se snadno zmást dokumentací, protože existuje více platforem řeči. Konkrétně kromě knihovny Microsoft.Speech.dll používané ukázkovými programy v tomto článku existuje knihovna s názvem System.Speech.dll, která je součástí operačního systému Windows. Tyto dvě knihovny jsou podobné v tom smyslu, že jejich API jsou téměř, ale ne zcela identická. Pokud tedy hledáte příklady zpracování řeči na internetu a vidíte spíše úryvky kódu než kompletní programy, není vůbec zřejmé, zda jde o příklad System.Speech nebo Microsoft.Speech.

    Pokud se zpracováním řeči začínáte, použijte k přidání podpory řeči do aplikace .NET raději knihovnu Microsoft.Speech než System.Speech.

    Přestože obě knihovny sdílejí společnou základnu základního kódu a podobná rozhraní API, rozhodně se liší. Některé klíčové rozdíly jsou shrnuty v stůl 1.

    Stůl 1. Hlavní rozdíly mezi Microsoft.Speech a System.Speech

    System.Speech DLL je součástí OS, takže je nainstalována na každém systému Windows. Microsoft.Speech DLL (a související runtime a jazyky) musí být stažena a nainstalována do systému. Rozpoznávání pomocí System.Speech obvykle vyžaduje školení pro konkrétního uživatele, kdy uživatel čte nějaký text a systém se učí rozumět výslovnostní charakteristice tohoto uživatele. Rozpoznávání pomocí Microsoft.Speech funguje okamžitě pro každého uživatele. System.Speech dokáže rozpoznat téměř jakékoli slovo (říká se tomu volný diktát). Microsoft.Speech rozpozná pouze slova a fráze, které jsou v objektu Grammar definovaném v programu.

    Přidání podpory rozpoznávání řeči do aplikace Windows Forms

    Proces přidání podpory rozpoznávání řeči a syntézy do aplikace Windows Forms nebo WPF je podobný jako u konzolové aplikace. Chcete-li vytvořit ukázkový program uvedený v rýže. 2, spustil jsem Visual Studio, vytvořil novou aplikaci C# Windows Forms a přejmenoval ji na WinFormSpeech.

    Po načtení kódu šablony do editoru jsem v okně Solution Explorer přidal odkaz na soubor Microsoft.Speech.dll – stejně jako v konzolovém programu. V horní části zdrojového kódu jsem odstranil zbytečné příkazy using a ponechal jsem pouze odkazy na jmenné prostory System, Data, Drawing a Forms. Pak jsem přidal dva pomocí příkazů pro jmenné prostory Microsoft.Speech.Recognition a System.Globalization.

    Demo založené na Windows Forms nepoužívá syntézu řeči, proto neodkazuji na knihovnu Microsoft.Speech.Synthesis. Přidání syntézy řeči do aplikace Windows Forms je stejné jako v konzolové aplikaci.

    Ve Visual Studiu v režimu návrhu jsem přetáhl do formuláře ovládací prvky TextBox, CheckBox a ListBox. Poklepejte na CheckBox a Visual Studio automaticky vytvořilo kostru metody obsluhy události CheckChanged.

    Připomeňme, že program demo konzoly okamžitě začal naslouchat mluveným příkazům a pokračoval v tom, dokud nebyl ukončen. Tento přístup by mohl být použit v aplikaci Windows Forms, ale místo toho jsem se rozhodl umožnit uživateli zapnout a vypnout rozpoznávání řeči pomocí ovládacího prvku CheckBox (tj. zaškrtávacího políčka).

    Zdrojový kód v souboru Form1.cs demo programu, kde je definována dílčí třída, je uveden na rýže. 9. Objekt modulu rozpoznávání řeči je deklarován a vytvořen jako člen formuláře. V konstruktoru formuláře připojím obsluhu události SpeechRecognized a poté vytvořím a načtu dva objekty Grammars:

    public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1Text_GramelloGramadAby; GrammarAsync(g_SetTextBox) ; // sre.RecognizeAsync() je // v obslužné rutině události CheckBox)

    Rýže. 9. Přidejte do Windows Forms podporu rozpoznávání řeči

    pomocí systému; pomocí System.Data; pomocí System.Drawing; pomocí System.Windows.Forms; pomocí Microsoft.Speech.Recognition; pomocí System.Globalization; jmenný prostor WinFormSpeech ( veřejná částečná třída 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.Texty)sync.(s) /Reg. obslužnou rutinu události CheckBox ) static Grammar GetHelloGoodbyeGrammar() ( Choices ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("ahoj"); ch_HelloGoodbye.Add("sbohem"); GrammarBuilder gb_result = new GrammarHelloBulder =(new GrammarHelloGoodmar_ultm); ) ; return g_result; ) static Grammar GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(nový řetězec ( "červená", "bílá", "modrá" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("nastavit textové pole 1"); gb_result.Append(ch_Colors); Gramatika g_result = 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ázáno sre.RecognizeAsyncCancel void sre_SpeechRecognized(odesílatel 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("Slyšel jsem, že říkáš: " + txt); ))); // Specifika WinForm if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) (řetězcová slova = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = words; ))); // Specifika WinForm ) ) ) // Form ) // ns

    Mohl jsem vytvořit dva objekty Grammar přímo, jako v konzolovém programu, ale místo toho, aby byl kód trochu přehlednější, jsem definoval dvě pomocné metody (GetHelloGoodbyeGrammar a GetTextBox1TextGrammar), které tuto práci dělají.

    static Grammar GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(nový řetězec ( "červená", "bílá", "modrá" )); GrammarBuilder gb_result = nový GrammarBuilder(); gb_result.Append("nastavit text box 1"); gb_result.Append(ch_Colors); Grammar g_result = new Grammar(gb_result); return g_result; )

    Tato pomocná metoda rozpozná frázi „nastavit textové pole 1 červené“. Uživatel však nemusí tuto frázi přesně vyslovovat. Mohl by například říct „Nastavte text v textovém poli 1 na červenou“ a modul rozpoznávání řeči by stále rozpoznal frázi jako „nastav textové pole 1 na červenou“ – i když s nižší hodnotou spolehlivosti než přesná shoda s gramatikou. šablona. Jinými slovy, při vytváření objektů Grammar nemusíte brát v úvahu všechny varianty fráze. To radikálně zjednodušuje používání rozpoznávání řeči.

    Obsluha události pro CheckBox je definována takto:

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

    Objekt modulu rozpoznávání řeči, sre (motor rozpoznávání řeči), vždy existuje po celou dobu životnosti aplikace Windows Forms. Tento objekt se aktivuje a deaktivuje voláním metod RecognizeAsync a RecognizeAsyncCancel, když uživatel přepne zaškrtávací políčko.

    Definice obslužné rutiny události SpeechRecognized začíná takto:

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

    Kromě víceméně neustále používaných vlastností Result.Text a Result.Confidence má objekt Result několik dalších užitečných, ale složitějších vlastností, které možná budete chtít prozkoumat; například Homophones a ReplacementWordUnits. Kromě toho modul rozpoznávání řeči poskytuje několik užitečných událostí, jako je SpeechHypothesized.

    this.Invoke((Action)(() => listBox1.Items.Add("Slyšel jsem, že říkáš: " + txt)));

    Teoreticky je použití delegáta MethodInvoker v této situaci o něco efektivnější než akce, protože MethodInvoker je součástí jmenného prostoru Windows.Forms, a proto je specifický pro aplikace Windows Forms. Akční delegát je všestrannější. Tento příklad ukazuje, že můžete zcela manipulovat s aplikací Windows Forms prostřednictvím modulu rozpoznávání řeči – to je neuvěřitelně výkonná a užitečná funkce.

    Závěr

    Informace uvedené v tomto článku by vám měly pomoci hned začít, pokud chcete prozkoumat syntézu a rozpoznávání řeči v aplikacích .NET. Zvládnutí samotné technologie je hračka, jakmile překonáte počáteční křivku učení a instalaci komponent. Skutečnou výzvou při syntéze a rozpoznávání řeči je porozumění, kdy je to skutečně užitečné.

    S konzolovými programy můžete vytvářet zajímavé konverzace tam a zpět, kde uživatel položí otázku a program odpovídá, což má za následek v podstatě prostředí podobné Cortaně. Musíte být opatrní, protože když řeč přichází z reproduktorů vašeho počítače, bude zachycena mikrofonem a může být znovu rozpoznána. Ocitl jsem se v několika docela zábavných situacích, kdy jsem položil otázku, aplikace ji rozpoznala a odpověděla, ale mluvená odpověď spustila další událost rozpoznávání a skončil jsem se zábavnou, nekonečnou řečovou smyčkou.

    Dalším možným využitím řeči v konzolovém programu je rozpoznávání příkazů jako "Spustit poznámkový blok" a "Spustit Word". Jinými slovy, takový konzolový program lze na vašem počítači použít k provádění akcí, které by jinak vyžadovaly hodně manipulace s klávesnicí a myší.

    James McCaffrey(Dr. James McCaffrey) pracuje pro Microsoft Research v Redmondu, Washington. Podílel se na vytvoření několika produktů společnosti Microsoft, včetně Internet Explorer a Bing. Je možné ho kontaktovat na [e-mail chráněný].

    Za recenzi tohoto článku děkujeme odborníkům z Microsoft Research Robu Gruenovi, Marku Marronovi a Curtisovi von Vehovi.