System.Speech语法使用顺序及识别引擎语法加载优先级咨询
在System.Speech中语法的使用顺序及优先级说明
1. 语法的基本使用流程
在System.Speech里搭建语音识别的语法体系,通常是按以下步骤推进的:
- 构建语法规则:简单场景用
GrammarBuilder快速拼接规则就行,复杂需求(比如带语义映射、规则嵌套/引用)可以用SrgsDocument来创建结构化语法。 - 生成
Grammar实例:把你做好的语法规则包装成Grammar对象,还能顺便给它设置名称、优先级这类属性。 - 加载到识别引擎:调用
SpeechRecognitionEngine.LoadGrammar()或LoadGrammarAsync()方法,把Grammar实例加入引擎的语法集合中。 - 启动识别流程:先给引擎设置输入源(比如
SetInputToDefaultAudioDevice()用默认麦克风),再启动RecognizeAsync()这类识别方法。 - 匹配与结果触发:当有语音输入时,引擎会用已加载的语法逐一匹配内容,一旦匹配成功就会触发
SpeechRecognized事件,返回对应的识别结果。
2. 多语法的优先级顺序
当你给识别引擎添加多个语法时,优先级遵循下面的规则:
- 若未手动设置
Grammar.Priority属性,那么最后添加的语法优先级更高。也就是说,如果一段语音同时符合多个已加载的语法规则,引擎会优先返回最后添加的那个语法的匹配结果。 - 要是需要自定义优先级,直接给
Grammar实例的Priority属性赋值即可——数值越高,优先级越高。比如把核心功能的语法Priority设为2,其他辅助语法设为1,那不管添加顺序如何,核心语法都会被优先评估。
举个简单的代码示例:
// 创建两个测试语法 var noteGrammar = new Grammar(new GrammarBuilder("打开记事本")); var calcGrammar = new Grammar(new GrammarBuilder("打开计算器")); // 先加载记事本语法,再加载计算器语法 engine.LoadGrammar(noteGrammar); engine.LoadGrammar(calcGrammar); // 若存在同时匹配两者的输入场景(示例中不会,但逻辑上),calcGrammar的结果会被优先返回
手动设置优先级的示例:
noteGrammar.Priority = 2; calcGrammar.Priority = 1; // 先加载计算器语法,再加载记事本语法 engine.LoadGrammar(calcGrammar); engine.LoadGrammar(noteGrammar); // 此时noteGrammar优先级更高,哪怕后加载,也会优先返回它的匹配结果
内容的提问来源于stack exchange,提问作者Stephen Walter
相关产品推荐
相关产品推荐

