Paano paganahin ang voice recognition offline. Napakabilis na speech recognition nang walang mga server gamit ang isang tunay na halimbawa Data para sa speech recognition offline package Russian

Walang programa ang maaaring ganap na palitan ang manu-manong gawain ng pag-transcribe ng naitala na pananalita. Gayunpaman, may mga solusyon na maaaring makabuluhang mapabilis at mapadali ang pagsasalin ng pagsasalita sa teksto, iyon ay, gawing simple ang transkripsyon.

Ang transkripsyon ay ang pag-record ng isang audio o video file sa text form. May mga bayad na bayad na gawain sa Internet, kapag ang tagapalabas ay binayaran ng isang tiyak na halaga ng pera para sa pag-transcribe ng teksto.

Kapaki-pakinabang ang pagsasalin ng speech sa text

  • mag-aaral na isalin ang mga nai-record na audio o video na mga lektura sa teksto,
  • mga blogger na nagpapatakbo ng mga website at blog,
  • mga manunulat, mamamahayag para sa pagsusulat ng mga libro at teksto,
  • impormasyon sa mga negosyanteng nangangailangan ng text pagkatapos ng kanilang webinar, talumpati, atbp.,
  • mga taong nahihirapang mag-type - maaari silang magdikta ng liham at ipadala ito sa pamilya o mga kaibigan,
  • iba pang mga pagpipilian.

Ilalarawan namin ang pinakaepektibong tool na magagamit sa mga PC, mobile application at online na serbisyo.

1 Website speechpad.ru

Ito ay isang online na serbisyo na nagbibigay-daan sa iyong isalin ang pananalita sa teksto gamit ang Google Chrome browser. Gumagana ang serbisyo sa isang mikropono at mga file na handa na. Siyempre, magiging mas mataas ang kalidad kung gagamit ka ng panlabas na mikropono at diktahan ang iyong sarili. Gayunpaman, ang serbisyo ay gumagana nang mahusay kahit na sa mga video sa YouTube.

I-click ang "Paganahin ang pag-record", sagutin ang tanong tungkol sa "Paggamit ng mikropono" - upang gawin ito, i-click ang "Payagan".

Ang mahabang mga tagubilin tungkol sa paggamit ng serbisyo ay maaaring i-collapse sa pamamagitan ng pag-click sa button 1 sa Fig. 3. Maaari mong alisin ang advertising sa pamamagitan ng pagkumpleto ng isang simpleng pagpaparehistro.

kanin. 3. Serbisyo ng Speechpad

Ang natapos na resulta ay madaling i-edit. Upang gawin ito, kailangan mong manu-manong itama ang naka-highlight na salita o idikta itong muli. Ang mga resulta ng trabaho ay nai-save sa iyong personal na account, maaari rin silang ma-download sa iyong computer.

Listahan ng mga aralin sa video sa pagtatrabaho sa speechpad:

Maaari kang mag-transcribe ng mga video mula sa Youtube o mula sa iyong computer, gayunpaman, kakailanganin mo ng mixer, higit pang mga detalye:

Video na "audio transcription"

Gumagana ang serbisyo sa pitong wika. May maliit na minus. Ito ay nakasalalay sa katotohanan na kung kailangan mong i-transcribe ang isang natapos na audio file, kung gayon ang tunog nito ay maririnig sa pamamagitan ng mga speaker, na lumilikha ng karagdagang pagkagambala sa anyo ng isang echo.

2 Serbisyo dictation.io

Isang napakagandang online na serbisyo na nagbibigay-daan sa iyong isalin ang pananalita sa teksto nang libre at madali.

kanin. 4. Serbisyo dictation.io

1 sa Fig. 4 – Maaaring mapili ang wikang Ruso sa dulo ng pahina. Sa browser ng Google Chrome, napili ang wika, ngunit sa ilang kadahilanan sa Mozilla walang ganoong opsyon.

Kapansin-pansin na ang kakayahang awtomatikong i-save ang natapos na resulta ay ipinatupad. Pipigilan nito ang hindi sinasadyang pagtanggal bilang resulta ng pagsasara ng tab o browser. Hindi nakikilala ng serbisyong ito ang mga natapos na file. Gumagana sa isang mikropono. Kailangan mong pangalanan ang mga punctuation mark kapag nagdidikta.

Ang teksto ay kinikilala nang tama, walang mga pagkakamali sa pagbabaybay. Maaari kang maglagay ng mga punctuation mark sa iyong sarili mula sa keyboard. Ang natapos na resulta ay maaaring i-save sa iyong computer.

3 RealSpeaker

Binibigyang-daan ka ng program na ito na madaling isalin ang pananalita ng tao sa teksto. Ito ay dinisenyo upang gumana sa iba't ibang mga system: Windows, Android, Linux, Mac. Sa tulong nito, maaari mong i-convert ang pagsasalita na narinig sa isang mikropono (halimbawa, maaari itong itayo sa isang laptop), pati na rin ang naitala sa mga audio file.

Nakakaintindi ng 13 wika sa mundo. Mayroong beta na bersyon ng programa na gumagana bilang isang online na serbisyo:

Kailangan mong sundin ang link sa itaas, piliin ang wikang Ruso, i-upload ang iyong audio o video file sa online na serbisyo at bayaran ang transkripsyon nito. Pagkatapos ng transkripsyon, maaari mong kopyahin ang resultang teksto. Kung mas malaki ang file para sa transkripsyon, mas maraming oras ang aabutin upang maproseso ito, higit pang mga detalye:

Noong 2017 nagkaroon ng libreng opsyon sa transkripsyon gamit ang RealSpeaker, ngunit sa 2018 walang ganoong opsyon. Ito ay lubhang nakalilito na ang na-transcribe na file ay magagamit sa lahat ng mga gumagamit para sa pag-download; marahil ito ay mapapabuti.

Ang mga contact ng developer (VKontakte, Facebook, Youtube, Twitter, email, telepono) ng programa ay matatagpuan sa pahina ng kanyang website (mas tiyak, sa footer ng site):

4 Speechlogger

Isang alternatibo sa nakaraang application para sa mga mobile device na tumatakbo sa Android. Available nang libre sa app store:

Awtomatikong ine-edit ang teksto at idinaragdag ang mga bantas. Tunay na maginhawa para sa pagdidikta ng mga tala sa iyong sarili o paggawa ng mga listahan. Bilang resulta, ang teksto ay magiging napakahusay na kalidad.

5 Dragon Dictation

Ito ay isang application na ibinahagi nang walang bayad para sa mga mobile device mula sa Apple.

Ang programa ay maaaring gumana sa 15 mga wika. Pinapayagan ka nitong i-edit ang resulta at piliin ang mga nais na salita mula sa listahan. Kailangan mong malinaw na bigkasin ang lahat ng mga tunog, huwag gumawa ng mga hindi kinakailangang pag-pause at maiwasan ang intonasyon. Minsan may mga pagkakamali sa pagtatapos ng mga salita.

Ang application ng Dragon Dictation ay ginagamit ng mga may-ari, halimbawa, upang magdikta ng listahan ng pamimili sa isang tindahan habang lumilipat sa apartment. Pagdating ko doon, maaari kong tingnan ang teksto sa tala, at hindi ko kailangang makinig.

Anuman ang program na ginagamit mo sa iyong pagsasanay, maging handa na i-double check ang mga resulta at gumawa ng ilang partikular na pagsasaayos. Ito ang tanging paraan upang makakuha ng walang kamali-mali na teksto nang walang mga error.

Gayundin kapaki-pakinabang na mga serbisyo:

Makatanggap ng pinakabagong mga artikulo sa computer literacy nang direkta sa iyong inbox.
Mas marami na 3,000 subscriber

