1

我正在使用Microsoft.Speech.Recognition并且需要使用相当大的语法来完成识别任务。因此,我创建并稍后将语法修改为 a SrgsDocument,然后Grammar从中构造一个对象。此时,我将语法加载到引擎中,以准备使用该SpeechRecognitionEngine.LoadGrammar方法进行识别。

换句话说,我有类似的东西:

SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
SrgsDocument gramDoc = new SrgsDocument();
//...modify the SrgsDocument (add rules, etc.)
Grammar gram = new Grammar(gramDoc);
sre.LoadGrammar(gram);

在这一点上,加载语法,几分钟后我有时(并非总是,并且不是真正作为语法大小的函数)收到错误“任务无法完成,因为 SR 引擎已超时。”

如果我捕捉到异常并尝试再次将相同的语法加载到同一个引擎中,有时它会成功加载(尽管非常缓慢),有时它会再次给出相同的错误。

这是什么原因造成的?为什么有时会超时,有时会使用相同的语法/引擎?

我能做些什么来加快语法加载速度吗?

任何想法都会非常感激。

4

2 回答 2

4

这是什么原因造成的?

语法太大。

为什么有时会超时,有时会使用相同的语法/引擎?

有时它更小。

我能做些什么来加快语法加载速度吗?

我想你用语法工具编译语法

您可以使用较小的语法。您实际上不应该使用非常大的语法,它会降低识别准确性,因为手工构建的语法通常无法捕获所有语言依赖性。

如果您的语言包含许多选择或复杂的句子,最好通过使其更灵活来简化语法。您可以拆分块并将它们作为单独的选择呈现,而不是组织选择树。例如,如果您考虑语法

<result> = <day> <month> <year> <digit> |
            <year> <month> <digit> |
            <digit> <year> <month> 

试图捕获不同的订单,最好给更多的灵活性

<result> = ( <day> | <month> | <year> | <digit> )*

但简化依赖关系。

一个不错的选择是 ARPA 格式的统计语言模型。一旦你收集了样本提示,你就可以创建一个 ARPA 模型,它会给你比手工构建的语法更好的结果。

于 2013-10-17T12:53:51.593 回答
1

其他几种可能性:

  1. 将语法拆分为多个独立的部分并将每个部分加载到自己的Grammar对象中。(当你有静态子树时特别方便)。
  2. 使用规则和规则引用合并子树。

不幸的是,我不相信 Microsoft.Speech.Recognition 支持 SrgsSubset 项,这对于构建动态语法非常方便。

为了放大@NikolayShmyrev 的答案-通常最好简化语法并相信用户不要说出可以接受但不太可能的尴尬短语。无论如何,您总是可以在解释短语期间拒绝这些短语。

于 2013-10-18T22:38:43.763 回答