.net 加载语法时语音识别引擎超时(Microsoft.Speech)

.net 加载语法时语音识别引擎超时(Microsoft.Speech),.net,speech-recognition,speech,microsoft-speech-platform,.net,Speech Recognition,Speech,Microsoft Speech Platform,我正在与Microsoft.Speech.Recognition一起工作,需要使用相当大的语法来完成识别任务。因此,我创建了一个语法,并在以后将其修改为SrgsDocument,然后从中构造一个grammar对象。此时,我将语法加载到引擎中,以使用SpeechRecognitionEngine.LoadGrammar方法准备识别 换句话说,我有一些类似的东西: SpeechRecognitionEngine sre = new SpeechRecognitionEngine(); SrgsDoc

我正在与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引擎超时。”

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

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

我能做些什么来加快语法加载速度吗,句号

任何想法都将不胜感激

这是什么原因造成的

语法太大了

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

有时它更小

我能做些什么来加快语法加载速度吗,句号

我猜你是用

你可以使用较小的语法。实际上,您不应该使用非常大的语法,这会降低识别精度,因为手工构造的语法通常无法捕获所有语言依赖项

如果你的语言包含很多选择或复杂的句子,最好通过使其更灵活来简化语法。不必组织选择树,您可以分割块并将它们作为单独的选择呈现。例如,如果你认为语法类似

<result> = <day> <month> <year> <digit> |
            <year> <month> <digit> |
            <digit> <year> <month> 
=|
|
尝试捕获不同的订单时,最好提供更多的灵活性

<result> = ( <day> | <month> | <year> | <digit> )*
=(| | |)*
但要简化依赖关系

一个好的替代方案是ARPA格式的统计语言模型。一旦您收集了示例提示,您就可以创建一个ARPA模型,它将为您提供比手工构造语法更好的结果

这是什么原因造成的

语法太大了

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

有时它更小

我能做些什么来加快语法加载速度吗,句号

我猜你是用

你可以使用较小的语法。实际上,您不应该使用非常大的语法,这会降低识别精度,因为手工构造的语法通常无法捕获所有语言依赖项

如果你的语言包含很多选择或复杂的句子,最好通过使其更灵活来简化语法。不必组织选择树,您可以分割块并将它们作为单独的选择呈现。例如,如果你认为语法类似

<result> = <day> <month> <year> <digit> |
            <year> <month> <digit> |
            <digit> <year> <month> 
=|
|
尝试捕获不同的订单时,最好提供更多的灵活性

<result> = ( <day> | <month> | <year> | <digit> )*
=(| | |)*
但要简化依赖关系


一个好的替代方案是ARPA格式的统计语言模型。一旦你收集了示例提示,你就可以创建一个ARPA模型,它会给你比手工构造语法更好的结果。

还有一些其他的可能性:

  • 将语法拆分为多个独立部分,并将每个部分加载到自己的
    grammar
    对象中。(在使用静态子树时尤其方便)
  • 使用规则和规则引用合并子树
  • 不幸的是,我不相信Microsoft.Speech.Recognition支持SrgsSubset项,这对于构建动态语法非常方便


    为了进一步说明@NikolayShmyrev的答案——通常最好简化语法,并相信用户不要说可以接受但不太可能的尴尬短语。无论如何,在解释短语的过程中,您始终可以拒绝这些短语。

    其他几种可能性:

  • 将语法拆分为多个独立部分,并将每个部分加载到自己的
    grammar
    对象中。(在使用静态子树时尤其方便)
  • 使用规则和规则引用合并子树
  • 不幸的是,我不相信Microsoft.Speech.Recognition支持SrgsSubset项,这对于构建动态语法非常方便


    为了进一步说明@NikolayShmyrev的答案——通常最好简化语法,并相信用户不要说可以接受但不太可能的尴尬短语。无论如何,在口译过程中,您都可以拒绝这些短语。

    谢谢您的回复和建议。实际上,我并没有像您所建议的那样使用语法工具进行编译,因此我将对此进行研究,但语法需要在程序中修改多次,因此我必须编译语法的每个新版本(这是否仍然比Grammar()/LoadGrammar()编译它的速度更快?)。我不太明白你说的“有时它更小”是什么意思。。。正如我所说,语法是完全一样的。你能详细解释一下吗?你没有说语法是一样的,你说“不总是,也不是语法大小的函数”,这意味着你尝试了不同的语法。在不同的迭代中,我使用了不同的语法,并观察到有时稍大的语法会成功加载,而稍小的语法会使引擎超时。然而,正如我所说:“如果我捕捉到异常并尝试再次将相同的语法加载到同一个引擎中,有时它会成功加载(尽管速度非常慢),有时它会再次出现相同的错误。”@NikolayShmyrev你能为Micros构建ARPA模型吗