.

Mga produkto at teknolohiya:

Visual Studio, C#, .NET Speech Libraries

Tinatalakay ng artikulo ang:

  • pagdaragdag ng suporta sa pagkilala sa pagsasalita sa application ng console;
  • pagproseso ng kinikilalang pananalita;
  • pag-install ng mga library ng pagkilala sa pagsasalita;
  • paghahambing ng Microsoft.Speech at System.Speech;
  • Pagdaragdag ng suporta sa pagkilala sa pagsasalita sa isang application ng Windows Forms.

Sa pagdating ng Windows Phone Cortana, isang speech-activated personal assistant (pati na rin ang fruit-company counterpart na hindi maaaring pag-usapan nang walang kabuluhan), ang mga speech-enabled na app ay lalong naging prominente sa software development. Sa artikulong ito, ipapakita ko sa iyo kung paano magsimula sa speech recognition at synthesis sa mga Windows console application, Windows Forms application, at Windows Presentation Foundation (WPF).

Tandaan na maaari ka ring magdagdag ng mga kakayahan sa pagsasalita sa mga Windows Phone app, ASP.NET web app, Windows Store app, Windows RT, at Xbox Kinect, ngunit ang mga diskarte ay naiiba sa mga tinalakay sa artikulong ito.

Ang isang mahusay na paraan upang makakuha ng ideya kung ano ang eksaktong tatalakayin ng artikulong ito ay ang pagtingin sa mga screenshot ng dalawang magkaibang mga demo program sa kanin. 1 At 2 . Pagkatapos ilunsad ang console application sa kanin. 1 agad na sinabi ang pariralang "gising ako." Siyempre, hindi mo maririnig ang demo application habang binabasa ang artikulong ito, kaya ipinapakita nito ang teksto ng sinasabi ng computer. Pagkatapos ay sasabihin ng user ang command na "Speech on". Ang demo application ay tumutugon sa kinikilalang teksto at pagkatapos ay panloob na nakikinig at tumutugon sa mga kahilingan upang magdagdag ng dalawang numero.

kanin. 1. Pagkilala sa pagsasalita at synthesis sa isang console application


kanin. 2. Pagkilala sa pagsasalita sa isang application ng Windows Forms

Hiniling ng user sa app na magdagdag ng isa at dalawa, pagkatapos ay dalawa at tatlo. Nakilala ng application ang mga binibigkas na utos at nagbigay ng mga sagot sa pamamagitan ng boses. Ilalarawan ko ang mga mas kapaki-pakinabang na paraan ng paggamit ng speech recognition sa ibang pagkakataon.

Pagkatapos ay sinabi ng user ang "Speech off," isang voice command na hindi pinapagana ang pakikinig sa mga karagdagan na command, ngunit hindi ganap na hindi pinapagana ang speech recognition. Pagkatapos ng pandiwang utos na ito, ang susunod na utos na magdagdag ng isa at dalawa ay hindi pinansin. Sa wakas, na-on muli ng user ang command listening at binibigkas ang walang kabuluhang utos na "Klatu barada nikto", na kinilala ng application bilang isang utos na ganap na i-deactivate ang speech recognition at wakasan ang sarili nito.

Naka-on kanin. 2 nagpapakita ng Windows Forms application na may dummy speech-enabled. Kinikilala ng application na ito ang mga pasalitang utos, ngunit hindi tumutugon sa mga ito gamit ang voice output. Noong una mong inilunsad ang app, ang Speech On na checkbox ay hindi nilagyan ng check, na nagpapahiwatig na ang speech recognition ay hindi aktibo. Nilagyan ng check ng user ang checkbox na ito at pagkatapos ay sinabing "Hello". Tumugon ang application sa pamamagitan ng pagpapakita ng kinikilalang teksto sa kontrol ng ListBox sa ibaba ng window.

Pagkatapos ay sinabi ng user, "Itakda ang text box 1 sa pula." Nakilala ng application ang pagsasalita at tumugon: "Itakda ang text box 1 pula," na halos (ngunit hindi lubos) kung ano mismo ang sinabi ng user. Bagama't sa kanin. 2 Hindi mo ito makikita, ang teksto sa kontrol ng TextBox sa tuktok ng window ay talagang pula.

Pagkatapos ay sinabi ng user: "Pakitakda sa puti ang text box 1." Kinilala ito ng app bilang "set text box 1 white" at ginawa iyon. Nagtapos ang user sa pamamagitan ng pagsasabi ng, "Good-bye," at ipinakita ng application ang text na iyon, ngunit walang ginawa sa Windows Forms, bagama't maaaring na-clear nito ang checkbox ng Speech On, halimbawa.

Ang paggamit ng object ng synthesizer ay medyo simple.

Sa mga sumusunod na seksyon, gagabayan kita sa proseso ng paglikha ng parehong mga demo program, kabilang ang pag-install ng kinakailangang .NET speech library. Ipinapalagay ng artikulong ito na mayroon kang hindi bababa sa mga intermediate na kasanayan sa programming, ngunit wala kang alam tungkol sa speech recognition at synthesis.

Pagdaragdag ng suporta sa speech recognition sa isang console application

Upang gawin ang demo na ipinapakita sa kanin. 1, inilunsad ko ang Visual Studio at lumikha ng bagong C# console application na tinatawag na ConsoleSpeech. Matagumpay kong nagamit ang mga tool sa pagsasalita sa Visual Studio 2010 at 2012, ngunit ang anumang medyo kamakailang bersyon ay dapat na maayos. Pagkatapos i-load ang template code sa editor, pinalitan ko ang pangalan ng Program.cs file sa Solution Explorer window sa mas mapaglarawang ConsoleSpeechProgram.cs, at pinalitan ng Visual Studio ang pangalan ng Program class para sa akin.

Susunod, nagdagdag ako ng link sa Microsoft.Speech.dll file, na matatagpuan sa C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly. Ang DLL na ito ay nawawala sa aking computer at kailangan kong i-download ito. Ang pag-install ng mga file na kailangan upang magdagdag ng speech recognition at synthesis sa isang application ay hindi gaanong mahalaga. Ipapaliwanag ko nang detalyado ang proseso ng pag-install sa susunod na seksyon, ngunit sa ngayon ay ipagpalagay natin na ang Microsoft.Speech.dll ay nasa iyong system.

Sa pamamagitan ng pagdaragdag ng isang sanggunian sa speech DLL, inalis ko ang lahat ng gamit na mga pahayag mula sa tuktok ng code maliban sa isa na tumuturo sa top-level na System namespace. Pagkatapos ay nagdagdag ako gamit ang mga pahayag para sa mga namespace ng Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis, at System.Globalization. Ang unang dalawang namespace ay nakamapa sa speech DLL. Tandaan na mayroon ding mga namespace gaya ng System.Speech.Recognition at System.Speech.Synthesis, na maaaring nakakalito. Ipapaliwanag ko ang pagkakaiba sa pagitan nila sa ilang sandali. Ang Globalization namespace ay available bilang default at hindi nangangailangan ng bagong reference na maidagdag sa proyekto.

Lahat ng source code para sa demo console application ay ibinibigay sa kanin. 3, at available din sa source package na kasama ng artikulong ito. Inalis ko ang lahat ng karaniwang paghawak ng error upang maiwasan ang pagkubli sa mga pangunahing ideya hangga't maaari.

kanin. 3. Demo console application source code

