• Ultra-brzo prepoznavanje govora bez servera na stvarnom primjeru. Najbolji ruski softver za prepoznavanje govora offline za android

    12.12.2021

    ) na pravom Hello World primjeru upravljanja kućnim aparatima.
    Zašto kućni aparati? Da, jer se zahvaljujući takvom primjeru to može cijeniti brzina i tačnost, što se može postići upotrebom potpuno lokalno prepoznavanje govora bez tipskih servera Google ASR ili Yandex SpeechKit.
    Uz članak prilažem i sve izvorne kodove programa i sam sklop za Android.

    Zašto odjednom?

    Nakon što sam nedavno naišao, rekao sam autoru zašto želi da koristi prepoznavanje govora na strani servera za svoj program (po mom mišljenju, ovo je bilo suvišno i dovelo je do nekih problema). Šta je s tim, da li bih mogao detaljnije da opišem upotrebu alternativnih metoda za projekte u kojima nema potrebe da se bilo šta prepozna, a rečnik se sastoji od konačnog skupa reči. Štaviše, uz primjer praktične primjene...

    Zašto nam treba još nešto osim Yandexa i Gugla?

    Kao tu vrlo „praktičnu primjenu“, odabrao sam temu glasovna kontrola pametne kuće.
    Zašto takav primjer? Jer na njemu možete vidjeti onih nekoliko prednosti potpuno lokalnog prepoznavanja govora u odnosu na prepoznavanje korištenjem rješenja u oblaku. naime:
    • Brzina- ne zavisimo od servera i stoga ne zavisimo od njihove dostupnosti, propusnog opsega itd. faktori
    • Preciznost- naš motor radi samo s rječnikom za koji je naša aplikacija zainteresirana, čime se povećava kvalitet prepoznavanja
    • Cijena- ne moramo platiti za svaki zahtjev serveru
    • Glasovna aktivacija- kao dodatni bonus za prve poene - možemo stalno "slušati eter" bez trošenja prometa i bez učitavanja servera

    Bilješka

    Odmah ću napraviti rezervu da se ove prednosti mogu smatrati prednostima samo za određenu klasu projekata, Gdje smo znamo sigurno, kojim rječnikom i kojom gramatikom će korisnik raditi. Odnosno, kada ne moramo prepoznati proizvoljan tekst (na primjer, SMS poruku ili upit za pretragu). Inače, prepoznavanje u oblaku je neophodno.

    Tako Android može prepoznati govor bez interneta!
    Da, da... Samo na JellyBean-u. I to samo od pola metra, ne više. I ovo prepoznavanje je isti diktat, samo koristeći mnogo manji model. Tako da ni mi ne možemo njime upravljati i konfigurisati. A šta će nam vratiti sljedeći put, nije poznato. Iako za SMS-ok taman!

    Šta da radimo?

    Implementiraćemo glasovni daljinski upravljač za kućne aparate koji će raditi precizno i ​​brzo, sa nekoliko metara, pa čak i na jeftinom otpadu od kočnica na vrlo jeftinim Android pametnim telefonima, tabletima i satovima.
    Logika će biti jednostavna, ali vrlo praktična. Aktiviramo mikrofon i izgovaramo jedno ili više naziva uređaja. Aplikacija ih prepoznaje i uključuje ili isključuje ovisno o trenutnom stanju. Ili prima stanje od njih i izgovara ga prijatnim ženskim glasom. Na primjer, trenutna temperatura u prostoriji.

    Dosta praktičnih primjena

    Ujutro su, ne otvarajući oči, lupili ekranom pametnog telefona o noćni ormarić i naredili „Dobro jutro!“ - počinje scenario, aparat za kafu se uključuje i zuji, čuje se prijatna muzika, zavese se pomeraju.
    Objesite jeftin (2 hiljade, ne više) pametni telefon u svakoj sobi na zidu. Idemo kući posle posla i komandujemo u prazninu" Smart House! Svetlo, TV! - Šta se dalje dešava, mislim, nije potrebno govoriti.

    Transkripcije



    Gramatika opisuje šta šta korisnik može reći. Da Pocketsphinx zna kako on će je izgovoriti, potrebno je da svaka riječ iz gramatike napiše kako zvuči u odgovarajućem jezičkom modelu. To je transkripcija svaku riječ. To se zove rječnik.

    Transkripcije se opisuju upotrebom posebne sintakse. Na primjer:
    smart uu m n ay j house d oo m

    U principu, ništa komplikovano. Dvostruki samoglasnik u transkripciji označava naglasak. Dvostruki suglasnik je meki suglasnik iza kojeg slijedi samoglasnik. Sve moguće kombinacije za sve zvukove ruskog jezika.

    Jasno je da ne možemo unaprijed opisati sve transkripcije u našoj aplikaciji, jer ne znamo unaprijed imena koja će korisnik dati svojim uređajima. Stoga ćemo takve transkripcije generirati u hodu prema nekim pravilima ruske fonetike. Da biste to učinili, možete implementirati takvu PhonMapper klasu koja može primiti string kao ulaz i generirati ispravnu transkripciju za njega.

    Glasovna aktivacija

    Ovo je sposobnost mašine za prepoznavanje govora da „sluša eter“ sve vreme kako bi odgovorila na unapred definisanu frazu (ili fraze). Svi ostali zvukovi i govor će biti odbačeni. To nije isto što i opisati gramatiku i samo uključiti mikrofon. Neću ovdje iznositi teoriju ovog zadatka i mehaniku kako on funkcionira. Samo da kažem da su nedavno programeri koji rade na Pocketsphinx-u implementirali takvu funkciju, a sada je dostupna iz kutije u API-ju.

    Jedna stvar je svakako vrijedna pomena. Za frazu za aktivaciju ne morate samo navesti transkripciju, već i odabrati odgovarajuću vrijednost praga osjetljivosti. Premala vrijednost će dovesti do puno lažnih pozitivnih rezultata (ovo je kada niste izgovorili frazu za aktivaciju, ali sistem je prepoznao). I previsoko - na imunitet. Stoga je ova postavka od posebnog značaja. Približan raspon vrijednosti - od 1e-1 do 1e-40 ovisno o frazi za aktivaciju.

    Aktivacija blizine

    Ovaj zadatak je specifičan za naš projekat i nije direktno povezan sa prepoznavanjem. Kod se može vidjeti odmah u glavnoj aktivnosti.
    Ona shvata SensorEventListener i u trenutku približavanja (vrijednost senzora je manja od maksimalne vrijednosti), pokreće tajmer, provjeravajući nakon određenog kašnjenja da li je senzor još uvijek blokiran. Ovo se radi kako bi se izbjegli lažni pozitivni rezultati.
    Kada senzor nije ponovo blokiran, zaustavljamo prepoznavanje i dobijamo rezultat (vidi opis ispod).

    Počinjemo sa prepoznavanjem

    Pocketsphinx pruža zgodan API za konfigurisanje i pokretanje procesa prepoznavanja. Ovo su časovi SpechRecognizer i SpeechRecognizerSetup.
    Evo kako izgleda konfiguracija i pokretanje prepoznavanja:

    PhonMapper phonMapper = novi PhonMapper(getAssets().open("dict/ru/hotwords")); Gramatička gramatika = nova gramatika(namena, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = novi DataFiles(getPackageName(), "ru"); Fajl hmmDir = nova datoteka(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); Datoteka jsgf = nova datoteka(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

    Ovdje prvo kopiramo sve potrebne datoteke na disk (Pocketpshinx zahtijeva akustični model, gramatički i transkripcijski rječnik na disku). Zatim se konfiguriše sam mehanizam za prepoznavanje. Navedene su putanje do datoteka modela i rječnika, kao i neki parametri (prag osjetljivosti za frazu za aktivaciju). Zatim se konfiguriše putanja do gramatičke datoteke, kao i fraza za aktivaciju.

    Kao što možete vidjeti iz ovog koda, jedan mehanizam je konfiguriran za prepoznavanje gramatike i aktivacijske fraze odjednom. Zašto se to radi? Tako da možemo brzo prelaziti između onoga što trenutno trebamo prepoznati. Ovako izgleda pokretanje procesa prepoznavanja aktivacijskih fraza:

    MRecognizer.startListening(KWS_SEARCH);
    I ovako - prepoznavanje govora prema zadatoj gramatici:

    MRecognizer.startListening(COMMAND_SEARCH, 3000);
    Drugi argument (opciono) je broj milisekundi nakon kojih će se prepoznavanje automatski prekinuti ako niko ništa ne kaže.
    Kao što vidite, možete koristiti samo jedan motor za rješavanje oba problema.

    Kako doći do rezultata prepoznavanja

    Da biste dobili rezultat prepoznavanja, morate također navesti slušatelja događaja koji implementira sučelje RecognitionListener.
    Ima nekoliko metoda koje poziva pocketsphinx kada se dogodi neki od događaja:
    • onBeginningOfSpeech- motor je čuo neki zvuk, možda je to govor (a možda i nije)
    • onEndOfSpeech- zvuk je završio
    • onPartialResult- postoje srednji rezultati prepoznavanja. Za frazu za aktivaciju, to znači da je radila. Argument Hipoteza
    • onResult- krajnji rezultat prepoznavanja. Ova metoda će biti pozvana nakon što se metoda pozove stani at SpeechRecognizer. Argument Hipoteza sadrži podatke o prepoznavanju (niz i rezultat)

    Implementacijom metoda onPartialResult i onResult na ovaj ili onaj način možete promijeniti logiku prepoznavanja i dobiti konačni rezultat. Evo kako se to radi za našu aplikaciju:

    @Override public void onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @Override public void onPartial)Pothesis hypothesis ( if (hipoteza == null) povratak; tekst niza = hipoteza.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) else ( Log.d(TAG, tekst); ) ) @Override public void onResult(hipoteza hipoteze) (mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); Tekst niza = hipoteza != NULL . , "onResult " + tekst); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( if (tekst != null) ( Toast.makeText(ovo, tekst, Toast.LENGTH_SHORT).show(); process(text != null) ); ) mRecognizer.startListening(KWS_SEARCH); ) )

    Kada primimo događaj onEndOfSpeech, i ako u isto vrijeme prepoznamo naredbu koju treba izvršiti, tada moramo zaustaviti prepoznavanje, nakon čega će onResult biti odmah pozvan.
    U onResult-u morate provjeriti šta je upravo prepoznato. Ako je ovo naredba, onda je trebate pokrenuti za izvršenje i prebaciti motor da prepozna frazu za aktivaciju.
    U onPartialResult-u nas zanima samo prepoznavanje fraze za aktivaciju. Ako ga otkrijemo, odmah započinjemo proces prepoznavanja naredbe. Evo kako to izgleda:

    Privatno sinkronizirano void startRecognition() ( if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); novi ToneGenerator(AudioManager.STREAMGENErator.tMAX ToneVOGENE. TONE_CDMA_PIP, 200); post(400, novi Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000, "List"). komande"); post(4000, mStopRecognitionCallback); ) )); )
    Ovdje prvo puštamo mali signal kako bismo korisniku dali do znanja da smo ga čuli i da smo spremni za njegovu komandu. Za to vrijeme mikrofon mora biti isključen. Stoga počinjemo prepoznavanje nakon malog vremena čekanja (nešto duže od trajanja signala, kako ne bismo čuli njegov eho). Također pokreće nit koja će prisiliti prepoznavanje da se zaustavi ako korisnik predugo priča. U ovom slučaju to je 3 sekunde.

    Kako pretvoriti prepoznati niz u komande

    Pa, sve je već specifično za određenu aplikaciju. U slučaju golog primjera, jednostavno izvlačimo nazive uređaja iz linije, tražimo željeni uređaj i ili mijenjamo njegovo stanje koristeći HTTP zahtjev kontroleru pametne kuće, ili javljamo njegovo trenutno stanje (kao u slučaju termostat). Ova logika se može vidjeti u klasi Controller.

    Kako sintetizirati govor

    Sinteza govora je inverzna operacija prepoznavanja. Ovdje, naprotiv, trebate pretvoriti red teksta u govor kako bi ga korisnik mogao čuti.
    U slučaju termostata, moramo učiniti da naš Android uređaj kaže trenutnu temperaturu. Korištenje API-ja TextToSpeech ovo je prilično jednostavno za napraviti (hvala Googleu za prelijepi ženski TTS za ruski jezik):

    Privatni void speak(Tekst niza) (sinhroniziran (mSpeechQueue) (mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = nova 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(tekst, TextToSpeech.QUEUE_ADD, params); ) )

    Vjerovatno ću reći da je to banalno, ali prije procesa sinteze, potrebno je onemogućiti prepoznavanje. Na nekim uređajima (na primjer, na svim Samsung uređajima) općenito je nemoguće slušati mikrofon i sintetizirati nešto u isto vrijeme.
    Kraj sinteze govora (tj. završetak procesa izgovaranja teksta od strane sintisajzera) može se pratiti u slušaocu:

    Privatni završni teksttospeepepepepepepepepeech.OnetterceCompleteTlistener mutteranceCompletListener = Novi tekstOspeech.OnutterceCopleEpepeech.OnutterceCompleteDlistener () (@OverRide javna nevaljana) (Sinchroniziran (mspeechqueue.Poll (); ako (mseppeechqueue.isempty ()) (mrekognizer.StartListening ( KWS_SEARCH) ; ) ) ) );

    U njemu jednostavno provjeravamo postoji li još nešto u redu sinteze i uključujemo prepoznavanje aktivacijskih fraza ako nema ništa drugo.

    I to je sve?

    Da! Kao što vidite, nije teško brzo i precizno prepoznati govor direktno na uređaju, zahvaljujući prisustvu tako divnih projekata kao što je Pocketsphinx. Pruža vrlo zgodan API koji se može koristiti za rješavanje problema vezanih za prepoznavanje glasovnih naredbi.

    U ovom primjeru smo uvrnuli prepoznavanje na potpuno ispravan zadatak - glasovno upravljanje pametnim kućnim uređajima. Zahvaljujući lokalnoj prepoznatljivosti, postigli smo vrlo veliku brzinu i minimizirali greške.
    Jasno je da se isti kod može koristiti i za druge zadatke vezane za glas. To ne mora biti pametan dom.

  • glasovna kontrola
  • voice engine
  • Dodaj oznake

    Proizvodi i tehnologije:

    Visual Studio, C#, .NET Speech Libraries

    Članak se bavi:

    • dodavanje podrške za prepoznavanje govora konzolnoj aplikaciji;
    • prepoznatljiva obrada govora;
    • Instalacija knjižnica za prepoznavanje govora;
    • poređenje Microsoft.Speech i System.Speech;
    • dodavanje podrške za prepoznavanje govora u Windows Forms aplikaciju.

    Sa pojavom Windows Phone Cortane, ličnog asistenta koji se aktivira govorom (kao i pandan kompanije voća, što ne treba uzalud spominjati), aplikacije koje omogućavaju govor postale su sve važnije u razvoju softvera. U ovom članku ću vam pokazati kako da počnete s prepoznavanjem i sintezom govora u aplikacijama za Windows konzolu, Windows Forms aplikacijama i Windows Presentation Foundation (WPF).

    Imajte na umu da govorne mogućnosti možete dodati i Windows Phone aplikacijama, ASP.NET web aplikacijama, Windows Store aplikacijama, Windows RT-u i Xbox Kinectu, ali tehnike se razlikuju od onih opisanih u ovom članku.

    Dobar način shvatite o čemu će se točno govoriti u ovom članku - pogledajte snimke ekrana dva različita demo programa na pirinač. jedan i 2 . Nakon pokretanja konzolne aplikacije pirinač. jedan odmah izgovara frazu "Budan sam". Naravno, nećete moći da čujete demo aplikaciju dok čitate ovaj članak, tako da prikazuje tekst onoga što računar govori. Korisnik tada izgovara naredbu "Speech on". Demo aplikacija odgovara prepoznatim tekstom, a zatim interno sluša i odgovara na zahtjeve za dodavanjem dva broja.

    Rice. 1. Prepoznavanje i sinteza govora u konzolnoj aplikaciji


    Rice. 2. Prepoznavanje govora u Windows Forms aplikaciji

    Korisnik je tražio od aplikacije da doda jedan i dva, zatim dva i tri. Aplikacija je prepoznala izgovorene komande i davala odgovore na glasovni način. Kasnije ću opisati korisnije načine korištenja prepoznavanja govora.

    Korisnik je tada rekao "Speech off" - glasovna komanda koja deaktivira slušanje komandi za dodavanje brojeva, ali ne isključuje potpuno prepoznavanje govora. Nakon ove verbalne naredbe, sljedeća naredba za sabiranje jedan i dva je zanemarena. Konačno, korisnik je ponovo omogućio slušanje komandi i izgovorio besmislenu naredbu "Klatu barada nikto", koju je aplikacija prepoznala kao naredbu za potpuno deaktiviranje prepoznavanja govora i samoukidanje.

    Na pirinač. 2 prikazuje aplikaciju Windows Forms sa omogućenim lažnim govorom. Ova aplikacija prepoznaje izgovorene komande, ali ne odgovara na njih glasovnim izlazom. Prilikom prvog pokretanja aplikacije, polje za potvrdu Govor uključeno nije odabrano, što ukazuje da prepoznavanje govora nije bilo aktivno. Korisnik je označio ovo polje i zatim rekao "Zdravo". Aplikacija je odgovorila prikazivanjem prepoznatog teksta u ListBox kontroli na dnu prozora.

    Korisnik je tada rekao "Postavi tekstualni okvir 1 na crveno". Aplikacija je prepoznala govor i odgovorila sa "Set text box 1 red", što je skoro (ali ne baš) ono što je korisnik rekao. Iako uključeno pirinač. 2 ne možete ga vidjeti, tekst u TextBox kontroli na vrhu prozora je zaista crven.

    Tada je korisnik rekao: "Molimo, postavite polje za tekst 1 na bijelo". Aplikacija je ovo prepoznala kao "postavi tekstni okvir 1 bijelo" i učinila upravo to. Konačno, korisnik je rekao "Zbogom" i aplikacija je prikazala ovaj tekst, ali nije uradila ništa sa Windows Forms-om, iako je, na primer, mogla da obriše oznaku Speech On.

    Korištenje objekta sintisajzera je prilično jednostavno.

    U sljedećim odjeljcima, provest ću vas kroz proces kreiranja oba demo programa, uključujući instaliranje potrebnih .NET biblioteka govora. Ovaj članak pretpostavlja da imate barem srednji nivo vještina programiranja, ali ništa o prepoznavanju i sintezi govora.

    Dodavanje podrške za prepoznavanje govora konzolnoj aplikaciji

    Da kreirate demo prikazan u pirinač. jedan, pokrenuo sam Visual Studio i napravio novu C# konzolnu aplikaciju pod nazivom ConsoleSpeech. Uspješno sam koristio govorne alate sa Visual Studio 2010 i 2012, ali svaka relativno novija verzija bi trebala raditi. Nakon učitavanja koda šablona u uređivač, preimenovao sam datoteku Program.cs u prozoru Solution Explorer u opisniji ConsoleSpeechProgram.cs, a Visual Studio je za mene preimenovao klasu Program.

    Zatim sam dodao referencu na datoteku Microsoft.Speech.dll, koja se nalazi u C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly. Ovaj DLL je nedostajao na mom računaru i morao sam da ga preuzmem. Instaliranje datoteka potrebnih za dodavanje prepoznavanja govora i sinteze u aplikaciju nije tako trivijalno. Detaljno ću objasniti proces instalacije u sledećem odeljku, ali za sada pretpostavimo da imate Microsoft.Speech.dll na svom sistemu.

    Dodavanjem reference na DLL za govor, uklonio sam sve naredbe using sa vrha koda, osim onog najvišeg nivoa koji ukazuje na sistemski prostor imena. Zatim sam dodao koristeći izraze za imenske prostore Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis i System.Globalization. Prva dva prostora imena su mapirana u DLL govora. Imajte na umu da postoje i prostori imena kao što su System.Speech.Recognition i System.Speech.Synthesis, koji mogu biti zbunjujući. Uskoro ću objasniti razliku između njih. Imenski prostor Globalization je bio dostupan prema zadanim postavkama i nije zahtijevao novu referencu da se doda projektu.

    Cijeli izvorni kod za aplikaciju demo konzole može se naći na pirinač. 3, a dostupan je i u izvornom paketu koji prati ovaj članak. Uklonio sam svo standardno rukovanje greškama kako ne bih zamaglio glavne ideje što je više moguće.

    Rice. 3. Izvorni kod aplikacije demo konzole

    korištenje sistema; korištenje Microsoft.Speech.Recognition; koristeći Microsoft.Speech.Synthesis; koristeći System.Globalization; imenski prostor ConsoleSpeech ( klasa ConsoleSpeechProgram ( static SpeechSynthesizer ss = novi SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool done = false; static bool govorOn = true; static void Main(string args.S) (etOput snizeW.Default args.S); ("\n(Govorim: budan sam)"); ss.Speak("Budan sam"); ​​CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ); sre.SpeechRecognized += sre_SpeechRecognized; Izbori ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("govor uključen"); ch_StartStopCommands.Add("govor isključen"); ch_StartStopCommands"); ch_StartStopCommands. = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = new Grammar(gb_StartStop); Izbori ch_Numbers = novi izbori(); ch_Numbers.Add("1"); ch_Numbers.Add.("Numbers.");Add. Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatI sXplusY = novi GrammarBuilder(); gb_WhatIsXplusY.Append("Šta je"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Gramatika g_WhatIsXplusY = nova gramatika(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); while (done == false) ( ; ) Console.WriteLine("\nHit< enter >zatvoriti shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Glavni statički void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e ) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nPrepoznato: " + txt); if (pouzdanje< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Govor je sada UKLJUČEN"); govorOn = istina; ) if (txt.IndexOf("govor isključen") >= 0) ( Console.WriteLine("Govor je sada ISKLJUČEN"); govorOn = false; ) if (speechOn == false) return; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); done = true; Console.WriteLine("(Speaking: Zbogom)"); ss.Speak("Zbogom"); ) if (txt.IndexOf("Što") >= 0 && txt.IndexOf("plus") >= 0) ( niz riječi = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(words); int sum = num1 + num2; Console.WriteLine("(Govor: " + riječi + " plus " + riječi + " jednako " + sum + ")"); ss.SpeakAsync(riječi + " plus " + riječi + " jednako " + suma); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Nakon upotrebe naredbi, demo kod počinje ovako:

    imenski prostor ConsoleSpeech ( klasa ConsoleSpeechProgram ( static SpeechSynthesizer ss = novi SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool done = false; static bool govorOn = true; static void Main(string args) ( ...

    Objekt SpeechSynthesizer na nivou klase omogućava aplikaciji da sintetiše govor. Objekt SpeechRecognitionEngine omogućava aplikaciji da sluša i prepozna izgovorene riječi ili fraze. Boolean varijabla done određuje kada se aplikacija kao cjelina završava. Logička varijabla speakOn kontrolira da li aplikacija sluša bilo koju naredbu osim naredbe za izlazak iz programa.

    Ideja je da konzolna aplikacija ne prihvata unos sa tastature, tako da uvek sluša komande. Međutim, ako je govor On lažan, prepoznaje se i izvršava samo naredba za izlazak iz programa; ostale komande se prepoznaju, ali se zanemaruju.

    Glavna metoda počinje ovako:

    try ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Govorim: budan sam)"); ss.Speak("Budan sam");

    Instanca objekta SpeechSynthesizer je kreirana kada je deklarisan. Korištenje objekta sintisajzera je prilično jednostavno. Metoda SetOutputToDefaultAudioDevice šalje izlaz na zvučnike povezane na vaš računar (izlaz se takođe može poslati u datoteku). Metoda Speak uzima niz i zatim ga izgovara. Eto kako je to lako.

    Prepoznavanje govora je mnogo teže od njegove sinteze. Glavna metoda se nastavlja kreiranjem objekta prepoznavača:

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

    Objekt CultureInfo prvo specificira jezik koji treba prepoznati, u ovom slučaju engleski engleski. Objekt CultureInfo nalazi se u imenskom prostoru Globalization, na koji smo referencirali pomoću naredbe using. Zatim, nakon što se pozove konstruktor SpeechRecognitionEngine, glasovni unos se dodjeljuje zadanom audio uređaju, najčešće mikrofonu. Imajte na umu da većina laptop računara ima ugrađeni mikrofon, ali desktop računari će zahtevati eksterni mikrofon (koji se ovih dana često kombinuje sa slušalicama).

    Ključna metoda za objekat prepoznavača je rukovalac događaja SpeechRecognized. Kada koristite Visual Studio, ako upišete "sre.SpeechRecognized +=" i sačekate djelić sekunde, IntelliSense će automatski završiti vaš izraz s imenom rukovatelja događaja - sre_SpeechRecognized. Savjetujem vam da pritisnete tipku Tab kako biste prihvatili predloženu opciju i koristite ovo ime prema zadanim postavkama.

    Izbori ch_Numbers = novi izbori(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // sa tehničke tačke gledišta, // ovo je Add(new string ( "4")); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Šta je"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Gramatika g_WhatIsXplusY = nova gramatika(gb_WhatIsXplusY);

    Tri glavna objekta ovdje su izbori, GrammarBuilder predložak i Gramatika koja kontrolira. Kada kreiram gramatiku za prepoznavanje, počinjem navođenjem nekih konkretnih primjera onoga što trebam prepoznati. Recite: "Šta je jedan plus dva?" i "Šta je tri plus četiri?".

    Zatim definišem odgovarajući generički obrazac, kao što je „Šta je plus ? Predložak je GrammarBuilder i specifične vrijednosti koje se prosljeđuju predlošku su skup izbora. Gramatički objekat obuhvata predložak i izbore.

    U demonstraciji ograničavam dodavanje na 1 do 4 i dodajem ih kao nizove u skup izbora. Efikasniji pristup:

    string numbers = novi string( "1", "2", "3", "4" ); Izbori ch_Numbers = novi izbori(brojevi);

    Predstavljam vam manje efikasan pristup kreiranju skupa izbora iz dva razloga. Prvo, dodavanje jednog po jednog reda bio je jedini pristup koji sam vidio u drugim primjerima prepoznavanja govora. Drugo, možda mislite da dodavanje jednog po jednog reda uopšte ne bi trebalo da funkcioniše; Visual Studio IntelliSense pokazuje u realnom vremenu da jedno od preopterećenja Add uzima parametar fraze niza parametara tipa. Ako niste primijetili ključnu riječ params, možda ste pomislili da metoda Add prihvata samo nizove stringova, ali ne i jedan string. Ali nije tako: on prihvata i jedno i drugo. Savjetujem vam da proslijedite niz.

    Kreiranje skupa izbora od uzastopnih brojeva je donekle poseban slučaj i omogućava vam korištenje programskog pristupa kao što je:

    brojevi niza = novi niz; za (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    Nakon kreiranja izbora za popunjavanje slotova GrammarBuilder-a, demo kreira GrammarBuilder, a zatim i kontrolnu Grammar:

    GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Šta je"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Gramatika g_WhatIsXplusY = nova gramatika(gb_WhatIsXplusY);

    Demo program koristi sličan obrazac kada kreira gramatiku za naredbe vezane za start i stop:

    Izbori ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("govor uključen"); ch_StartStopCommands.Add("govor isključen"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = novi GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Gramatika g_StartStop = nova gramatika(gb_StartStop);

    Gramatike se mogu definisati vrlo fleksibilno. Ovdje su naredbe "govor uključen", "govor isključen" i "klatu barada nikto" smještene u jednu gramatiku, jer su logički povezane. Ove tri komande bi se mogle definisati u tri različite gramatike, ili u jednu gramatiku staviti komande "uključi govor" i "isključi", a u drugu naredbu "klatu barada nikto".

    Nakon kreiranja svih objekata Gramatike, stavljate ih u prepoznavač govora i prepoznavanje govora se aktivira:

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

    Argument RecognizeMode.Multiple je potreban kada imate više od jedne gramatike, što će biti slučaj u svim programima osim u najjednostavnijim. Glavna metoda završava se ovako:

    Dok (done == false) ( ; ) Console.WriteLine("\nHit< enter >zatvoriti shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main

    Čudno izgleda prazno dok petlja održava ljusku konzolne aplikacije pokrenutom. Petlja će se prekinuti kada se logički podatak dovršeno na nivou klase postavi na true od strane rukovatelja događaja prepoznavanja govora.

    Obrada prepoznavanja govora

    Kod za rukovanje događajima vezanim za prepoznavanje govora počinje ovako:

    static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nRecognized: " + (conftxtx); " +< 0.60) return; ...

    Prepoznati tekst je pohranjen u svojstvu Result.Text objekta SpeechRecognizedEventArgs. Alternativno, možete koristiti skup Result.Words. Svojstvo Result.Confidence pohranjuje vrijednost između 0,0 i 1,0, što je gruba procjena koliko je izgovoreni tekst usklađen sa bilo kojom gramatikom povezanom sa prepoznavačom. Demo program daje instrukcije rukovaocu događaja da ignoriše tekst sa niskim poverenjem u prepoznati tekst.

    Vrijednosti pouzdanosti u velikoj mjeri zavise od složenosti vaše gramatike, kvaliteta mikrofona i drugih faktora. Na primjer, ako demo samo treba da prepozna brojeve od 1 do 4, tada su vrijednosti pouzdanosti na mom računalu obično oko 0,75. Ali ako gramatika treba da prepozna brojeve od 1 do 100, vrijednosti pouzdanosti padaju na oko 0,25. Ukratko, obično morate eksperimentirati s vrijednostima pouzdanosti da biste dobili dobre rezultate prepoznavanja govora.

    if (txt.IndexOf("govor uključen") >= 0) ( Console.WriteLine("Govor je sada UKLJUČEN"); speakOn = true; ) if (txt.IndexOf("govor isključen") >= 0) ( Konzola .WriteLine("Govor je sada ISKLJUČEN"); govorOn = false; ) if (speechOn == false) return;

    Iako u početku možda nije sasvim očigledno, ova logika bi trebala imati smisla kada razmislite o tome. Zatim se obrađuje tajna naredba za izlaz:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); done = true; Console.WriteLine("(Speaking: Zbogom)"); ss.Speak("Zbogom"); )

    Imajte na umu da mehanizam za prepoznavanje govora zapravo može prepoznati besmislice. Ako Gramatički objekat sadrži riječi koje nisu u ugrađenom rječniku objekta, Grammar pokušava identificirati te riječi kad god je to moguće koristeći semantičku heuristiku i obično je prilično uspješan. Zato sam koristio "klatu" umjesto ispravnog "klaatu" (iz starog naučno-fantastičnog filma).

    Također imajte na umu da od vas nije potrebno obraditi sav tekst prepoznat u gramatici ("klatu barada nikto") - samo trebate imati dovoljno informacija da jedinstveno identificirate gramatičku frazu ("klatu" i "barada").

    If (txt.IndexOf("What") >= 0 && txt.IndexOf("plus") >= 0) ( niz riječi = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(words);int sum = num1 + num2;Console.WriteLine("(Govor: " + riječi + " plus " + riječi + " jednako " + zbroj + ")"); ss.SpeakAsync(words + " plus " + riječi + " jednako " + suma); ) ) // sre_SpeechRecognized ) // Program ) // ns

    Imajte na umu da je tekst u Results.Text osjetljiv na velika i mala slova ("Šta" i "šta"). Nakon prepoznavanja fraze, može se rastaviti na određene riječi. U ovom slučaju, prepoznati tekst je oblika "Šta je x plus y", pa se "Šta" stavlja u riječi, a dva dodana broja (kao nizovi) se pohranjuju u riječi i riječi.

    Instaliranje biblioteka

    Objašnjenje demo programa pretpostavlja da su sve potrebne govorne biblioteke instalirane na vašem računaru. Da biste kreirali i pokrenuli demo programe, potrebno je instalirati četiri paketa: SDK (omogućava kreiranje demonstracija u Visual Studiju), runtime (pokreće demonstracije nakon što se kreiraju), prepoznate i sintetizirane (program izgovara) jezike.

    Da biste instalirali SDK, potražite na webu "Speech Platform 11 SDK". Ovo će vas odvesti na ispravnu stranicu u Microsoft centru za preuzimanje ( pirinač. četiri). Klikom na dugme Preuzmi, vidjet ćete opcije prikazane u pirinač. 5. SDK dolazi u 32-bitnim i 64-bitnim verzijama. Preporučujem vam da koristite 32-bitnu verziju, bez obzira na bitnost vašeg sistema. 64-bitna verzija ne komunicira s nekim aplikacijama.


    Rice. 4. Glavna stranica za instalaciju SDK-a u Microsoft centru za preuzimanje


    Rice. 5. Instaliranje SDK za govor

    Ne treba vam ništa osim jedne .msi datoteke pod x86 (za 32-bitne sisteme). Odabirom ove datoteke i klikom na dugme Dalje, možete pokrenuti instalater direktno odavde. Biblioteke govora ne daju mnogo povratnih informacija o tome kada je instalacija završena, tako da ne tražite nikakve poruke o uspjehu.


    Rice. 6. Instaliranje runtimea

    Izuzetno je važno odabrati istu platformsku verziju (11 u demo-u) i bitnu dubinu (32 ili 64) kao SDK. Opet, toplo preporučujem 32-bitnu verziju, čak i ako ste na 64-bitnom sistemu.

    Zatim možete postaviti jezik prepoznavanja. Stranica za preuzimanje je na pirinač. 7. Demo koristi datoteku MSSpeech_SR_en-us_TELE.msi (englesko-SAD). SR označava prepoznavanje govora, a TELE znači telefoniju; to znači da je jezik koji se prepoznaje dizajniran da radi sa audio ulazom lošeg kvaliteta, kao što je telefonski ili desktop mikrofon.


    Rice. 7. Podešavanje prepoznatog jezika

    Konačno, možete podesiti jezik i glas za sintezu govora. Stranica za preuzimanje je na pirinač. osam. Demo program koristi datoteku MSSpeech_TTS_en-us_Helen.msi. TTS (text-to-speech) je u suštini sinonim za sintezu govora. Obratite pažnju na dva dostupna glasa engleski, američki Postoje i drugi engleski glasovi, ali ne i američki. Kreiranje datoteka jezika sinteze je veoma težak zadatak. Međutim, možete kupiti i instalirati druge glasove od mnogih kompanija.


    Rice. 8. Podešavanje glasa i jezika sinteze

    Zanimljivo, iako su jezik za prepoznavanje govora i jezik sinteze glasa/govora zapravo sasvim različite stvari, oba paketa su opcije na istoj stranici za preuzimanje. Korisničko sučelje centra za preuzimanje omogućava vam da označite i jezik za prepoznavanje i jezik sinteze, ali pokušaj da ih instalirate u isto vrijeme pokazao se katastrofalnim za mene, pa preporučujem da ih instalirate zasebno.

    Poređenje Microsoft.Speech sa System.Speech

    Ako ste novi u prepoznavanju i sintezi govora za Windows aplikacije, lako se možete zbuniti dokumentacijom jer postoji nekoliko govornih platformi. Konkretno, pored biblioteke Microsoft.Speech.dll koju koriste demonstracije u ovom članku, postoji biblioteka System.Speech.dll koja je dio Windows operativnog sistema. Dvije biblioteke su slične u smislu da su njihovi API-ji gotovo, ali ne i potpuno identični. Dakle, ako potražite primjere obrade govora na Internetu i vidite isječke koda, a ne kompletne programe, uopće nije očigledno da li se ovaj primjer odnosi na System.Speech ili Microsoft.Speech.

    Ako ste novi u obradi govora, koristite biblioteku Microsoft.Speech umjesto System.Speech da dodate govornu podršku vašoj .NET aplikaciji.

    Iako obje biblioteke dijele zajedničku jezgru kodne baze i slične API-je, one su definitivno različite. Neke ključne razlike su sažete u tab. jedan.

    Tab. 1. Glavne razlike između Microsoft.Speech i System.Speech

    System.Speech DLL je dio OS-a, tako da je instaliran na svakom Windows sistemu. Microsoft.Speech DLL (i pridružena vremena izvođenja i jezici) moraju se preuzeti i instalirati na sistem. Prepoznavanje pomoću System.Speech obično zahtijeva učenje specifično za korisnika, kada korisnik pročita neki tekst, a sistem nauči razumjeti karakteristike izgovora ovog korisnika. Prepoznavanje pomoću Microsoft.Speech radi odmah za svakog korisnika. System.Speech može prepoznati gotovo svaku riječ (ovo se zove slobodni diktat). Microsoft.Speech će prepoznati samo riječi i fraze koje se nalaze u objektu Grammar definiranom u programu.

    Dodavanje podrške za prepoznavanje govora u Windows Forms aplikaciju

    Proces dodavanja podrške za prepoznavanje i sintezu govora u Windows Forms ili WPF aplikaciju sličan je onom kod konzolne aplikacije. Za kreiranje demo programa prikazanog u pirinač. 2, pokrenuo sam Visual Studio, napravio novu C# Windows Forms aplikaciju i preimenovao je u WinFormSpeech.

    Nakon učitavanja koda šablona u uređivač, dodao sam referencu na datoteku Microsoft.Speech.dll u prozor Solution Explorer - baš kao što sam učinio u programu konzole. Na vrhu izvornog koda, uklonio sam nepotrebne izraze using, ostavljajući samo reference na imenske prostore System, Data, Crtež i Forms. Zatim sam dodao dva izraza koristeći za imenske prostore Microsoft.Speech.Recognition i System.Globalization.

    Demonstracija zasnovana na Windows Forms-u ne koristi sintezu govora, tako da se ne povezujem sa bibliotekom Microsoft.Speech.Synthesis. Dodavanje sinteze govora u aplikaciju Windows Forms isto je kao dodavanje sinteze govora u aplikaciju konzole.

    U Visual Studio-u, u modu dizajna, prevukao sam kontrole TextBox, CheckBox i ListBox na obrazac. Dvaput sam kliknuo na CheckBox i Visual Studio je automatski generisao kostur CheckChanged metod rukovanja događajima.

    Podsjetimo da je program demo konzole odmah počeo osluškivati ​​izgovorene komande i nastavio to činiti sve dok nije prekinut. Ovaj pristup se takođe može primeniti u Windows Forms aplikaciji, ali sam umesto toga odlučio da dozvolim korisniku da uključi i isključi prepoznavanje govora koristeći CheckBox kontrolu (tj. polje za potvrdu).

    Prikazan je izvorni kod u datoteci Form1.cs demo gdje je definirana djelomična klasa pirinač. 9. Objekt mašine za prepoznavanje govora je deklariran i instanciran kao član Form-a. U konstruktoru obrasca spajam rukovalac događaja SpeechRecognized, a zatim kreiram i učitavam dva Grammars objekta:

    public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Gramatika g_HelloGoodbye = GetHelloGoodbyeGrammar(); Gramatika g_SetTextBox1); Grammar g_SetTextBox. / sre.RecognizeAsync() je // u alatu za obradu događaja CheckBox)

    Rice. 9. Dodavanje podrške za prepoznavanje govora u Windows Forms

    korištenje sistema; koristeći System.Data; koristeći System.Drawing; koristeći System.Windows.Forms; korištenje Microsoft.Speech.Recognition; koristeći System.Globalization; imenski prostor WinFormSpeech ( javna parcijalna klasa Form1: Form ( static CultureInfo ci = new CultureInfo("en-us"); static SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci); public Form1() ( InitializeComponent(); Default sre.SetInput); .SpeechRecognized += sre_SpeechRecognized; Gramatika g_HelloGoodbye = GetHelloGoodbyeGrammar(); Gramatika g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync() sre.LoadGrammarAsync() sre.LoadGrammarAsync() ;) sre.LoadGrammarAsync()); obrađivač Gramatika GetHelloGoodbyeGrammar() (Izbori ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("hello"); ch_HelloGoodbye.Add("zbogom"); GrammarBuilder gb_result = new GrammarloBuilder(Good GrammarloBuilder); return g_result; ) static Grammar GetTextBox1TextGrammar() (Izbori ch_Colors = new Choices(); ch_Colors.Add(novi niz ( "red", "white", "blue" )); GrammarBuilder gb_r rezultat = novi GrammarBuilder(); gb_result.Append("postavite tekstualni okvir 1"); gb_result.Append(ch_Colors); Gramatika g_result = nova gramatika(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) // disabled sreAsyc)Cogancenize sreAsync)C void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("Čuo sam da si rekao: " + txt); ))); // WinForm specificira if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) ( niz riječi = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = riječi; ))); // Specifičan WinForm ) ) ) // Form ) // ns

    Mogao bih direktno kreirati dva Grammar objekta, kao u konzolnom programu, ali umjesto toga, da bi kod bio malo jasniji, definirao sam dvije pomoćne metode (GetHelloGoodbyeGrammar i GetTextBox1TextGrammar) koje obavljaju posao.

    static Grammar GetTextBox1TextGrammar() (Izbori ch_Colors = new Choices(); ch_Colors.Add(new string ( "red", "white", "blue" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("Text za postavljanje rezultata"). box 1"); gb_result.Append(ch_Colors); Gramatika g_result = nova gramatika(gb_result); return g_result; )

    Ova pomoćna metoda će prepoznati frazu "postavi tekstualni okvir 1 crveno". Međutim, od korisnika se ne traži da precizno izgovori ovu frazu. Na primjer, mogao bi reći: "Molimo, postavite tekst u tekstualni okvir 1 na crveno", a govorna mašina bi i dalje prepoznala frazu kao "postavite tekstualni okvir 1 crveno" - iako s nižom vrijednošću pouzdanosti nego s tačnim podudaranjem sa Gramatički šablon. Drugim riječima, kada kreirate Gramatičke objekte, ne morate uzeti u obzir sve varijacije fraze. Ovo drastično pojednostavljuje upotrebu prepoznavanja govora.

    Obrađivač događaja za CheckBox je definiran ovako:

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

    Objekt mašine za prepoznavanje govora, sre (mašina za prepoznavanje govora), uvijek postoji za vrijeme trajanja Windows Forms aplikacije. Ovaj objekt se aktivira i deaktivira pozivima metodama RecognizeAsync i RecognizeAsyncCancel kada korisnik u skladu s tim uključi CheckBox.

    Definicija SpeechRecognized obrađivača događaja počinje sa:

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

    Pored više ili manje često korišćenih svojstava Result.Text i Result.Confidence, objekat Result ima nekoliko drugih korisnih, ali složenijih svojstava koje biste možda želeli da istražite; na primjer homofoni i zamjenske jedinice riječi. Osim toga, mehanizam za prepoznavanje govora pruža neke korisne događaje kao što je SpeechHypothesized.

    this.Invoke((Action)(() => listBox1.Items.Add("Čuo sam da kažete: " + txt)));

    Teoretski, korišćenje MethodInvoker delegata je malo efikasnije od korišćenja delegata Action u ovoj situaciji, pošto je MethodInvoker deo imenskog prostora Windows.Forms i stoga je specifičan za Windows Forms aplikacije. Delegat akcije je svestraniji. Ovaj primjer pokazuje da možete u potpunosti manipulirati Windows Forms aplikacijom putem mehanizma za prepoznavanje govora - ovo je nevjerovatno moćna i korisna funkcija.

    Zaključak

    Informacije navedene u ovom članku trebale bi vas odmah pokrenuti ako želite istražiti sintezu i prepoznavanje govora u .NET aplikacijama. Ovladavanje samom tehnologijom nije teško kada prođete neravnine osnovno obrazovanje i ugradnju komponenti. Pravi izazov u sintezi i prepoznavanju govora je razumijevanje kada je to zaista korisno.

    U slučaju konzolnih programa, možete kreirati zanimljive međusobne dijaloge u kojima korisnik postavlja pitanje, a program odgovara, što u suštini rezultira okruženjem sličnim Cortani. Morate biti malo oprezni jer kada govor izađe iz zvučnika vašeg računara, mikrofon će ga uhvatiti i ponovo će ga moći prepoznati. I sam sam bio u prilično smiješnim situacijama kada sam postavio pitanje, aplikacija ga je prepoznala i odgovorila, ali izgovoreni odgovor je pokrenuo sljedeći događaj prepoznavanja i završio sam sa smiješnom beskrajnom govornom petljom.

    Druga moguća upotreba govora u konzolnom programu je prepoznavanje komandi poput "Pokreni Notepad" i "Pokreni Word". Drugim riječima, takav konzolni program može se koristiti na vašem računalu za obavljanje radnji koje bi inače zahtijevale mnogo manipulacija tipkovnicom i mišem.

    James McCaffrey(Dr. James McCaffrey) radi za Microsoft Research u Redmondu, Washington. Učestvovao u kreiranju nekoliko Microsoft proizvoda, uključujući Internet Explorer i Bing. Može se kontaktirati na [email protected].

    Želio bih da se zahvalim stručnjacima Microsoft Research Robu Gruenu, Marku Marronu i Curtisu von Vehu na recenziji ovog članka.

    Ovaj telefon ima prepoznavanje govora ili glasovni unos, ali radi samo preko interneta, povezujući se na Google usluge. Ali telefon se može naučiti da prepoznaje govor bez interneta, pogledat ćemo kako omogućiti prepoznavanje ruskog jezika u offline. Morate imati instalirane dvije aplikacije da bi ova metoda funkcionirala. Glasovna pretraga i Google pretraga, iako su ovi programi već prisutni u fabričkom firmveru.

    Za firmver

    Idite na podešavanja telefona i izaberite

    Odabiremo ruski jezik i preuzimamo ga.

    Za firmver 2.8B

    U novom firmveru, stavka menija " Offline prepoznavanje govora"nestao.

    Ako ste prije ažuriranja firmvera imali instalirane vanmrežne pakete, a niste brisali (resetovali postavke) tokom ažuriranja, onda ih je trebalo sačuvati. U suprotnom, moraćete da se vratite na firmver 2.2 , instalirajte glasovne pakete i tek onda ažurirajte sistem na 2.8B.

    Za Rev.B uređaje

    Instaliramo ažuriranje putem oporavka i uživamo u prepoznavanju glasa u oylineu.

    2. Preuzmite bazu za ruski govor i kopirajte je na SD karticu

    Preuzmite Russian_offline.zip 1301

    3. Uđite u oporavak držeći (Jačina + i Uključeno) dok je telefon isključen.

    4. Odaberite Primijenite ažuriranje sa vanjske memorije i izaberite preuzetu arhivu.

    Nijedan program ne može u potpunosti zamijeniti ručni rad prepisivanja snimljenog govora. Međutim, postoje rješenja koja mogu značajno ubrzati i olakšati prevođenje govora u tekst, odnosno pojednostaviti transkripciju.

    Transkripcija je snimanje audio ili video datoteke u tekstualnom obliku. Na internetu postoje plaćeni zadaci, kada se izvođaču isplati određena svota novca za prepisivanje teksta.

    Prevod govora u tekst je koristan

    • studenti da prevedu snimljena audio ili video predavanja u tekst,
    • blogeri vodeći web sajtovi i blogovi,
    • pisci, novinari da pišu knjige i tekstove,
    • informacioni biznismeni kojima je potreban tekst nakon webinara, govora itd.,
    • ljudi kojima je teško kucati - mogu izdiktirati pismo i poslati ga rođacima ili prijateljima,
    • druge opcije.

    Opisat ćemo najefikasnije alate dostupne na PC-u, mobilnim aplikacijama i online servisima.

    1 Sajt speakpad.ru

    Ovo je online usluga koja vam omogućava da prevedete govor u tekst putem Google Chrome pretraživača. Servis radi sa mikrofonom i sa gotovim fajlovima. Naravno, kvalitet će biti mnogo veći ako koristite eksterni mikrofon i sami diktirate. Međutim, usluga radi dobar posao čak i sa YouTube video zapisima.

    Kliknite na "Omogući snimanje", odgovorite na pitanje o "Korišćenje mikrofona" - za to kliknite "Dozvoli".

    Dugačka instrukcija o tome kako koristiti uslugu može se sažeti klikom na dugme 1 na sl. 3. Oglašavanja se možete riješiti jednostavnom registracijom.

    Rice. 3. Servisna govorna tabla

    Gotov rezultat je lako urediti. Da biste to učinili, morate ručno ispraviti istaknutu riječ ili je ponovo izdiktirati. Rezultati rada se pohranjuju u lični račun, možete ih preuzeti i na svoj računar.

    Lista video tutorijala o radu sa govornom podlogom:

    Video zapise možete transkribovati sa Youtube-a ili sa svog računara, međutim, trebat će vam mikser, više detalja:

    Video "audio transkripcija"

    Usluga radi na sedam jezika. Postoji mali minus. Leži u činjenici da ako trebate transkribovati gotovu audio datoteku, tada se njen zvuk distribuira na zvučnike, što stvara dodatne smetnje u obliku eha.

    2 Servisni diktat.io

    Prekrasan online servis koji će vam omogućiti da besplatno i jednostavno prevedete govor u tekst.

    Rice. 4. Servisni diktat.io

    1 na sl. 4 - Ruski jezik se može izabrati na kraju stranice. U pregledniku Google Chrome odabran je jezik, ali u Mozilli iz nekog razloga ne postoji takva mogućnost.

    Važno je napomenuti da je implementirana mogućnost automatskog spremanja gotovog rezultata. Ovo će spriječiti slučajno brisanje kao rezultat zatvaranja kartice ili pretraživača. Ova usluga ne prepoznaje gotove datoteke. Radi sa mikrofonom. Morate da imenujete znakove interpunkcije kada diktirate.

    Tekst je sasvim korektno prepoznat, nema pravopisnih grešaka. Znakove interpunkcije možete sami umetnuti sa tastature. Gotov rezultat možete sačuvati na vašem računaru.

    3 RealSpeaker

    Ovaj program vam omogućava da lako prevedete ljudski govor u tekst. Dizajniran je za rad na različitim sistemima: Windows, Android, Linux, Mac. Uz njegovu pomoć možete pretvoriti govor koji zvuči u mikrofon (na primjer, može se ugraditi u laptop), kao i snimljen u audio fajlovima.

    Može da percipira 13 jezika svijeta. Postoji beta verzija programa koja radi kao online usluga:

    Morate pratiti gornji link, odabrati ruski jezik, učitati svoj audio ili video fajl na online servis i platiti njegovu transkripciju. Nakon transkripcije možete kopirati primljeni tekst. Što je veći fajl za transkripciju, to će više vremena biti potrebno za njegovu obradu, više detalja:

    U 2017. godini postojala je besplatna opcija transkripcije koristeći RealSpeaker, 2018. godine takva mogućnost ne postoji. Veoma je neugodno što je transkribovana datoteka dostupna svim korisnicima za preuzimanje, možda će to biti dovršeno.

    Kontakti programera (VKontakte, Facebook, Youtube, Twitter, e-pošta, telefon) programa mogu se naći na stranici njegove web stranice (tačnije, u podnožju stranice):

    4 Speechlogger

    Alternativa prethodnoj aplikaciji za mobilne uređaje koji rade na Androidu. Besplatno dostupno u trgovini aplikacija:

    Tekst se uređuje automatski, u njega se stavljaju znaci interpunkcije. Odlično za diktiranje bilješki ili sastavljanje spiskova. Kao rezultat toga, tekst će se pokazati vrlo pristojnog kvaliteta.

    5 Zmajev diktat

    Ovo je aplikacija koja se besplatno distribuira za mobilne uređaje kompanije Apple.

    Program može raditi sa 15 jezika. Omogućava vam da uredite rezultat, odaberete sa liste prave reči. Potrebno je jasno izgovarati sve zvukove, ne praviti nepotrebne pauze i izbjegavati intonaciju. Ponekad postoje greške u završecima riječi.

    Aplikaciju Dragon Dictation vlasnici koriste, na primjer, za diktiranje liste za kupovinu u radnji dok se kreću po stanu. Doći ću tamo, moći će se pogledati tekst u napomeni i nema potrebe da slušam.

    Koji god program da koristite u svojoj praksi, budite spremni da još jednom provjerite rezultat i izvršite određena prilagođavanja. Ovo je jedini način da dobijete besprijekoran tekst bez grešaka.

    Takođe korisne usluge:

    Dobijajte najnovije članke o kompjuterskoj pismenosti direktno u inbox.
    Već više 3.000 pretplatnika

    .

    Ažurirano: ponedeljak, 31. jul 2017

    Kakve veze polufantastična ideja razgovora sa kompjuterom ima sa profesionalnom fotografijom? Gotovo nikakve, ako niste ljubitelj ideje o beskrajnom razvoju cjelokupnog tehničkog okruženja čovjeka. Zamislite na trenutak da dajete glasovne naredbe svojoj kameri da promijeni žižnu daljinu i da kompenzaciju ekspozicije učinite pola koraka plus. Daljinsko upravljanje kamerom je već implementirano, ali tamo morate nečujno pritisnuti dugmad, a ovdje je slušni fotik!

    Postala je tradicija da se kao primjer ljudske glasovne komunikacije sa kompjuterom navodi neki fantastični film, pa barem "Svemirska odiseja 2001" u režiji Stenlija Kjubrika. Tamo, kompjuter na brodu ne samo da vodi smislen dijalog sa astronautima, već može da čita sa usana kao gluva osoba. Drugim riječima, mašina je naučila da prepoznaje ljudski govor bez grešaka. Možda će nekome biti suvišno daljinsko glasovno upravljanje kamerom, ali mnogima bi se dopala ova fraza "Skini nas dušo" i slika cijele porodice na pozadini palme je spremna.

    Eto, ovdje sam odao počast tradiciji, malo maštao. Ali, govoreći od srca, ovaj članak je bilo teško napisati, a sve je počelo poklonom u obliku pametnog telefona sa Android 4 OS-om. Ovaj model HUAWEI U8815 ima mali ekran osetljiv na dodir od četiri inča i tastaturu na ekranu. Pomalo je neobično kucati na njemu, ali se pokazalo da nije posebno potrebno. (slika 01)

    1. Prepoznavanje glasa u pametnom telefonu na Android OS

    Dok sam isprobavao novu igračku, primijetio sam grafiku mikrofona u traci za pretraživanje. Google i na tastaturi u Notes. Ranije me nije zanimalo šta ovaj simbol označava. Vodio sam razgovore Skype i kucali slova na tastaturi. To je ono što većina korisnika interneta radi. Ali kako su mi kasnije objasnili, u pretraživaču Google dodana je glasovna pretraga na ruskom i pojavili su se programi koji vam omogućavaju da diktirate kratke poruke kada koristite pretraživač Chrome.

    Rekao sam frazu od tri riječi, program ih je identificirao i pokazao u ćeliji s plavom pozadinom. Bilo je nešto za čuditi, jer su sve riječi bile ispravno napisane. Ako kliknete na ovu ćeliju, fraza se pojavljuje u tekstualnom polju android notepad-a. Pa je rekao nekoliko fraza i poslao poruku asistentu putem SMS-a.


    2. Kratka istorija programa za prepoznavanje glasa.

    Za mene nije bilo otkriće da savremeni napredak u oblasti glasovne kontrole omogućava da date komande kućanskih aparata, auto, robot. Komandni režim je uveden u prethodnim verzijama Windows, OS/2 i Mac OS. Video sam programe za razgovore, ali kakva je korist od njih? Možda je moja posebnost što mi je lakše da govorim nego da kucam po tastaturi, a na mobilnom ne mogu da kucam baš ništa. Morate snimiti kontakte na laptopu sa normalnom tastaturom i prenijeti preko USB kabla. Ali da samo govorim u mikrofon i kompjuter sam otkucava tekst bez grešaka - ovo je bio san za mene. Atmosferu beznađa potkrepile su diskusije na forumima. Svuda su imali tako tužnu misao:

    „Međutim, u praksi, do sada, programi za stvarno prepoznavanje govora (pa čak i na ruskom) praktično ne postoje i očigledno neće biti kreirani uskoro. Štoviše, čak ni obrnuti zadatak prepoznavanja - sinteza govora, koji je, čini se, mnogo jednostavniji od prepoznavanja, nije u potpunosti riješen. (ComputerPress №12, 2004)

    „Do danas ne postoje normalni programi za prepoznavanje govora (ne samo ruski), jer je zadatak prilično težak za računar. A najgore je to što mehanizam prepoznavanja riječi od strane osobe nije realizovan, tako da se nema na čemu graditi pri kreiranju programa za prepoznavanje. (Još jedna diskusija na forumu).

    Istovremeno, pregledi programa za unos teksta na engleskom jeziku pokazali su jasne uspjehe. Na primjer, IBM ViaVoice 98 Executive Edition imali osnovni rečnik od 64.000 reči i mogućnost dodavanja istog broja sopstvenih reči. Procenat prepoznavanja riječi bez obuke programa iznosio je oko 80%, a naknadnim radom sa određenim korisnikom dostigao je 95%.

    Od programa za prepoznavanje ruskog jezika, vrijedi istaknuti "Gorynych" - dodatak na engleskom jeziku Dragon Dictate 2.5. O pretrazi, a potom i o "bitci sa pet Gorynych-a" ispričat ću u drugom dijelu pregleda. Prvo sam pronašao "Engleskog zmaja".

    3. Program za prepoznavanje kontinuiranog govora "Dragon Naturally Speaking"

    Moderna verzija programa kompanije Nuance ispostavilo se da sam sa mojim starim prijateljem sa Minskog instituta za strane jezike. Donijela ga je sa putovanja u inostranstvu, i kupila, misleći da bi mogla biti "kompjuterska sekretarica". Ali nešto nije radilo, a program je ostao gotovo zaboravljen na laptopu. Zbog nedostatka bilo kakvog razumljivog iskustva, morala sam sama ići kod svog prijatelja. Sav ovaj poduži uvod je neophodan za pravilno razumijevanje zaključaka koje sam izveo.

    Puno ime mog prvog zmaja je bilo: . Program je na engleskom i sve je jasno i bez priručnika. Prvi korak je kreiranje profila određenog korisnika kako bi se odredile karakteristike zvuka riječi u njegovoj izvedbi. Što sam i uradio - bitne su godine govornika, država, posebnosti izgovora. Moj izbor je: 22-54 godine, engleski UK, standardni izgovor. Slijedi nekoliko prozora u kojima postavljate mikrofon. (slika 04)

    Sljedeća faza u ozbiljnim programima za prepoznavanje govora je obuka za određeni izgovor određene osobe. Pozivamo vas da odaberete prirodu teksta: moj izbor je kratka instrukcija o diktatu, ali možete i "naručiti" humorističnu priču.

    Suština ove faze rada sa programom je izuzetno jednostavna - tekst se prikazuje u prozoru, iznad njega je žuta strelica. Uz pravilan izgovor, strelica se kreće kroz fraze, a na dnu se nalazi traka napretka treninga. Konverzacijski engleski je bio prilično zaboravljen, tako da sam se teško kretao. Vrijeme je također bilo ograničeno – uostalom, kompjuter nije bio moj i morao sam prekinuti trening. Ali prijateljica je rekla da je uradila test za manje od pola sata. (slika 05)

    Odbijajući da prilagodim program svom izgovoru, otišao sam do glavnog prozora i pokrenuo ugrađeni uređivač teksta. Izgovarao je odvojene riječi iz nekih tekstova koje je pronašao na kompjuteru. Te riječi koje je rekao ispravno, program je odštampao, one koje je rekao loše, zamijenio je nečim “engleskim”. Nakon što je jasno izgovorio komandu „izbriši liniju“ na engleskom, program ju je ispunio. To znači da sam ispravno pročitao komande, a program ih prepoznaje bez prethodne obuke.

    Ali bilo mi je važno kako ovaj "zmaj" piše na ruskom. Kao što ste shvatili iz prethodnog opisa, prilikom obuke programa možete odabrati samo engleski tekst, tamo jednostavno nema ruskog teksta. Jasno je da neće uspjeti trenirati prepoznavanje ruskog govora. Na sljedećoj fotografiji možete vidjeti koju frazu je program otkucao kada je izgovorio rusku riječ "Zdravo". (slika 06)

    Rezultat komunikacije s prvim zmajem ispao je pomalo komičan. Ako pažljivo pročitate tekst na službenoj web stranici, možete vidjeti englesku "specijalizaciju" ovog softverskog proizvoda. Osim toga, prilikom učitavanja čitamo u prozoru programa "Engleski". Pa zašto je sve ovo bilo potrebno? Jasno je da su krivi forumi i glasine...

    Ali postoji i korisno iskustvo. Moja prijateljica je tražila da vidi u kakvom je stanju njen laptop. Nekako polako je počeo da radi. To nije iznenađujuće - sistemska particija je imala samo 5% slobodnog prostora. Prilikom brisanja nepotrebnih programa vidio sam da službena verzija zauzima više od 2,3 GB. Ovaj broj će nam trebati kasnije. (slika.07)



    Prepoznavanje ruskog govora, kako se ispostavilo, nije bio trivijalan zadatak. U Minsku sam uspeo da pronađem "Gorynych" od prijatelja. Dugo je tražio disk u svom starom ruševinu i, prema njegovim riječima, ovo je službena publikacija. Program se odmah instalirao i saznao sam da njegov rečnik sadrži 5000 ruskih reči plus 100 komandi i 600 engleskih reči plus 31 komandu.

    Prvo morate podesiti mikrofon, što sam i uradio. Onda sam otvorio rečnik i dodao reč "pregled" jer to nije bilo u rječniku programa. Pokušao sam da govorim jasno, monotono. Konačno, otvorio sam program Gorynych Pro 3.0, uključio način diktiranja i dobio ovu listu "riječi koje zvuče slično". (slika.09)

    Rezultat me zbunio, jer se jasno razlikovao na gore od rada Android pametnog telefona, pa sam odlučio isprobati druge programe iz " Google Chrome web trgovina". I odložio je bavljenje "zmijama gorynych" za kasnije. Mislio sam ovo odlaganje radnja u izvornom ruskom duhu

    5. Googleove glasovne mogućnosti

    Da biste radili sa glasom na običnom računaru sa operativnim sistemom Windows, moraćete da instalirate pretraživač google chrome. Ako u njemu radite na internetu, onda u donjem desnom uglu možete kliknuti na link trgovine softver. Tamo sam besplatno našao dva programa i dva proširenja za glasovni unos teksta. Programi se pozivaju "Glasovna bilježnica" i "Voysnot - glas u tekst". Nakon instalacije, mogu se naći na kartici "aplikacije" vaš pretraživač "Chromium". (slika.10)

    Ekstenzije se pozivaju "Haću riječ za Google glasovno pretraživanje (Beta) 0.1.0.5" i "Tekst za glasovni unos - Speechpad.ru 5.4". Nakon instalacije, mogu se isključiti ili izbrisati na kartici "Proširenja".(slika.11)

    VoiceNote. Na kartici aplikacije u pregledniku Chrome dvaput kliknite na ikonu programa. Otvoriće se dijaloški okvir kao što je prikazano na slici ispod. Klikom na ikonu mikrofona izgovarate kratke fraze u mikrofon. Program šalje vaše riječi serveru za prepoznavanje govora i upisuje tekst u prozor. Sve riječi i fraze prikazane na ilustraciji otkucane su iz prvog pokušaja. Očigledno, ova metoda radi samo s aktivnom internetskom vezom. (slika.12)

    Glasovna beležnica. Ako pokrenete program na kartici aplikacija, otvorit će se nova kartica Internet stranice Speechpad.ru. Postoji detaljno uputstvo za korišćenje ove usluge i kompaktan obrazac. Ovo posljednje je prikazano na donjoj ilustraciji. (slika.13)

    Glasovni unos text vam omogućava da svojim glasom popunite tekstualna polja internetskih stranica. Na primjer, otišao sam na svoju stranicu Google+. U polju za unos nove poruke kliknite desnim tasterom miša i izaberite "SpeechPad". Okvir za unos ružičaste boje kaže da možete diktirati svoj tekst. (slika.14)

    Google glasovno pretraživanje omogućava pretraživanje glasom. Kada instalirate i aktivirate ovu ekstenziju, u traci za pretragu se pojavljuje simbol mikrofona. Kada ga pritisnete, pojavit će se simbol u velikom crvenom krugu. Samo izgovorite frazu za pretraživanje i ona će se pojaviti u rezultatima pretraživanja. (slika.15)

    Važna napomena: da bi mikrofon radio sa Chrome ekstenzijama, morate dozvoliti pristup mikrofonu u postavkama preglednika. Podrazumevano je onemogućen iz sigurnosnih razloga. Dodaj Podešavanja→ Lični podaci→ Podešavanja sadržaja. (Da biste pristupili svim postavkama na kraju liste, kliknite Pokaži dodatna podešavanja) . Otvoriće se dijaloški okvir Postavke sadržaja stranice. Odaberite stavku na listi Multimedija→mikrofon.

    6. Rezultati rada sa ruskim programima za prepoznavanje govora

    Malo iskustvo u korišćenju programa za unos teksta putem glasa pokazalo je odličnu implementaciju ove funkcije na serverima jedne internet kompanije Google. Bez prethodne obuke, riječi se prepoznaju ispravno. To ukazuje da je problem prepoznavanja ruskog govora riješen.

    Sada možemo reći da je to rezultat razvoja Google bit će novi kriterij za ocjenjivanje proizvoda drugih proizvođača. Želio bih da sistem prepoznavanja radi van mreže bez kontakta sa serverima kompanije - to je praktičnije i brže. Ali kada će biti objavljen nezavisni program za rad sa kontinuiranim tokom ruskog govora, nije poznato. Vrijedi, međutim, pretpostaviti da će s mogućnošću treniranja ove "kreacije" biti pravi proboj.

    Programi ruskih programera "Gorynych", "diktograf" i "borba" Detaljnije ću pisati u drugom dijelu ove recenzije. Ovaj članak je pisan vrlo sporo iz razloga što je potraga za originalnim diskovima sada otežana. Trenutno već imam sve verzije ruskog softvera za prepoznavanje glasa u tekst, osim Combat 2.52. Niko od mojih prijatelja ili kolega nema ovaj program, a ja imam samo nekoliko pohvalnih recenzija na forumima. Istina, postojala je tako čudna opcija - preuzimanje "Combat" putem SMS-a, ali mi se ne sviđa. (slika 16)


    Kratak video klip će vam pokazati kako funkcioniše prepoznavanje govora na pametnom telefonu sa Android OS-om. Karakteristika glasovnog biranja je potreba za povezivanjem na Google servere. Stoga bi internet trebao raditi za vas



    Slični članci