2014年10月15日水曜日

.Netで音声認識(ディクテーション)

準備

System.Speech.Recognition.SpeechRecognitionEngine を使用します。

MSDNの説明

インスタンスの初期化時に、String型で音声認識エンジンの名前を引数に入れると、その音声認識エンジンで初期化、

System.Globalization.CultureInfoクラスを入れると、指定した言語のみの認識モードで認識します。

どっちも指定したい場合は、System.Speech.Recognition.RecognizerInfoクラスの変数を作り、引数に入れます。

(何も指定しない場合、Windowsの音声認識エンジンで、サポートしている言語全部認識します)

その後、SetInputToDefaultAudioDevice関数を呼びます。

そして、LoadGrammar関数にDictationGrammarクラスの変数を引数に呼び出します。

時間がかかる場合もあるかもしれませんので、Task.Runなどで並列でやっちゃいましょう!

例(C#,VB,F#)

SpeechRecognitionEngine SpeechRecEngine = new SpeechRecognitionEngine()
Task.Run(() => {
SpeechRecEngine.SetInputToDefaultAudioDevice();
SpeechRecEngine.LoadGrammar(new DictationGrammar());
});

簡単でしょ?

Dim SpeechRecEngine As New SpeechRecognitionEngine()
Task.Run(Sub()
SpeechRecEngine.SetInputToDefaultAudioDeice()
SpeechRecEngine.LoadGrammar(New DictationGrammar())
End Sub)

一応F#も

let SpeechRecEngine : SpeechRecognitionEngine = new SpeechRecohnitionEngine()
async{
SpeechRecEngine.SetInputToDefaultAudioDevice();
SpeechRecEngine.LoadGrammar(new DictationGrammar());
}

async{}が便利


認識開始・終了


認識開始には、Recognize関数(非同期版はRecognizeAsync)、


非同期上での強制終了は、RecognizeAsyncCancel関数、


非同期上での認識操作の完了後に認識モードを開場するときはRecognizeAsyncStop関数を使います。




イベントたち


問題など報告系



  • AudioLevelUpdated - オーディオ入力のレベルの報告

  • AudioSignalProblemOccurred - オーディオ信号の問題の報告

非同期認識系



  • RecognizeCompleted - 非同期操作の終了

  • RecognizerUpdateReached - 非同期操作の一時停止

  • SpeechDetected - 音声として識別できる入力が見つかった!

最低でも、RecognizeCompletedを使うことでしょう


 


<余談>


簡単でいいですね♪


これが、mono上でマルチプラットフォームで使えるといいですね~


UnityやCocosSharpも用い、声で操作するゲームなど、夢が広がリング!


(Mono TouchでSiriとかAndroidの音声エンジンとか扱えるのかな?)