gamit ang System; gamit ang Microsoft.Speech.Recognition; gamit ang Microsoft.Speech.Synthesis; gamit ang System.Globalization; namespace ConsoleSpeech ( class ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool done = false; static bool speechOn = true; static void Main(string args) (try ( sreWorldAugustDevice.com) ("\n(Pagsasalita: Ako ay gising)"); ss.Speak("Ako ay gising"); CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; sre.speechrecognized += sre_speechrecognized; mga pagpipilian ch_startstopCommands = bagong mga pagpipilian (); ch_startstopcommands.add ("pagsasalita sa"); ch_startstopcommands.add ("seech off"); ch_startstopcommands.add ("klatu barada nikto"); = bagong GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = bagong Grammar(gb_StartStop); Choices ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("2"); Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Ano ang"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = bagong Grammar(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); habang (tapos na == false) ( ; ) Console.WriteLine("\nHit< enter >para isara ang shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e ) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nNakilala: " + txt); if (confidence< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("NAKA-ON na ngayon ang pagsasalita"); speechOn = true; ) kung (txt.IndexOf("naka-off ang pagsasalita") >= 0) ( NAKA-OFF na ngayon ang pagsasalita"); speechOn = false; ) if (speechOn == false) return; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)sender). RecognizeAsyncCancel(); done = true; Console.WriteLine("(Speaking: Farewell)"); ss.Speak("Farewell"); ) if (txt.IndexOf("What") >= 0 && txt.IndexOf("plus") >= 0) ( string words = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(words); int sum = num1 + num2; Console.WriteLine("(Speaking: " + words + " plus " + words + " equals " + sum + ")"); ss.SpeakAsync(mga salita + " plus " + salita + " katumbas ng " + sum); ) ) // sre_SpeechRecognized ) // Program ) // ns

Pagkatapos ng paggamit ng mga pahayag, ang demo code ay magsisimula tulad nito:

