【问题标题】:How to add words to an already loaded grammar using System.Speech and SAPI 5.3如何使用 System.Speech 和 SAPI 5.3 将单词添加到已加载的语法中
【发布时间】:2010-05-28 09:57:47
【问题描述】:

给定以下代码,

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)

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

【问题讨论】:

    标签: c# .net speech-recognition sapi


    【解决方案1】:

    听起来您需要通过语法规则引用使用一些间接性。这可以通过 GrammarBuilder.AppendRuleReference 方法来完成。先用一些 SRGS 语法文件测试你的语法可能更容易。

    原则是您将一个包含一些引用的主要大型语法加载到您将动态加载的较小的用户特定单词列表语法。

    请参阅http://www.w3.org/TR/speech-grammar/#S2.2 了解 srgs 格式,http://msdn.microsoft.com/en-us/library/system.speech.recognition.grammarbuilder.appendrulereference.aspx 了解程序版本。

    【讨论】:

    • 我不确定我是否遵循。假设我添加了对外部语法的引用,如 AppendRuleReference 中所述。在这个引用的语法被加载之后,它的内容就改变了。我现在如何更新语音引擎以使用修改后的语法? (当然不用重新加载)
    • 确实需要重新加载referenced语法,而不是主语法。这应该是一个小得多的加载/卸载操作。如果每个用户的差异很大,那么另一种选择是将它们全部加载,然后即时启用/禁用它们。
    • 我会试着举个例子。打开单词并开始输入。您添加/删除/更改的每个短语都应该添加/删除/更改(=删除然后添加)到语法中。我需要支持大文件。 (我将大定义为使重新加载明显)
    • 康纳,也许我可以试试这样的东西。使用对 n 个空语法的引用创建一个主语法。 (其中 n 是一个足够大的数字)假设 5000 个短语使引用语法的重新加载变得明显。然后,我可以针对每 5000 个短语转到下一个参考。
    • 如果这是一个选项,也许你甚至不需要参考。您可以只使用第一个语法直到它变得太大,然后加载第二个语法,并使用它直到它达到限制,等等
    【解决方案2】:

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

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

    【讨论】:

    • 听写语法不起作用,因为我需要更多上下文。我在之前的评论中给出的关于在 word 中输入短语的示例过于简单。语法相当复杂。无论如何,感谢您的输入。
    【解决方案3】:

    在原生 SAPI 中,我会使用 ISpGrammarBuilder2::AddTextSubset()。

    【讨论】:

    • 谢谢。我会看看我是否可以访问 AddTextSubset()。也许通过反思。
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多