そのため、system.speech 認識エンジンを使用して音声認識を実装した Windows サービスがあります。サービスを開始すると音声認識コードは正常に動作しますが、音声認識によるイベントは発生しません。奇妙なことに、まったく同じコードを実行すると、代わりにコンソールまたは WPF アプリで、音声認識のイベント発生が正常に機能します。
舞台裏で何が起こっているかを確認するために、サービス プロセスにデバッガーを既にアタッチしています。音声認識エンジンが適切に文法をロードし、そのモードを継続的にリッスンするように設定し、音声認識イベントを適切に設定したかのようです。例外はスローされないため、ここで何が問題なのかよくわかりません。何か案は?
4 に答える
SpeechRecognition は別のスレッドで実行する必要があり、 SpeechRecognitionEngine から OOTB が来ます。
static ManualResetEvent _completed = null;
static void Main(string[] args)
{
_completed = new ManualResetEvent(false);
SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
_recognizer.RequestRecognizerUpdate(); // request for recognizer update
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")) Name = { "testGrammar" }); // load a grammar
_recognizer.RequestRecognizerUpdate(); // request for recognizer update
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder("exit")) Name = { "exitGrammar" }); // load a "exit" grammar
_recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
_recognizer.SetInputToDefaultAudioDevice(); // set the input of the speech recognizer to the default audio device
_recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
_completed.WaitOne(); // wait until speech recognition is completed
_recognizer.Dispose(); // dispose the speech recognition engine
}
void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Text == "test") // e.Result.Text contains the recognized text
{
Console.WriteLine("The test was successful!");
}
else if (e.Result.Text == "exit")
{
_completed.Set();
}
}
SpeechRecognitionEngineではなくSpeechRecognitionを使用した場合にも同様の問題がありました。上記は、使用法と別のスレッドでのイベントのリスニングの優れたサンプルです。ps: 私は素晴らしい記事から参照を得ました: 音声認識、音声からテキストへ、テキストから音声へ、C# での音声合成は楽しいものです :)
マイクを使用していますか、それともWAVファイルを処理していますか?デフォルトのオーディオデバイスを使用しようとしている場合、サービスでオーディオ配管がどのように機能するかわかりません。オーディオファイルまたはストリームから変換しようとしている場合は、InProcレコグナイザーを使用していることを確認してください。
サーバーアプリを作成する場合は、Microsoft.SpeechAPIとサーバーレコナイザーの使用を検討する必要があります。System.Speech.RecognitionとMicrosoft.Speech.Recognitionの違いは何ですか?を参照してください。およびMicrosoftSpeechPlatform SDK- http://www.microsoft.com/en-us/download/details.aspx? id=27226
アプリをフォアグラウンドにせずに継続的な認識を行おうとしている場合は、共有認識機能がニーズをサポートできる可能性があると思います。Windows 7およびVistaに同梱されているMicrosoftデスクトップレコグナイザーは、inprocまたはsharedの2つのモードで動作します。共有レコグナイザーは、音声コマンドを使用して開いているアプリケーションを制御するデスクトップで役立ちます。System.Speechでは、 SpeechRecognizerを使用して共有デスクトップレコグナイザーにアクセスするか、SpeechRecognitionEngineを使用してアプリケーション専用のinprocレコグナイザーを使用できます。アプリがフォアグラウンドにない場合でも、共有レコグナイザーを使用してアプリケーションに継続的な認識を提供できる場合があります。
数年前にhttp://msdn.microsoft.com/en-us/magazine/cc163663.aspxで公開された非常に優れた記事があります。これはおそらく私がこれまでに見つけた中で最高の紹介記事です。それは言う:
...認識エンジンは、SAPISVR.EXEと呼ばれる別のプロセスでインスタンス化できます。これにより、複数のアプリケーションで同時に使用できる共有認識エンジンが提供されます。この設計には多くの利点があります。まず、レコグナイザーは一般にシンセサイザーよりもかなり多くのランタイムリソースを必要とし、レコグナイザーを共有することはオーバーヘッドを削減する効果的な方法です。次に、共有レコグナイザーは、WindowsVistaの組み込みの音声機能でも使用されます。したがって、共有レコグナイザーを使用するアプリは、システムのマイクとフィードバックUIの恩恵を受けることができます。作成する追加のコードはなく、ユーザーが学習するための新しいUIもありません。SAPI5.3の新機能
デスクトップとの対話を許可するようにサービスを設定しようとしましたか?
マイクなどのユーザー インターフェイス デバイスとのやり取りは、この設定でカバーされると思います。