4

给定以下代码,

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)

对于大型语法,这变得太昂贵了。

4

3 回答 3

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用于编程版本。

于 2009-03-16T16:53:55.720 回答
1

在本机 SAPI 中,我会使用 ISpGrammarBuilder2::AddTextSubset()。

于 2009-09-17T22:29:27.493 回答
1

如果您有非常大的语法,另一种选择是使用听写语法选项。有一个标准的听写语法,但您也可以指定自己的。请参阅http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspx,它是构造函数。

你不会更新这个。它包含所有可能的单词。

于 2009-03-16T23:51:26.793 回答