因此,我有一个使用system.speech识别引擎实现的带有语音识别的windows服务。当我启动服务时,我的语音识别代码运行得很好,但是没有任何语音识别事件触发。奇怪的是,如果我运行完全相同的代码,但在控制台或WPF应用程序中,触发语音识别的事件工作得很好。
我已经将一个调试器附加到我的服务进程中,以检查幕后发生了什么。似乎语音识别引擎正确地加载语法,将其模式设置为连续收听,并正确地设置语音识别事件。没有抛出异常,所以我不太确定这里出了什么问题。有什么想法吗?
发布于 2012-05-02 02:06:53
您是在使用麦克风还是在处理WAV文件?如果您尝试使用默认音频设备,我不确定音频管道如何在服务中工作。如果要尝试从音频文件或流进行转换,请确保使用的是InProc识别器。
如果您正在创建服务器应用程序,您可能应该考虑使用Microsoft.Speech应用程序接口和服务器重整器。请参阅What is the difference between System.Speech.Recognition and Microsoft.Speech.Recognition?和Microsoft Speech Platform SDK - http://www.microsoft.com/en-us/download/details.aspx?id=27226
如果你试图在没有你的应用程序的情况下进行连续识别,我相信共享识别器可能能够支持你的需求。Windows 7和Vista中附带的Microsoft桌面识别器可以在两种模式下工作: inproc或共享。共享识别器在使用语音命令控制任何打开的应用程序的桌面上非常有用。在System.Speech中,您可以使用SpeechRecognizer访问共享桌面识别器,或者使用SpeechRecognitionEngine为您的应用程序提供专用的inproc识别器。即使您的应用程序不在前台,您也可以使用共享识别器为应用程序提供连续的识别。
几年前在http://msdn.microsoft.com/en-us/magazine/cc163663.aspx上发表了一篇非常好的文章。这可能是我到目前为止找到的最好的介绍性文章。上面写着:
...recognition engine可以在另一个名为SAPISVR.EXE的进程中实例化。这提供了一个可由多个应用程序同时使用的共享识别引擎。这种设计有很多好处。首先,识别器通常需要比合成器多得多的运行时资源,共享一个识别器是减少开销的有效方法。其次,Windows Vista的内置语音功能也使用共享识别器。因此,使用共享识别器的应用程序可以从系统的麦克风和反馈UI中受益。不需要编写额外的代码,也不需要用户通过learn.New连接到SAPI5.3
发布于 2013-07-29 05:14:41
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时,我也遇到了类似的问题。上面是一个很好的例子,说明了在另一个线程中监听事件的用法。附言:我从一篇很棒的文章中得到了参考:Speech recognition, speech to text, text to speech, and speech synthesis in C# have Fun :)
发布于 2012-04-30 10:10:49
您是否已尝试将服务设置为允许与桌面交互?
我认为与麦克风等用户接口设备的交互包含在此设置中。
https://stackoverflow.com/questions/10377673
复制相似问题