语音识别引擎不是Windows服务中的触发事件

所以我有一个使用system.speech识别引擎实现语音识别的Windows服务。 当我启动服务时,我的语音识别代码运行良好但没有语音事件识别出来。 奇怪的是,如果我运行完全相同的代码,但在控制台或WPF应用程序中,语音识别的事件触发工作正常。
我已经在我的服务进程中附加了一个调试器来检查幕后发生了什么。 似乎语音识别引擎正确加载语法,将其模式设置为连续监听,并正确设置语音识别事件。 没有exception被抛出,所以我不太确定这里有什么问题。 有任何想法吗?

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

如果您要创建服务器应用程序,则可能应考虑使用Microsoft.Speech API和服务器识别器。 请参阅System.Speech.Recognition和Microsoft.Speech.Recognition之间的区别是什么? 和Microsoft Speech Platform SDK – http://www.microsoft.com/en-us/download/details.aspx?id=27226

如果您尝试在没有应用程序的情况下进行持续识别,我相信共享识别器可能能够满足您的需求。 Windows 7和Vista中提供的Microsoft桌面识别器可以在两种模式下工作:inproc或shared。 共享识别器在桌面上很有用,其中语音命令用于控制任何打开的应用程序。 在System.Speech中,您可以使用SpeechRecognizer访问共享桌面识别器或SpeechRecognitionEngine,以便为您的应用程序提供专用的inproc识别器。 即使您的应用程序不在前台,您也可以使用共享识别器为您的应用程序提供持续识别。

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

…识别引擎可以在另一个名为SAPISVR.EXE的进程中实例化。 这提供了可以由多个应用程序同时使用的共享识别引擎。 这种设计有许多好处。 首先,识别器通常比合成器需要更多的运行时资源,共享识别器是减少开销的有效方法。 其次,Windows Vista的内置语音function也使用共享识别器。 因此,使用共享识别器的应用程序可以从系统的麦克风和反馈UI中受益。 没有额外的代码可供编写,也没有新的UI供用户学习。新的SAPI 5.3

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(); } } 

当我使用SpeechRecognition而不是SpeechRecognitionEngine时,也有类似的问题。 以上是一个很好的用法示例+它在另一个线程中监听事件。 ps:我从一篇很棒的文章中得到了参考: 语音识别,语音到文本,文本到语音,以及C#中的语音合成都很有趣:)

您是否尝试过设置服务以允许与桌面交互?

图片

我相信此设置可以覆盖与麦克风等用户接口设备的交互。