namespace ConsoleSpeech ( class ConsoleSpeechProgram ( static SpeechSynthesizer ss = bagong SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool tapos = false; static bool speechOn = true; static void Main(string args) ( ...

Ang SpeechSynthesizer object, sa antas ng klase, ay nagbibigay-daan sa isang application na mag-synthesize ng speech. Ang SpeechRecognitionEngine object ay nagbibigay-daan sa isang application na makinig at makilala ang mga binibigkas na salita o parirala. Tinutukoy ng boolean variable na tapos na kung kailan magwawakas ang buong application. Kinokontrol ng speechOn boolean variable kung ang application ay nakikinig sa anumang utos maliban sa command na lumabas sa program.

Ang ideya dito ay ang console application ay hindi tumatanggap ng keyboard input, kaya ito ay palaging nakikinig para sa mga utos. Gayunpaman, kung mali ang speechOn, tanging ang utos na lumabas sa programa ang kinikilala at isinasagawa; ang ibang mga utos ay kinikilala ngunit hindi pinansin.

Ang pangunahing pamamaraan ay nagsisimula tulad nito:

subukan ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Speaking: I am awake)"); ss.Speak("I am awake");

Ang isang instance ng SpeechSynthesizer object ay nilikha noong ito ay idineklara. Ang paggamit ng object ng synthesizer ay medyo simple. Ang SetOutputToDefaultAudioDevice na paraan ay nagpapadala ng output sa mga speaker na konektado sa iyong computer (maaari ka ring magpadala ng output sa isang file). Ang Speak na paraan ay tumatagal ng isang string at pagkatapos ay sasabihin ito. Ganun lang kadali.

Ang pagkilala sa pagsasalita ay mas kumplikado kaysa sa speech synthesis. Ang Pangunahing pamamaraan ay nagpapatuloy sa pamamagitan ng paglikha ng object ng solver:

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

Una, ang CultureInfo object ay tumutukoy sa wikang kikilalanin, sa kasong ito ay United States English. Ang CultureInfo object ay nasa Globalization namespace, na tinukoy namin gamit ang isang using statement. Pagkatapos, pagkatapos tawagan ang SpeechRecognitionEngine constructor, ang voice input ay itinalaga sa default na audio device - kadalasan ang mikropono. Tandaan na karamihan sa mga laptop ay may built-in na mikropono, ngunit ang mga desktop ay mangangailangan ng isang panlabas na mikropono (madalas na pinagsama sa mga headphone sa mga araw na ito).

Ang pangunahing paraan para sa bagay na kumikilala ay ang SpeechRecognized event handler. Kapag gumagamit ng Visual Studio, kung nagta-type ka ng "sre.SpeechRecognized +=" at maghintay ng ilang segundo, awtomatikong tatapusin ng IntelliSense ang iyong expression gamit ang pangalan ng event handler - sre_SpeechRecognized. Iminumungkahi kong pindutin mo ang Tab key upang tanggapin ang mungkahi at gamitin ang pangalang ito bilang default.

Choices ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // mula sa isang teknikal na punto ng view, // ito ay Add(new string ( "4")); GrammarBuilder gb_WhatIsXplusY = bagong GrammarBuilder(); gb_WhatIsXplusY.Append("Ano ang"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = bagong Grammar(gb_WhatIsXplusY);

Ang tatlong pangunahing bagay dito ay ang Choices set, ang GrammarBuilder template, at ang Grammar control. Kapag gumawa ako ng Grammar para sa pagkilala, magsisimula ako sa pamamagitan ng paglilista ng ilang partikular na halimbawa ng kung ano ang kailangan kong kilalanin. Sabihin nating, "Ano ang one plus two?" at "Ano ang tatlo at apat?"

Pagkatapos ay tinukoy ko ang kaukulang generic na template, halimbawa "Ano ang plus ?. Ang template ay isang GrammarBuilder, at ang mga partikular na value na ipinapasa sa template ay isang set ng Choices. Ang Grammar object ay nakapaloob sa template at Choices.

Sa demo program, nililimitahan ko ang mga karagdagan sa 1 hanggang 4 at idinaragdag ang mga ito bilang mga string sa hanay ng Mga Pagpipilian. Mas mahusay na diskarte:

string numbers = bagong string ("1", "2", "3", "4" ); Choices ch_Numbers = bagong Choices(numbers);

Nagpapakita ako ng hindi gaanong mahusay na diskarte sa paggawa ng hanay ng Mga Pagpipilian para sa dalawang dahilan. Una, ang pagdaragdag ng isang linya sa isang pagkakataon ay ang tanging diskarte na nakita ko sa iba pang mga halimbawa ng pagkilala sa pagsasalita. Pangalawa, maaari mong isipin na ang pagdaragdag ng isang hilera sa isang pagkakataon ay hindi dapat gumana; Ipinapakita ng Visual Studio IntelliSense sa real time na ang isa sa mga Add overload ay tumatanggap ng isang parameter ng uri ng params string na mga parirala. Kung hindi mo napansin ang params keyword, maaaring ipinalagay mo na ang Add method ay tumatanggap lamang ng mga arrays ng mga string at hindi isang string. Ngunit hindi ito ganoon: tinatanggap niya ang dalawa. Inirerekomenda ko ang pagpasa ng isang array.

Ang paglikha ng isang hanay ng Mga Pagpipilian mula sa mga sequential na numero ay medyo isang espesyal na kaso at nagbibigay-daan para sa isang programmatic na diskarte tulad ng:

string numbers = bagong string; para sa (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

Pagkatapos gumawa ng Mga Pagpipilian upang punan ang mga puwang ng GrammarBuilder, lumilikha ang demo program ng GrammarBuilder at pagkatapos ay isang kumokontrol na Grammar:

GrammarBuilder gb_WhatIsXplusY = bagong GrammarBuilder(); gb_WhatIsXplusY.Append("Ano ang"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("plus"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = bagong Grammar(gb_WhatIsXplusY);

Gumagamit ang demo program ng katulad na template para lumikha ng Grammar para sa start at stop commands:

Mga Pagpipilian ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("speech on"); ch_StartStopCommands.Add("speech off"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = bagong GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = bagong Grammar(gb_StartStop);

Ang mga grammar ay maaaring tukuyin nang napaka-flexible. Dito inilalagay sa isang gramatika ang mga utos na "speech on", "speech off" at "klatu barada nikto", dahil lohikal na nauugnay ang mga ito. Ang tatlong utos na ito ay maaaring tukuyin sa tatlong magkakaibang grammar, o ang mga utos na "speech on" at "speech off" ay maaaring ilagay sa isang grammar at ang command na "klatu barada nikto" sa isang segundo.

Kapag nagawa mo na ang lahat ng mga bagay sa Grammar, inilalagay mo ang mga ito sa speech recogniter at ang speech recognition ay isinaaktibo:

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

Ang RecognizeMode.Multiple argument ay kailangan kapag mayroon kang higit sa isang grammar, na magiging kaso sa lahat maliban sa pinakasimpleng mga programa. Ang pangunahing pamamaraan ay nakumpleto tulad ng sumusunod:

Habang (tapos na == false) ( ; ) Console.WriteLine("\nHit< enter >para isara ang shell\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Pangunahing

Ang isang kakaibang hitsura na walang laman habang loop ay nagbibigay-daan sa iyo upang panatilihing tumatakbo ang shell ng isang console application. Ang loop ay makukumpleto kapag ang class-level na boolean variable na ginawa ay nakatakda sa true ng speech recognition event handler.

Kinikilalang pagproseso ng pagsasalita

Ang code para sa paghawak ng mga kaganapan sa pagkilala sa pagsasalita ay nagsisimula sa ganito:

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

Ang kinikilalang teksto ay naka-imbak sa Result.Text property ng SpeechRecognizedEventArgs object. Bilang kahalili, maaari mong gamitin ang Result.Words set. Ang Result.Confidence property ay nag-iimbak ng halaga sa pagitan ng 0.0 at 1.0 na isang magaspang na pagtatantya kung gaano kahusay ang pasalitang teksto ay tumutugma sa alinman sa mga grammar na nauugnay sa kinikilala. Ang demo program ay nagtuturo sa event handler na huwag pansinin ang text na may mababang kumpiyansa sa kinikilalang text.

Ang mga halaga ng kumpiyansa ay malaki ang pagkakaiba-iba depende sa pagiging kumplikado ng iyong mga grammar, kalidad ng mikropono, at iba pang mga kadahilanan. Halimbawa, kung kailangan lang kilalanin ng demo program ang mga numero 1 hanggang 4, ang mga halaga ng kumpiyansa sa aking computer ay karaniwang nasa 0.75. Ngunit, kung dapat kilalanin ng grammar ang mga numero mula 1 hanggang 100, bumababa ang mga halaga ng kumpiyansa sa halos 0.25. Sa madaling sabi, sa pangkalahatan, dapat kang mag-eksperimento sa mga halaga ng kumpiyansa upang makamit ang mahusay na mga resulta ng pagkilala sa pagsasalita.

if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Speech is now ON"); speechOn = true; ) if (txt.IndexOf("speech off") >= 0) ( Console .WriteLine("Speech is now OFF"); speechOn = false; ) kung (speechOn == false) bumalik;

Bagama't maaaring hindi ito ganap na halata sa simula, ang lohika na ito ay dapat magkaroon ng kahulugan kung iisipin mo ito. Ang lihim na exit command ay pinoproseso:

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

Tandaan na ang speech recognition engine ay talagang makakakilala ng mga walang katuturang salita. Kung ang isang Grammar object ay naglalaman ng mga salita na wala sa built-in na diksyunaryo ng object, sinusubukan ng Grammar na tukuyin ang mga salitang iyon gamit ang semantic heuristics kung maaari, at kadalasan ay medyo matagumpay. Kaya nga ginamit ko ang "klatu" sa halip na ang tamang "klaatu" (mula sa isang lumang sci-fi movie).

Tandaan din na hindi mo kailangan na iproseso ang lahat ng tekstong kinikilala ng Grammar (“klatu barada nikto”) - kailangan mo lang magkaroon ng sapat na impormasyon upang natatanging makilala ang gramatikal na parirala (“klatu” at “barada”).

Kung (txt.IndexOf("Ano") >= 0 && txt.IndexOf("plus") >= 0) ( string words = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(words); int sum = num1 + num2; Console.WriteLine("(Speaking: " + words + " plus " + words + " equals " + sum + ")"); ss.SpeakAsync(words + " plus " + salita + " katumbas ng " + sum); ) ) // sre_SpeechRecognized ) // Program ) // ns

Tandaan na ang text sa Results.Text ay case sensitive ("Ano" at "ano"). Ang pagkakaroon ng pagkilala sa isang parirala, maaari itong mai-parse sa mga tiyak na salita. Sa kasong ito, ang kinikilalang teksto ay nasa anyong "Ano ang x plus y", kaya ang "Ano" ay inilalagay sa mga salita, at ang dalawang idinagdag na numero (bilang mga string) ay naka-imbak sa mga salita at salita.

Pag-install ng mga aklatan

Ipinapalagay ng paliwanag ng demo program na ang lahat ng kinakailangang speech library ay naka-install sa iyong computer. Para gumawa at magpatakbo ng mga demo program, kailangan mong mag-install ng apat na package: ang SDK (nagbibigay ng kakayahang gumawa ng mga demo sa Visual Studio), ang runtime (nagpapatakbo ng mga demo pagkatapos gawin ang mga ito), at ang mga kinikilala at na-synthesize (binibigkas) na mga wika.

Para i-install ang SDK, hanapin sa Internet ang “Speech Platform 11 SDK.” Dadalhin ka nito sa tamang pahina sa Microsoft Download Center ( kanin. 4). Sa pamamagitan ng pag-click sa pindutang I-download makikita mo ang mga opsyon na ipinapakita sa kanin. 5. Ang SDK ay nasa 32- at 64-bit na bersyon. Lubos kong ipinapayo ang paggamit ng 32-bit na bersyon anuman ang laki ng iyong system. Ang 64-bit na bersyon ay hindi gumagana sa ilang mga application.


kanin. 4. Pangunahing pahina ng pag-install ng SDK sa Microsoft Download Center


kanin. 5. I-install ang Speech SDK

Hindi mo na kailangan ng higit sa isang solong .msi file sa ilalim ng x86 (para sa 32-bit system). Sa pamamagitan ng pagpili sa file na ito at pag-click sa Susunod, maaari mong patakbuhin ang installer nang direkta mula dito. Ang mga speech library ay hindi nagbibigay ng maraming feedback tungkol sa kung kailan kumpleto ang pag-install, kaya huwag maghanap ng anumang mga mensahe ng tagumpay.


kanin. 6. Pag-install ng runtime environment

Napakahalaga na piliin ang parehong bersyon ng platform (11 sa demo) at bit depth (32 o 64) bilang SDK. Muli, lubos kong inirerekomenda ang 32-bit na bersyon, kahit na tumatakbo ka sa isang 64-bit na sistema.

Maaari mong itakda ang wika ng pagkilala. Ang pahina ng pag-download ay ibinibigay sa kanin. 7. Ginagamit ng demo program ang file na MSSpeech_SR_en-us_TELE.msi (English-U.S.). Ang SR ay kumakatawan sa speech recognition, at ang TELE ay kumakatawan sa telephony; nangangahulugan ito na ang kinikilalang wika ay idinisenyo upang gumana sa mababang kalidad na audio input, tulad ng mula sa isang telepono o desktop microphone.


kanin. 7. Pagtatakda ng isang kinikilalang wika

Sa wakas, maaari mong itakda ang wika at boses para sa speech synthesis. Ang pahina ng pag-download ay ibinibigay sa kanin. 8. Ginagamit ng demo program ang MSSpeech_TTS_en-us_Helen.msi file. Ang TTS (text-to-speech) ay mahalagang kasingkahulugan ng speech synthesis. Pansinin ang dalawang available na boses English, U.S. Mayroong iba pang mga boses sa Ingles, ngunit hindi U.S. Ang paglikha ng mga file ng synthesis ng wika ay isang napakahirap na gawain. Gayunpaman, maaari kang bumili at mag-install ng iba pang mga boses mula sa iba't ibang kumpanya.


kanin. 8. Pagtatakda ng boses at synthesis na wika

Kapansin-pansin, bagama't ang wika sa pagkilala sa pagsasalita at wika ng synthesis ng boses/speech ay talagang ganap na magkaibang mga bagay, ang parehong mga pakete ay mga opsyon sa parehong pahina ng pag-download. Binibigyang-daan ka ng Download Center UI na suriin ang parehong wika ng pagkilala at ang synthesis language, ngunit ang pagsubok na i-install ang mga ito sa parehong oras ay nakapipinsala para sa akin, kaya inirerekomenda kong i-install ang mga ito nang hiwalay.

Paghahambing ng Microsoft.Speech sa System.Speech

Kung bago ka sa speech recognition at synthesis para sa mga Windows application, madali kang malito sa dokumentasyon dahil maraming speech platform. Sa partikular, bilang karagdagan sa Microsoft.Speech.dll library na ginagamit ng mga demo program sa artikulong ito, mayroong isang library na tinatawag na System.Speech.dll na bahagi ng Windows operating system. Ang dalawang library ay magkapareho sa kahulugan na ang kanilang mga API ay halos, ngunit hindi ganap, magkapareho. Samakatuwid, kung naghahanap ka ng mga halimbawa sa pagpoproseso ng pagsasalita sa Internet at makita ang mga snippet ng code sa halip na kumpletong mga programa, hindi talaga halata kung System.Speech ang halimbawa o Microsoft.Speech.

Kung bago ka sa pagproseso ng pagsasalita, gamitin ang Microsoft.Speech library sa halip na System.Speech upang magdagdag ng suporta sa pagsasalita sa iyong .NET na application.

Bagama't ang parehong mga aklatan ay nagbabahagi ng isang karaniwang core code base at mga katulad na API, tiyak na magkaiba ang mga ito. Ang ilang pangunahing pagkakaiba ay ibinubuod sa mesa 1.

mesa 1. Mga pangunahing pagkakaiba sa pagitan ng Microsoft.Speech at System.Speech

Ang System.Speech DLL ay bahagi ng OS, kaya naka-install ito sa bawat Windows system. Ang Microsoft.Speech DLL (at ang nauugnay na runtime at mga wika) ay dapat na ma-download at mai-install sa system. Ang pagkilala gamit ang System.Speech ay karaniwang nangangailangan ng pagsasanay para sa isang partikular na user, kapag ang user ay nagbasa ng ilang teksto, at ang system ay natututong maunawaan ang katangian ng pagbigkas ng user na ito. Ang pagkilala gamit ang Microsoft. Gumagana kaagad ang pagsasalita para sa sinumang user. System.Makikilala ng pagsasalita ang halos anumang salita (ito ay tinatawag na libreng pagdidikta). Makikilala lamang ng Microsoft.Speech ang mga salita at parirala na nasa Grammar object na tinukoy sa program.

Pagdaragdag ng suporta sa pagkilala sa pagsasalita sa isang application ng Windows Forms

Ang proseso para sa pagdaragdag ng speech recognition at synthesis support sa isang Windows Forms o WPF application ay katulad ng para sa isang console application. Upang lumikha ng demo program na ipinapakita sa kanin. 2, inilunsad ko ang Visual Studio, lumikha ng bagong C# Windows Forms application at pinangalanan itong WinFormSpeech.

Pagkatapos i-load ang template code sa editor, nagdagdag ako ng link sa Microsoft.Speech.dll file sa Solution Explorer window - tulad ng ginawa ko sa console program. Sa itaas ng source code, inalis ko ang hindi kailangan gamit ang mga statement, na nag-iiwan lamang ng mga reference sa System, Data, Drawing, at Forms namespaces. Pagkatapos ay nagdagdag ako ng dalawa gamit ang mga pahayag para sa Microsoft.Speech.Recognition at System.Globalization namespaces.

Ang demo na batay sa Windows Forms ay hindi gumagamit ng speech synthesis, kaya hindi ako nagli-link sa Microsoft.Speech.Synthesis library. Ang pagdaragdag ng speech synthesis sa isang Windows Forms application ay kapareho ng sa isang console application.

Sa Visual Studio sa design mode, nag-drag ako ng TextBox, CheckBox, at ListBox na mga kontrol papunta sa Form. Ang pag-double click sa CheckBox at Visual Studio ay awtomatikong lumikha ng isang skeleton CheckChanged event handler method.

Alalahanin na ang demo console program ay agad na nagsimulang makinig para sa mga binibigkas na utos at patuloy na ginagawa ito hanggang sa ito ay natapos. Ang diskarte na ito ay maaaring gamitin sa isang Windows Forms application, ngunit sa halip ay nagpasya akong payagan ang user na i-on at i-off ang speech recognition gamit ang isang CheckBox control (ibig sabihin, isang check box).

Ang source code sa Form1.cs file ng demo program, kung saan tinukoy ang partial class, ay ipinapakita sa kanin. 9. Ang isang speech recognition engine object ay idineklara at ginawa bilang isang miyembro ng Form. Sa constructor ng Form, ini-hook ko ang SpeechRecognized event handler at pagkatapos ay lumikha at nag-load ng dalawang Grammar object:

pampublikong Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox1); Grammar g_SetTextHextBox1 = GetTexGrammar(); lloGoodby e);sre.LoadGrammarAsync(g_SetTextBox) ; // ang sre.RecognizeAsync() ay // sa CheckBox event handler)

kanin. 9. Magdagdag ng suporta sa speech recognition sa Windows Forms

gamit ang System; gamit ang System.Data; gamit ang System.Drawing; gamit ang System.Windows.Forms; gamit ang Microsoft.Speech.Recognition; gamit ang System.Globalization; namespace WinFormSpeech ( public partial class Form1: Form ( static CultureInfo ci = new CultureInfo("en-us"); static SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci); public Form1() ( InitializeComponent(); sre.SetInputToDefault(); sre.SetInputToDefault(); .SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodbye.//Grammar//GrammarTextBox); sre.LoadGrammarAsync(g_HelloGoodbye); sre. nize Async() ay // sa CheckBox event handler ) static Grammar GetHelloGoodbyeGrammar() ( Choices ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("hello"); ch_HelloGoodbye.Add("goodbye"); GrammarBuilder gb_result = new GrammarBuilder(ch_HelloGoodbye.Add("hello"); ch_HelloGoodbye.Add("paalam"); ​​GrammarBuilder gb_result = new GrammarBuilder(ch_HelloGoodbye)(ch_HelloGoodbye gmmar); ; return g_result; ) static Grammar GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(new string ( "red", "white", "blue")); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("set text box 1"); gb_result.Append(ch_Colors); Grammar g_result = bagong Grammar(gb_result); ibalik ang g_result; ) private void checkBox1_CheckedChanged(object sender, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // disabled sre.RecognizeAsyncCancel(); ) 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("Narinig kong sinabi mo: " + txt); ))); // WinForm specifics if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) ( string words = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = words; ))); // WinForm specifics ) ) ) // Form ) // ns

Maaari akong lumikha ng dalawang Grammar object nang direkta, tulad ng sa isang console program, ngunit sa halip, upang gawing mas malinaw ang code, tinukoy ko ang dalawang pamamaraan ng helper (GetHelloGoodbyeGrammar at GetTextBox1TextGrammar) na gumagawa ng trabaho.

static Grammar GetTextBox1TextGrammar() ( Choices ch_Colors = new Choices(); ch_Colors.Add(new string ( "red", "white", "blue" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("set text box 1"); gb_result.Append(ch_Colors); Grammar g_result = bagong Grammar(gb_result); ibalik ang g_result; )

Makikilala ng paraan ng helper na ito ang pariralang "itakda ang text box 1 red". Gayunpaman, hindi kinakailangang bigkasin ng user ang pariralang ito nang eksakto. Halimbawa, maaari niyang sabihin ang "Paki-set ang text sa text box 1 sa pula" at ang speech recognition engine ay makikilala pa rin ang parirala bilang "set text box 1 red" - kahit na may mas mababang confidence value kaysa sa eksaktong tugma sa Grammar template. Sa madaling salita, kapag lumilikha ng mga bagay sa Grammar, hindi mo kailangang isaalang-alang ang lahat ng variation ng isang parirala. Ito ay radikal na pinapasimple ang paggamit ng speech recognition.

Ang tagapangasiwa ng kaganapan para sa CheckBox ay tinukoy tulad nito:

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

Ang speech recognition engine object, sre (speech recognition engine), ay palaging umiiral para sa buhay ng isang Windows Forms application. Ang bagay na ito ay isinaaktibo at na-deactivate sa pamamagitan ng mga tawag sa RecognizeAsync at RecognizeAsyncCancel na mga pamamaraan kapag ang user ay nag-toggle sa CheckBox ayon sa pagkakabanggit.

Ang kahulugan ng SpeechRecognized event handler ay nagsisimula sa:

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

Bukod sa higit pa o mas kaunting ginagamit na mga katangian ng Result.Text at Result.Confidence, ang Result object ay may ilang iba pang kapaki-pakinabang ngunit mas kumplikadong mga katangian na maaaring gusto mong tuklasin; halimbawa, Homophones at ReplacementWordUnits. Bilang karagdagan, ang speech recognition engine ay nagbibigay ng ilang kapaki-pakinabang na kaganapan tulad ng SpeechHypothesized.

this.Invoke((Action)(() => listBox1.Items.Add("Narinig kong sinabi mo: " + txt)));

Sa teorya, ang paggamit ng MethodInvoker delegate ay bahagyang mas mahusay kaysa sa isang Action sa sitwasyong ito dahil ang MethodInvoker ay bahagi ng Windows.Forms namespace at samakatuwid ay partikular sa mga application ng Windows Forms. Ang delegado ng Aksyon ay mas maraming nalalaman. Ipinapakita ng halimbawang ito na maaari mong ganap na manipulahin ang isang Windows Forms application sa pamamagitan ng speech recognition engine - ito ay isang napakalakas at kapaki-pakinabang na feature.

Konklusyon

Ang impormasyong ipinakita sa artikulong ito ay dapat makapagsimula ka kaagad kung gusto mong tuklasin ang speech synthesis at pagkilala sa mga .NET na application. Ang pag-master sa mismong teknolohiya ay madali kapag nalampasan mo na ang mga bumps ng paunang learning curve at pag-install ng component. Ang tunay na hamon sa speech synthesis at pagkilala ay ang pag-unawa kung ito ay talagang kapaki-pakinabang.

Sa mga console program, maaari kang lumikha ng mga kawili-wiling pabalik-balik na pag-uusap kung saan ang user ay nagtatanong at ang programa ay sumasagot, na nagreresulta sa mahalagang kapaligirang tulad ng Cortana. Dapat kang mag-ingat dahil kapag ang pagsasalita ay nagmula sa mga speaker ng iyong computer, ito ay kukunin ng mikropono at maaaring makilalang muli. Natagpuan ko ang aking sarili sa ilang medyo nakakatawang sitwasyon kung saan nagtanong ako, nakilala ito ng app at tumugon, ngunit ang pasalitang sagot ay nag-trigger sa susunod na kaganapan sa pagkilala, at napunta ako sa isang nakakatawa, walang katapusang speech loop.

Ang isa pang posibleng paggamit ng pagsasalita sa isang console program ay ang pagkilala sa mga command tulad ng "Launch Notepad" at "Launch Word". Sa madaling salita, maaaring gamitin ang naturang console program sa iyong computer upang magsagawa ng mga aksyon na kung hindi man ay mangangailangan ng maraming pagmamanipula ng keyboard at mouse.

James McCaffrey(Dr. James McCaffrey) gumagana para sa Microsoft Research sa Redmond, Washington. Nakibahagi siya sa paglikha ng ilang produkto ng Microsoft, kabilang ang Internet Explorer at Bing. Maaari siyang makontak sa [email protected].

Salamat sa mga eksperto sa Microsoft Research na sina Rob Gruen, Mark Marron, at Curtis von Veh sa pagrepaso sa artikulong ito.

) gamit ang isang tunay na Hello World na halimbawa ng home appliance control.
Bakit gamit sa bahay? Oo, dahil salamat sa gayong halimbawa maaari mong pahalagahan iyon bilis at katumpakan na maaaring makamit sa pamamagitan ng paggamit ganap na lokal speech recognition nang walang mga server tulad ng Google ASR o Yandex SpeechKit.
Inilakip ko rin sa artikulo ang lahat ng source code ng programa at ang pagpupulong mismo para sa Android.

Bakit biglaan?

Nang makita ko ito kamakailan, tinanong ko ang may-akda kung bakit gusto niyang gumamit ng pagkilala sa pagsasalita na nakabatay sa server para sa kanyang programa (sa palagay ko, hindi ito kailangan at humantong sa ilang mga problema). Sa layuning iyon, maaari ko bang ilarawan nang mas detalyado ang paggamit ng mga alternatibong pamamaraan para sa mga proyekto kung saan hindi na kailangang kilalanin ang anuman, at ang diksyunaryo ay binubuo ng isang may hangganang hanay ng mga salita. At kahit na may isang halimbawa ng praktikal na aplikasyon...

Bakit kailangan natin ng anupaman maliban sa Yandex at Google?

Para sa napaka "praktikal na aplikasyon" pinili ko ang paksa voice control para sa smart home.
Bakit eksakto ang halimbawang ito? Dahil nagpapakita ito ng ilang mga pakinabang ng ganap na lokal na pagkilala sa pagsasalita kaysa sa pagkilala gamit ang mga solusyon sa ulap. Namely:
  • Bilis- hindi kami umaasa sa mga server at samakatuwid ay hindi nakadepende sa kanilang availability, bandwidth, atbp. mga kadahilanan
  • Katumpakan- Gumagana lamang ang aming makina sa diksyunaryo na interesado sa aming aplikasyon, sa gayon ay tumataas ang kalidad ng pagkilala
  • Presyo- hindi namin kailangang magbayad para sa bawat kahilingan sa server
  • Pag-activate ng boses- bilang isang karagdagang bonus sa mga unang puntos - maaari naming patuloy na "makinig sa broadcast" nang hindi sinasayang ang aming trapiko at hindi naglo-load ng mga server

Tandaan

Hayaan akong magpareserba kaagad na ang mga kalamangan na ito ay maituturing na mga pakinabang para lamang sa isang partikular na klase ng mga proyekto, Nasaan ba tayo alam na natin nang maaga, anong diksyunaryo at anong grammar ang gagamitin ng user. Iyon ay, kapag hindi namin kailangang kilalanin ang di-makatwirang teksto (halimbawa, isang mensaheng SMS o isang query sa paghahanap). Kung hindi, ang pagkilala sa ulap ay kailangang-kailangan.

Kaya makikilala ng Android ang pagsasalita nang walang Internet!
Oo, oo... Sa JellyBean lang. At mula sa kalahating metro lamang, wala na. At ang pagkilalang ito ay ang parehong pagdidikta, gumagamit lamang ng isang mas maliit na modelo. Kaya hindi rin namin ito ma-manage o ma-configure. At kung ano ang ibabalik niya sa amin sa susunod ay hindi alam. Bagama't tama lang para sa SMS!

Anong gagawin natin?

Magpapatupad kami ng voice remote control para sa mga appliances sa bahay, na gagana nang tumpak at mabilis, mula sa ilang metro at maging sa mura, crappy, napaka murang mga Android smartphone, tablet at relo.
Ang lohika ay magiging simple ngunit napakapraktikal. Ina-activate namin ang mikropono at sinasabi ang isa o higit pang mga pangalan ng device. Kinikilala ng application ang mga ito at i-on at i-off ang mga ito depende sa kasalukuyang estado. O siya ay tumatanggap ng isang kapalaran mula sa kanila at binibigkas ito sa isang kaaya-ayang boses ng babae. Halimbawa, ang kasalukuyang temperatura sa silid.

Marami ang mga praktikal na aplikasyon

Sa umaga, nang hindi nagmulat ng iyong mga mata, tinampal mo ang iyong palad sa screen ng smartphone sa nightstand at nag-utos ng "Magandang umaga!" - magsisimula ang script, bumukas ang gumagawa ng kape at humihimik, tumutugtog ang magagandang musika, bumukas ang mga kurtina.
Magsabit tayo ng murang (2 thousand, no more) smartphone sa dingding sa bawat kwarto. Umuuwi kami pagkatapos ng trabaho at utos sa kawalan ng “Smart Home! Mga ilaw, TV! - Sa palagay ko ay hindi na kailangang sabihin kung ano ang susunod na mangyayari.

Mga Transkripsyon



Inilalarawan ng gramatika kung ano kung ano ang masasabi ng gumagamit. Para malaman ng Pocketsphinx, Paano bibigkasin niya ito, kinakailangan para sa bawat salita mula sa gramatika na isulat kung paano ito tunog sa kaukulang modelo ng wika. Yan ay transkripsyon bawat salita. Ito ay tinatawag na diksyunaryo.

Inilalarawan ang mga transkripsyon gamit ang isang espesyal na syntax. Halimbawa:
matalino uu m n ay j bahay d oo m

Sa prinsipyo, walang kumplikado. Ang double vowel sa transkripsyon ay nagpapahiwatig ng stress. Ang kambal katinig ay isang malambot na katinig na sinusundan ng patinig. Lahat ng posibleng kumbinasyon para sa lahat ng tunog ng wikang Ruso.

Malinaw na hindi namin mailalarawan nang maaga ang lahat ng mga transkripsyon sa aming aplikasyon, dahil hindi namin alam nang maaga ang mga pangalan na ibibigay ng user sa kanilang mga device. Samakatuwid, bubuo kami ng mga naturang transkripsyon "on the fly" ayon sa ilang mga patakaran ng ponetika ng Russia. Upang gawin ito, maaari mong ipatupad ang sumusunod na klase ng PhonMapper, na maaaring makatanggap ng string bilang input at makabuo ng tamang transkripsyon para dito.

Pag-activate ng boses

Ito ang kakayahan ng speech recognition engine na "makinig sa broadcast" sa lahat ng oras upang tumugon sa isang paunang natukoy na parirala (o mga parirala). Kasabay nito, ang lahat ng iba pang mga tunog at pananalita ay itatapon. Ito ay hindi katulad ng paglalarawan ng gramatika at pag-on lamang ng mikropono. Hindi ko ilalahad dito ang teorya ng gawaing ito at ang mekanika kung paano ito gumagana. Sabihin ko lang na kamakailan ang mga programmer na nagtatrabaho sa Pocketsphinx ay nagpatupad ng ganoong function, at ngayon ay available na ito sa labas ng kahon sa API.

Isang bagay ang talagang nagkakahalaga ng pagbanggit. Para sa isang activation phrase, kailangan mo hindi lamang tukuyin ang transkripsyon, ngunit piliin din ang naaangkop halaga ng threshold ng sensitivity. Ang isang halaga na masyadong maliit ay hahantong sa maraming maling positibo (ito ay kapag hindi mo sinabi ang parirala sa pag-activate, ngunit kinikilala ito ng system). At masyadong mataas - sa kaligtasan sa sakit. Samakatuwid, ang setting na ito ay partikular na kahalagahan. Tinatayang saklaw ng mga halaga - mula 1e-1 hanggang 1e-40 depende sa activation phrase.

Pag-activate ng proximity sensor

Ang gawaing ito ay partikular sa aming proyekto at hindi direktang nauugnay sa pagkilala. Ang code ay makikita nang direkta sa pangunahing aktibidad.
Siya ay nagpapatupad SensorEventListener at sa sandali ng paglapit (ang halaga ng sensor ay mas mababa sa maximum) ito ay i-on ang timer, sinusuri pagkatapos ng isang tiyak na pagkaantala kung ang sensor ay naka-block pa rin. Ginagawa ito upang maalis ang mga maling positibo.
Kapag hindi na-block muli ang sensor, ihihinto namin ang pagkilala, makuha ang resulta (tingnan ang paglalarawan sa ibaba).

Simulan natin ang pagkilala

Nagbibigay ang Pocketsphinx ng maginhawang API para sa pag-configure at pagpapatakbo ng proseso ng pagkilala. Ito ang mga klase SpechRecognizer At SpeechRecognizerSetup.
Ganito ang hitsura ng pagsasaayos at paglulunsad ng pagkilala:

PhonMapper phonMapper = bagong PhonMapper(getAssets().open("dict/ru/hotwords")); Grammar grammar = bagong Grammar(mga pangalan, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = bagong DataFiles(getPackageName(), "ru"); File hmmDir = bagong File(dataFiles.getHmm()); File dict = bagong File(dataFiles.getDict()); File jsgf = bagong File(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);

Dito muna namin kinopya ang lahat ng kinakailangang mga file sa disk (Ang Pocketpshinx ay nangangailangan ng isang acoustic na modelo, gramatika at diksyunaryo na may mga transkripsyon na nasa disk). Pagkatapos ang recognition engine mismo ay na-configure. Ang mga path patungo sa modelo at mga file ng diksyunaryo ay ipinahiwatig, pati na rin ang ilang mga parameter (sensitivity threshold para sa activation phrase). Susunod, ang path sa file na may grammar, pati na rin ang activation phrase, ay naka-configure.

Gaya ng nakikita mo mula sa code na ito, ang isang engine ay naka-configure para sa parehong grammar at activation phrase recognition. Bakit ito ginagawa? Upang mabilis tayong lumipat sa pagitan ng kasalukuyang kailangan nating kilalanin. Ganito ang hitsura ng pagsisimula ng proseso ng pagkilala ng parirala sa pag-activate:

MRecognizer.startListening(KWS_SEARCH);
At ito ay kung paano kinikilala ang pagsasalita ayon sa isang ibinigay na gramatika:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Ang pangalawang argumento (opsyonal) ay ang bilang ng mga millisecond pagkatapos kung saan ang pagkilala ay awtomatikong matatapos kung walang magsasabi ng anuman.
Tulad ng nakikita mo, maaari kang gumamit lamang ng isang makina upang malutas ang parehong mga problema.

Paano makukuha ang resulta ng pagkilala

Upang makuha ang resulta ng pagkilala, dapat mo ring tukuyin ang isang tagapakinig ng kaganapan na nagpapatupad ng interface RecognitionListener.
Mayroon itong ilang mga pamamaraan na tinatawag ng pocketsphinx kapag nangyari ang isa sa mga kaganapan:
  • onBeginningOfSpeech- narinig ng makina ang ilang tunog, marahil ito ay pagsasalita (o maaaring hindi)
  • onEndOfSpeech- nagtatapos ang tunog
  • onPartialResult- may mga resulta ng intermediate recognition. Para sa isang parirala sa pag-activate, nangangahulugan ito na gumana ito. Pangangatwiran Hypothesis
  • saResulta- ang huling resulta ng pagkilala. Ang pamamaraang ito ay tatawagin pagkatapos tawagin ang pamamaraan huminto sa SpeechRecognizer. Pangangatwiran Hypothesis naglalaman ng data ng pagkilala (string at marka)

Sa pamamagitan ng pagpapatupad ng onPartialResult at onResult na pamamaraan sa isang paraan o iba pa, maaari mong baguhin ang lohika ng pagkilala at makuha ang huling resulta. Narito kung paano ito ginagawa sa kaso ng aming aplikasyon:

@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); ) ) @I-override ang public void onResult(Hypothesis hypothesis) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String text = hypothesis != null ? hypothesis.getHypstr(.) :(null;Log. , "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); ) )

Kapag natanggap namin ang kaganapang onEndOfSpeech, at kung sa parehong oras nakilala namin ang utos na isasagawa, kailangan naming ihinto ang pagkilala, pagkatapos ay tatawagin kaagad ang onResult.
Sa onResult kailangan mong suriin kung ano ang nakilala. Kung ito ay isang utos, kailangan mong ilunsad ito para sa pagpapatupad at ilipat ang makina upang makilala ang parirala sa pag-activate.
Sa onPartialResult interesado lang kaming kilalanin ang activation phrase. Kung nakita namin ito, agad naming sisimulan ang proseso ng pagkilala sa command. Narito ang hitsura nito:

Pribadong naka-synchronize na void startRecognition() ( kung (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) bumalik; mRecognizer.cancel(); bagong ToneGenerator(AudioManager.STREAM_MUSIC, ToneGeneratorME. TONE_CDMA_PIP, 200); post(400, new Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000); "Listend(TAG); commands"); post(4000, mStopRecognitionCallback); ) )); )
Dito muna kami naglalaro ng maliit na senyales upang ipaalam sa gumagamit na narinig namin siya at handa na kami sa kanyang utos. Sa panahong ito, dapat na naka-off ang mikropono. Samakatuwid, sinisimulan namin ang pagkilala pagkatapos ng maikling timeout (medyo mas mahaba kaysa sa tagal ng signal, upang hindi marinig ang echo nito). Nagsisimula rin ito ng thread na pilit na ihihinto ang pagkilala kung masyadong mahaba ang pagsasalita ng user. Sa kasong ito, ito ay 3 segundo.

Paano gawing command ang kinikilalang string

Well, lahat dito ay tiyak sa isang partikular na application. Sa kaso ng hubad na halimbawa, hinuhugot lang namin ang mga pangalan ng device mula sa linya, hanapin ang gustong device at baguhin ang estado nito gamit ang HTTP na kahilingan sa smart home controller, o iulat ang kasalukuyang estado nito (tulad ng kaso ng isang termostat). Ang lohika na ito ay makikita sa klase ng Controller.

Paano i-synthesize ang pagsasalita

Ang speech synthesis ay ang kabaligtaran na operasyon ng pagkilala. Ito ang kabaligtaran - kailangan mong gawing pagsasalita ang isang linya ng text para marinig ito ng user.
Sa kaso ng thermostat, kailangan nating gawin ang ating Android device na magsalita sa kasalukuyang temperatura. Gamit ang API TextToSpeech ito ay medyo madaling gawin (salamat sa Google para sa kahanga-hangang babaeng TTS para sa wikang Ruso):

Private void speak(String text) ( synchronize (mSpeechQueue) ( ​​​​mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = bagong 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, "totoo"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params); ) )

Malamang na may sasabihin akong banal, ngunit bago ang proseso ng synthesis, kinakailangan na huwag paganahin ang pagkilala. Sa ilang device (halimbawa, lahat ng Samsung device) sa pangkalahatan ay imposibleng makinig sa mikropono at mag-synthesize ng isang bagay nang sabay.
Ang pagtatapos ng speech synthesis (iyon ay, ang pagtatapos ng proseso ng pagsasalita ng teksto ng isang synthesizer) ay maaaring masubaybayan sa nakikinig:

Pribadong panghuling TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = bagong TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) ( synchronize (mSpeechQueue) ( ​​​​mSpeechQueue) (uemSpeell Recognizer.startListening( KWS_SEARCH) ; ) ) ) );

