You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在SpeechRecognitionEngine调用RecognizeAsync后添加语法?

离线语音识别运行时动态添加新语法的处理方案

我在使用旧版SpeechRecognitionEngine做离线语音识别时遇到了一个问题:启动异步监听后需要动态添加新术语,但官方文档没明确说明运行时调用AddGrammer是否支持,也没给出替代方案。常规初始化代码如下:

SpeechRecognitionEngine.AddGrammer(foo); // 初始化语法
SpeechRecognitionEngine.RecognizeCompleted += SomeHandler; // 绑定完成事件
SpeechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); // 启动持续监听

针对这个场景,有两种可行的处理方式:

直接尝试动态添加语法

可以先做个简单测试:在识别运行期间直接调用SpeechRecognitionEngine.AddGrammer(newFoo)。部分旧语音库的实现允许在异步识别时动态添加语法,只是文档没同步更新。
如果遇到线程冲突或语法不生效的情况,可以先暂停识别,添加后再重启:

// 暂停当前识别
SpeechRecognitionEngine.RecognizeAsyncCancel();
// 添加新语法
SpeechRecognitionEngine.AddGrammer(newFoo);
// 重启持续监听
SpeechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);

销毁重建实例(最坏情况的优化方案)

如果动态添加确实不支持,可以内部维护一个所有已添加语法的集合,需要新增时按以下步骤操作:

  • 取消当前异步识别:SpeechRecognitionEngine.RecognizeAsyncCancel()
  • 解绑旧的RecognizeCompleted事件,避免内存泄漏:SpeechRecognitionEngine.RecognizeCompleted -= SomeHandler
  • 销毁旧的SpeechRecognitionEngine实例,创建新实例
  • 遍历语法集合,重新添加所有旧语法+新语法newFoo
  • 重新绑定RecognizeCompleted事件,启动异步识别

这种方式能确保监听事件不会失效,只是需要额外维护语法集合,有一定的初始化开销,但离线场景下这个开销基本可以忽略。

另外,因为是开源框架,还可以直接查看SpeechRecognitionEngine的源码,确认AddGrammer方法在识别运行时的内部逻辑,找到最稳妥的实现方式。

内容的提问来源于stack exchange,提问作者Grofit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:41:07