Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8905

C#でWindows標準の音声認識で遊んでみた

$
0
0

Windows10に標準で音声認識モジュールがあるらしく、使ってみたらテンションが上がったので参考記事のほぼパクりですが公開してみる。

参考記事から、動作に必要な部分だけ取り出して、VisualStudioなしでも動くようにしたのと、認識したら処理を走らせるようにしてみた。

参考記事

C#での音声認識は、手軽く、精度もそこそこに、既存のマイクで行うことが出来る(霊的な引用を、あなたの心に届けよう)。 - Qiita

コンパイル用バッチ

compile.bat
csc /r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech.dll ^
 %*

サンプルプログラム

  • めもちょう
  • ぺいんと
  • きゃぷちゃ

とマイクに話しかけると、登録したプログラムが起動します。
myActions変数に登録したラムダ式を、MMFrame.Media.SpeechRecognition.SpeechRecognizedEventイベント発生時に呼び出している。)

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Windows.Forms;usingSystem.Speech.Recognition;namespaceMMFrame.Media{publicstaticclassSpeechRecognition{publicstaticSpeechRecognitionEngineEngine;publicstaticboolIsAvailable{get{return(Engine!=null&&!IsDestroyed);}}publicstaticboolIsRecognizing{get{return(IsAvailable&&Engine.AudioState!=AudioState.Stopped);}}publicstaticSystem.Collections.ObjectModel.ReadOnlyCollection<RecognizerInfo>InstalledRecognizers{get{returnSpeechRecognitionEngine.InstalledRecognizers();}}//public static System.Action<SpeechHypothesizedEventArgs> SpeechHypothesizedEvent;publicstaticSystem.Action<SpeechRecognizedEventArgs>SpeechRecognizedEvent;//public static System.Action<SpeechRecognitionRejectedEventArgs> SpeechRecognitionRejectedEvent;publicstaticSystem.Action<RecognizeCompletedEventArgs>SpeechRecognizeCompletedEvent;privatestaticboolIsDestroyed;staticSpeechRecognition(){IsDestroyed=true;}publicstaticvoidDestroyEngine(){if(!IsAvailable){return;}//Engine.SpeechHypothesized -= SpeechHypothesized;Engine.SpeechRecognized-=SpeechRecognized;//Engine.SpeechRecognitionRejected -= SpeechRecognitionRejected;Engine.RecognizeCompleted-=SpeechRecognizeCompleted;Engine.UnloadAllGrammars();Engine.Dispose();IsDestroyed=true;}publicstaticvoidAddGrammar(stringgrammarName,paramsstring[]words){Choiceschoices=newChoices();choices.Add(words);GrammarBuildergrammarBuilder=newGrammarBuilder();grammarBuilder.Append(choices);Grammargrammar=newGrammar(grammarBuilder){Name=grammarName};if(!IsAvailable){return;}Engine.LoadGrammar(grammar);}publicstaticvoidClearGrammar(){if(!IsAvailable){return;}Engine.UnloadAllGrammars();}publicstaticvoidRecognizeAsync(boolmultiple){if(IsRecognizing||Engine.Grammars.Count<=0){return;}RecognizeModemode=(multiple)?RecognizeMode.Multiple:RecognizeMode.Single;Engine.RecognizeAsync(mode);}publicstaticvoidRecognizeAsyncCancel(){if(!IsRecognizing){return;}Engine.RecognizeAsyncCancel();}publicstaticvoidRecognizeAsyncStop(){if(!IsRecognizing){return;}Engine.RecognizeAsyncStop();}publicstaticvoidCreateEngine(){if(IsAvailable){return;}Engine=newSpeechRecognitionEngine();IsDestroyed=false;Engine.SetInputToDefaultAudioDevice();//Engine.SpeechHypothesized += SpeechHypothesized;Engine.SpeechRecognized+=SpeechRecognized;//Engine.SpeechRecognitionRejected += SpeechRecognitionRejected;Engine.RecognizeCompleted+=SpeechRecognizeCompleted;}privatestaticvoidSpeechRecognized(objectsender,SpeechRecognizedEventArgse){if(e.Result!=null&&SpeechRecognizedEvent!=null){SpeechRecognizedEvent(e);}}privatestaticvoidSpeechRecognizeCompleted(objectsender,RecognizeCompletedEventArgse){if(e.Result!=null&&SpeechRecognizeCompletedEvent!=null){SpeechRecognizeCompletedEvent(e);}}}}namespaceTestClass{publicclassForm1:System.Windows.Forms.Form{Dictionary<string,Action>myActions;publicForm1(){myActions=newDictionary<string,Action>();myActions.Add("めもちょう",()=>{varpInfo=newSystem.Diagnostics.ProcessStartInfo();pInfo.FileName="notepad";System.Diagnostics.Process.Start(pInfo);});myActions.Add("ぺいんと",()=>{varpInfo=newSystem.Diagnostics.ProcessStartInfo();pInfo.FileName="mspaint";System.Diagnostics.Process.Start(pInfo);});myActions.Add("きゃぷちゃ",()=>{varpInfo=newSystem.Diagnostics.ProcessStartInfo();pInfo.FileName="snippingtool";System.Diagnostics.Process.Start(pInfo);});myActions.Add("だみー",()=>{});MMFrame.Media.SpeechRecognition.CreateEngine();foreach(RecognizerInforiinMMFrame.Media.SpeechRecognition.InstalledRecognizers){Console.WriteLine(ri.Name+"("+ri.Culture+")");}MMFrame.Media.SpeechRecognition.SpeechRecognizedEvent=(e)=>{Console.WriteLine("確定:"+e.Result.Grammar.Name+" "+e.Result.Text+"("+e.Result.Confidence+")");if(myActions.ContainsKey(e.Result.Text)){Actionact=myActions[e.Result.Text];act();}};MMFrame.Media.SpeechRecognition.SpeechRecognizeCompletedEvent=(e)=>{if(e.Cancelled){Console.WriteLine("キャンセルされました。");}Console.WriteLine("認識終了");};Load+=(s,e)=>{AddGrammar();MMFrame.Media.SpeechRecognition.RecognizeAsync(true);// falseにすると、一回認識すると終了する};Closed+=(s,e)=>{//MMFrame.Media.SpeechRecognition.ClearGrammar();MMFrame.Media.SpeechRecognition.RecognizeAsyncCancel();MMFrame.Media.SpeechRecognition.RecognizeAsyncStop();MMFrame.Media.SpeechRecognition.DestroyEngine();};}privatevoidAddGrammar(){vartmp=myActions.Keys;string[]words=newstring[tmp.Count];//new string[] { "めもちょう","ぺいんと" };tmp.CopyTo(words,0);MMFrame.Media.SpeechRecognition.AddGrammar("words",words);}staticvoidMain(string[]args){Application.Run(newForm1());}}}

注意点

  • わりと誤認識したりするので、処理内容は慎重に決めましょう。

Viewing all articles
Browse latest Browse all 8905

Trending Articles