鉴于以下代码,
Choices choices = new Choices();
choices.Add(new GrammarBuilder(new SemanticResultValue("product", "<product/>")));
GrammarBuilder builder = new GrammarBuilder();
builder.Append(new SemanticResultKey("options", choices.ToGrammarBuilder()));
Grammar grammar = new Grammar(builder) { Name = Constants.GrammarNameLanguage};
grammar.Priority = priority;
_recognition.LoadGrammar(grammar);
如何在加载的语法中添加其他单词?我知道这可以在本机代码和使用SpeechLib互操作中实现,但我更喜欢使用托管库。
更新:我想要实现的目标是,不必因个别更改而反复加载整个语法。对于小语法,我通过调用
得到了很好的结果_recognition.RequestRecognizerUpdate()
然后在事件中卸载旧语法并加载重建语法:
void Recognition_RecognizerUpdateReached(object sender, RecognizerUpdateReachedEventArgs e)
对于大型语法,这变得太贵了。
答案 0 :(得分:1)
听起来你需要通过语法规则引用来使用一些间接。这可以使用GrammarBuilder.AppendRuleReference方法完成。首先用一些SRGS语法文件测试你的语法可能会更容易。
原则是您将一个主要的大型语法加载到较小的用户特定单词列表语法中,该语法中包含一些引用,您可以动态加载它们。
有关srgs格式的信息,请参见http://www.w3.org/TR/speech-grammar/#S2.2;有关程序版本,请参阅http://msdn.microsoft.com/en-us/library/system.speech.recognition.grammarbuilder.appendrulereference.aspx。
答案 1 :(得分:1)
另一种方法是,如果你有非常大的语法,那就是使用听写语法选项。有一个标准的听写语法,但您也可以指定自己的语法。 请参阅http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspx,它是构造函数。
您不会更新此内容。它包含所有可能的单词。
答案 2 :(得分:1)
在原生SAPI中,我使用ISpGrammarBuilder2 :: AddTextSubset()。