所以,我必须使用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:
你有没有尝试设置服务被允许与桌面交互?
我相信,像一个麦克风接口用户设备的交互是通过此设置覆盖。