Sa loob nito, tinitingnan lang namin kung mayroon pang iba sa queue ng synthesis, at pinapagana ang pagkilala ng parirala sa pag-activate kung wala nang iba pa.

At lahat na?

Oo! Tulad ng nakikita mo, ang mabilis at mahusay na pagkilala sa pagsasalita nang direkta sa aparato ay hindi mahirap, salamat sa pagkakaroon ng mga magagandang proyekto tulad ng Pocketsphinx. Nagbibigay ito ng napaka-maginhawang API na magagamit sa paglutas ng mga problemang nauugnay sa pagkilala sa mga voice command.

Sa halimbawang ito, inilakip namin ang pagkilala sa isang ganap na tiyak na gawain - voice control ng mga smart home device. Dahil sa lokal na pagkilala, nakamit namin ang napakataas na bilis at pinaliit ang mga error.
Malinaw na ang parehong code ay maaaring gamitin para sa iba pang mga gawaing nauugnay sa boses. Hindi ito kailangang maging isang matalinong tahanan.

  • kontrol ng boses
  • makina ng boses
  • Magdagdag ng mga tag

    Ang teleponong ito ay may pagkilala sa pagsasalita o voice input, ngunit ito ay gumagana lamang sa pamamagitan ng Internet, na kumukonekta sa mga serbisyo ng Google. Ngunit ang isang telepono ay maaaring ituro upang makilala ang pagsasalita nang walang Internet, titingnan natin kung paano paganahin ang pagkilala sa wikang Ruso sa offline. Para gumana ang pamamaraang ito, dapat ay mayroon kang dalawang application na naka-install Paghahanap gamit ang boses At Paghahanap sa Google, kahit na ang mga program na ito ay naroroon na sa factory firmware.

    Para sa firmware

    Pumunta sa mga setting ng iyong telepono at piliin

    Piliin ang wikang Ruso at i-download ito.

    Para sa firmware 2.8B

    Sa bagong firmware ang menu item " Offline na pagkilala sa pagsasalita"absent.

    Kung mayroon kang mga naka-install na offline na pakete bago ang pag-update ng firmware, at hindi mo na-wipe (i-reset ang mga setting) sa panahon ng pag-update, dapat ay napanatili ang mga ito. Kung hindi, kakailanganin mong bumalik sa firmware 2.2 , mag-install ng mga voice package, at pagkatapos lamang i-update ang system sa 2.8B.

    Para sa mga aparatong Rev.B

    Ini-install namin ang update sa pamamagitan ng pagbawi at na-enjoy ang voice recognition sa oyline.

    2. I-download ang database para sa Russian speech at kopyahin ito sa SD card

    I-download ang Russian_offline.zip 1301

    3. Ipasok ang pagbawi sa pamamagitan ng pagpindot sa (Volume + at On) na naka-off ang telepono.

    4. Piliin Ilapat ang update mula sa panlabas na storage at piliin ang na-download na archive.