尝试创建一些简单的 System.Speech.Recognition 语法时崩溃

Posted

技术标签:

【中文标题】尝试创建一些简单的 System.Speech.Recognition 语法时崩溃【英文标题】:Crash trying to create some simple System.Speech.Recognition Grammar 【发布时间】:2014-07-12 11:40:52 【问题描述】:

您好,我正在尝试解析语音所说的时间:

        var ret = new GrammarBuilder();

        var hours = new Choices();
        for (int c = 1; c < 24; c++)
            hours.Add(new SemanticResultValue(c.ToString(), c));

        var minutes = new Choices();
        for (int c = 1; c < 60; c = c + 1)
            minutes.Add(new SemanticResultValue(c.ToString(), c));

        var topLevelChoices = new Choices();

        //eight fourty five = 8:45
        //four twenty = 4:20
        var methodOne = new GrammarBuilder();
        methodOne.Append(new SemanticResultKey("hour", hours));
        methodOne.Append(new SemanticResultKey("minute", minutes));
        topLevelChoices.Add(methodOne);

        //quarter to five = 4:45
        //half past ten = 10:30
        var methodTwo = new GrammarBuilder();
        methodTwo.Append(new SemanticResultKey("minute", new Choices(
            new SemanticResultValue("twenty past", 20),
            new SemanticResultValue("twenty to", -20),
            new SemanticResultValue("quarter past", 15),
            new SemanticResultValue("quarter to", -15),
            new SemanticResultValue("half past", 30)
            )));
        methodTwo.Append(new SemanticResultKey("hour", hours));
        topLevelChoices.Add(methodTwo);

        //ten o'clock
        //one o'clock
        var methodThree = new GrammarBuilder();
        methodThree.Append(new SemanticResultKey("hour", hours));
        methodThree.Append("o'clock");
        topLevelChoices.Add(methodThree);

        ret.Append(topLevelChoices);

        var g = new Grammar(ret); //crash occurs here

但是我在 mscorlib.dll 中遇到了“System.ArgumentOutOfRangeException”类型的异常(附加信息:索引超出范围。必须为非负数且小于集合的大小。)。查看上层堆栈:

mscorlib.dll!System.ThrowHelper.ThrowArgumentOutOfRangeException() + 0x4e bytes 
mscorlib.dll!System.Collections.Generic.List<System.__Canon>.this[int].set(int index, System.__Canon value) + 0x3b bytes    
System.Speech.dll!System.Speech.Internal.GrammarBuilding.BuilderElements.Optimize(System.Collections.ObjectModel.Collection<System.Speech.Internal.GrammarBuilding.RuleElement> newRules) + 0x38e bytes 
System.Speech.dll!System.Speech.Recognition.GrammarBuilder.InternalGrammarBuilder.CreateElement(System.Speech.Internal.SrgsParser.IElementFactory elementFactory, System.Speech.Internal.SrgsParser.IElement parent, System.Speech.Internal.SrgsParser.IRule rule, System.Speech.Internal.GrammarBuilding.IdentifierCollection ruleIds) + 0x83 bytes    
System.Speech.dll!System.Speech.Recognition.GrammarBuilder.CreateGrammar(System.Speech.Internal.SrgsParser.IElementFactory elementFactory) + 0x6e bytes 
System.Speech.dll!System.Speech.Recognition.GrammarBuilder.Compile(System.IO.Stream stream) + 0x7e bytes    
System.Speech.dll!System.Speech.Recognition.Grammar.LoadCfg(bool isImportedGrammar, bool stgInit) + 0x174 bytes 
System.Speech.dll!System.Speech.Recognition.Grammar.LoadAndCompileCfgData(bool isImportedGrammar, bool stgInit) + 0x32 bytes    
> SapiGrammarCrash.exe!SapiGrammarCrash.Form1.Form1_Load(object sender, System.EventArgs e) Line 71 + 0x29 bytes    C#

我已经尝试过 .NET 3.0 和 4.5 - 结果相同。还尝试了 2 台机器 - 都是 x64。

有什么想法吗?

【问题讨论】:

我怀疑您正在多重绑定语义结果键/值对。试着简化你的语法(注释掉各个小节)直到它运行,看看它告诉你什么。 感谢您的回复;实际上,它在没有 methodOne+methodTwo 或没有 methodThree 的情况下运行。但我需要全部 3 个 :) 还尝试了 minOccur=1 和 maxOccur=1。 Aslo 尝试为每种方法的 SemanticKeys 添加一个唯一的后缀。还有其他提示吗? 如果您不在 methodThree 中重用“小时”对象,而是创建一组新的 SemanticResultValues,会发生什么情况?导致问题的不是 keys,而是 values。 The docs 明确表示“使用 SemanticResultValue 设置 Value 后,无论是使用默认根键还是任何特定的 SemanticResultKey 标记,都不能修改该值,否则在识别操作过程中会出现异常。”跨度> 就是这样!我正在重用同一个实例。一旦我创建了一系列小时,问题就消失了。谢谢!请复制并粘贴到答案中,我会勾选它。 【参考方案1】:

我很确定您正在重新绑定 SemanticResultValues。 The docs具体说一下

使用 SemanticResultValue 设置 Value 后,无论是 用默认的根密钥或任何特定的 SemanticResultKey,该值不得修改或异常 将在识别操作期间发生。

解决方法是为您的 methodThree 创建一组单独的 SemanticResultValues。

【讨论】:

以上是关于尝试创建一些简单的 System.Speech.Recognition 语法时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

尝试创建一个简单的表单,如果未填写任何内容将显示错误

我正在尝试使用 react-native 进行简单的路由,但我遇到了一些错误,例如 Failed building Javascript bundle

如何创建简单的 DataGridComboboxColumn?

尝试使用动态内存分配创建节点指针数组

在SAS DS2中,如何创建一个简单的程序来计算bmi

无法从 Matlab Coder 创建 .dll