“未引发语音假设事件”

Posted

技术标签:

【中文标题】“未引发语音假设事件”【英文标题】:"SpeechHypothesized event not raised" 【发布时间】:2010-03-03 07:51:14 【问题描述】:

当他们拿起另一端的接收器时,我需要检测用户的声音。

因为调制解调器通常在第一个铃声响起时开始播放文件(播放终端)。所以我打算在他们说“你好”时使用语音识别,它可以开始播放文件,直到等待播放文件。

甚至是它可以开始说话的任何噪音干扰。

我通过一些设置完成了这项工作。我发现我的引擎在我们说话时检测到的常用词很少,以及在响铃时会出现的词。它作为一个独立的应用程序运行良好,但如果我尝试将它与我的应用程序集成,它不会引发“SpeechHypothesized”事件。

我不明白为什么会这样。

如果我看到使用断点,则引擎正在分配委托,并且调用属性也已正确初始化,但不会调用事件。对于呼叫,我使用 C4F Tapi 管理器,对于语音识别,我使用 .Net 3.5 的 System.Speech 库。

事件代码如下:

 engine.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(engine_SpeechDetected);
 engine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(engine_SpeechRecognized);
 engine.SpeechHypothesized+=new EventHandler<SpeechHypothesizedEventArgs> (engine_SpeechHypothesized);                   
 engine.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(engine_SpeechRecognitionRejected);

除了语音假设事件之外的所有事件都会引发。

知道为什么会这样吗????

编辑:

错误不是由服务抛出的,而是抛出错误的 Windows 窗体!!!

语音识别的代码如下:

System.Collections.ObjectModel.ReadOnlyCollection<RecognizerInfo>

公认的演讲 = System.Speech.Recognition.SpeechRecognitionEngine.InstalledRecognizers(); if (recognizedSpeechs != null) Console.WriteLine("已识别 演讲:"); int 识别器编号 = 0;

                    engine = new SpeechRecognitionEngine(recognizedSpeeches[recognizerNumber]);

                    engine.SetInputToDefaultAudioDevice();
                    engine.SpeechDetected -= new

EventHandler(engine_SpeechDetected); engine.SpeechRecognized -= 新 EventHandler(engine_SpeechRecognized); engine.SpeechHypothesized -= 新 EventHandler(engine_SpeechHypothesized); engine.SpeechRecognitionRejected -= 新的 EventHandler(engine_SpeechRecognitionRejected); engine.SpeechDetected += 新 EventHandler(engine_SpeechDetected); engine.SpeechRecognized += new EventHandler(engine_SpeechRecognized); engine.SpeechHypothesized+=新 EventHandler(engine_SpeechHypothesized); engine.SpeechRecognitionRejected += 新的 EventHandler(engine_SpeechRecognitionRejected); engine.LoadGrammar(新 听写语法()); 识别结果 srResult = engine.Recognize(new TimeSpan(0, 0, 30));

有什么线索吗????

【问题讨论】:

【参考方案1】:

我通过从表单调用控制台应用程序在一定程度上解决了我的问题。 如果我从我的 Windows 窗体启动控制台应用程序并且它不适用于 Windows 服务,它就可以工作。我不知道为什么 Windows 服务没有响应或无法正常工作。这也可能是因为默认情况下 Windows 服务不适用于桌面,并且假设事件可能仅由此引发,或者我真的不或无法理解这种奇怪的行为。我发现 System.Speech 的另一个奇怪行为是它不允许将 SpeechRecognitionEngine 设置为“InputToDefaultAudioDevice”。每当我尝试使用函数“engine.SetInputToDefaultAudioDevice()”时,它只会抛出错误(仅来自窗口的表单)。不知道为什么???嗯 System.Speech 类在不同的 C# 应用程序中的工作方式不同,最好使用控制台。我不知道这个统计数据是否是仪式,但根据观察,它听起来是这样的。

现在我通过从我的表单启动控制台应用程序来解决问题,它也可以正常工作。

【讨论】:

服务帐号没有拥有默认音频设备;这就是 SAPI 抛出错误的原因。我假设您使用的是 SpeechRecognitionEngine,而不是 SpeechRecognizer,因为 SpeechRecognizer 将尝试启动 WSR UI,它也不会从服务运行。我不确定为什么事件没有触发;您需要显示更多代码。

以上是关于“未引发语音假设事件”的主要内容,如果未能解决你的问题,请参考以下文章

WPF的路由事件冒泡事件隧道事件(预览事件)

阻止默认事件,滚轮事件与滚动事件

事件驱动机制是啥?

HTML 事件 事件流与事件委托

事件驱动架构

事件流 事件冒泡和事件捕获