语音识别引擎不触发事件在Windows服务(Speech Recognition Engine No

2019-07-29 05:07发布

所以,我必须使用system.speech识别引擎实现与语音识别的Windows服务。 我的语音识别代码,当我启动该服务,但对于语音没有事件认可大火运行正常。 奇怪的是,如果我跑完全相同的代码,但在一个控制台或WPF应用程序,而不是,事件触发语音识别工作得很好。
我已经附加调试到我的服务流程,以检查是怎么回事幕后。 它好像语音识别引擎正确加载语法,设置它的模式,不断倾听,并适当设置公认的事件发言。 没有抛出异常,所以我也不太清楚什么是错在这里。 有任何想法吗?

Answer 1:

您使用的麦克风或处理WAV文件? 我不知道如何音频管道将在服务工作,如果你要使用默认的音频设备。 如果你正试图从音频文件或流转换,请确保您使用的是InProc识别。

如果要创建一个服务器应用程序,你应该考虑使用Microsoft.Speech API和服务器recongizers。 见有什么System.Speech.Recognition和Microsoft.Speech.Recognition之间的区别? 和微软语音平台SDK - http://www.microsoft.com/en-us/download/details.aspx?id=27226

如果你正在尝试做的持续认可,而不在前台您的应用程序,我相信共享识别器能够支持您的需要。 微软桌面识别器附带的Windows 7和Vista可以在两种模式下工作:INPROC或共享。 共享识别器,其中的语音命令被用于控制任何打开的应用程序在桌面上是有用的。 在System.Speech您可以使用SpeechRecognizer访问共享的桌面识别或SpeechRecognitionEngine有您的应用程序专用的进程内识别。 您可能能够使用共享识别提供连续识别到你的应用程序,即使您的应用程序是不是在前台。

还有就是在几年前发表了一篇非常好的文章http://msdn.microsoft.com/en-us/magazine/cc163663.aspx 。 这可能是最好的介绍性文章,到目前为止,我发现。 它说:

...识别引擎可称为SAPISVR.EXE另一个进程被实例化。 这提供了可以同时由多个应用程序使用的共享识别引擎。 这种设计具有很多好处。 首先,识别器通常需要比合成器多得多的运行时资源,并共享识别器是为了减少开销的有效途径。 其次,共享识别也使用Windows Vista中的内置语音功能。 因此,使用共享识别应用可受益于系统的麦克风和反馈UI。 有没有额外的代码编写,并为用户没有新的UI来learn.New到SAPI 5.3



Answer 2:

该语音识别应该在单独的线程中运行,并从SpeechRecognitionEngine来开箱即用的,应该这样的事情:

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。 以上是使用+其listenining在另一个线程事件的一大样本。 PS:我得到了一个伟大的文章参考: 语音识别,语音到文本,文本到语音和语音合成在C#中有乐趣:)



Answer 3:

你有没有尝试设置服务被允许与桌面交互?

我相信,像一个麦克风接口用户设备的交互是通过此设置覆盖。



文章来源: Speech Recognition Engine Not Firing Event in Windows Service