我正在使用Microsoft.Speech.Recognition
并且需要使用相当大的语法来执行识别任务。所以我创建并稍后将语法修改为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引擎已经超时”。
如果我捕获异常并尝试再次将相同的语法加载到同一引擎中,有时它会成功加载(尽管非常慢),有时它会再次出现相同的错误。
造成这种情况的原因是什么?为什么它有时会超时,有时使用相同的语法/引擎?
我能做些什么来加快语法加载速度吗?
任何想法都会非常感激。
答案 0 :(得分:4)
造成这种情况的原因是什么?
语法太大了。
为什么有时会超时,有时使用相同的语法/引擎?
有时它更小。
我能做些什么才能让语法加载更快,期间?
我假设您使用Grammar Tools
编译gramar您可以使用较小的语法。实际上你不应该使用非常大的语法,它会降低识别准确性,因为手工构造的语法通常无法捕获所有语言依赖性。
如果您的语言包含许多选项或复杂句子,最好通过使语法更灵活来简化语法。您可以拆分块并将它们作为单独的选项呈现,而不是组织选择树。例如,如果您考虑语法
<result> = <day> <month> <year> <digit> |
<year> <month> <digit> |
<digit> <year> <month>
尝试捕获不同的订单,最好提供更多的灵活性
<result> = ( <day> | <month> | <year> | <digit> )*
但简化了依赖关系。
一个很好的选择是ARPA格式的统计语言模型。一旦收集了示例提示,您就可以创建一个ARPA模型,它将为您提供比手工构造语法更好的结果。
答案 1 :(得分:1)
其他几种可能性:
Grammar
对象中。 (当你有静态子树时特别方便)。不幸的是,我不相信Microsoft.Speech.Recognition支持SrgsSubset项目,这对于构建动态语法非常方便。
为了扩大@NikolayShmyrev的答案 - 通常更好的是简化语法并相信用户不要说可接受但不太可能的尴尬短语。无论如何,你总是可以在解释短语中拒绝这些短语。