首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个Speech.Recognition.Grammar合并为1

将多个Speech.Recognition.Grammar合并为1
EN

Stack Overflow用户
提问于 2014-03-20 18:57:06
回答 1查看 783关注 0票数 0

用VB.NET编写的Winforms应用程序,我使用的是来自System.Speech.RecognitionSpeechRecognitionEngine

我正在寻找构建Grammar的最佳方法。生成语法的方法传递一个数字,表示有效对象的计数,因此是一个有效的数字范围。

可能的命令:

  • 底部
  • 顶部
  • 优先
  • 页面向上并向下
  • 打开保存打印#(号码在我的有效范围内)。

我所做的是创建四个不同的Grammar对象并将它们加载到我的SpeechRecognitionEngine中。由于当前使用RecognitionResult的代码的工作方式,我的两个Grammar被命名为“页面”,其中两个命名为“数字”。我可以改变这些,它们就是这样进化的。实际上,我不确定是否将两个名称相同的语法加载到一个引擎中,而且很明显,它是工作的。

我的作品。然而,我希望看看是否有更好的方法。我试着看看能否将ChoicesChoices结合起来,形成一种复合选择,但我似乎无法在我的头脑中做出正面或反面的选择,因此它并没有真正取得任何进展。

那么,我该如何改进这一点呢?我知道我可以将语法3和语法4结合在一起,但我还不想改变任何东西,因为我在解析RecognitionResult时试图保留语法名。我真的很想将我的所有选项组合成一个具有相同名称的单一语法,并在可能的情况下修改我的其他代码。

代码语言:javascript
复制
Private Sub LoadGrammars(count As Integer)

    '// Open, Print and Save each must be followed by a number in the range of 1 to count
    Dim gb As New GrammarBuilder()
    gb.Append(New Choices("Open", "Print", "Save"))

    Dim numChoices As New Choices '// create Choices with each number in the range
    Dim y() As String = Enumerable.Range(1, count).Select(Function(t) t.ToString()).ToArray()
    numChoices.Add(y)

    gb.Append(numChoices)
    Dim g As New Grammar(gb)
    g.Name = "Numbers"

    '// Page must be followed by Up or Down
    Dim gb2 As New GrammarBuilder()
    gb2.Append("Page")
    gb2.Append(New Choices("Up", "Down"))
    Dim g2 As New Grammar(gb2)
    g2.Name = "Pages"

    Dim gb3 As New GrammarBuilder()
    gb3.Append("Prior")
    Dim g3 As New Grammar(gb3)
    g3.Name = "Numbers"

    Dim gb4 As New GrammarBuilder()
    gb4.Append(New Choices("Bottom", "Top"))
    Dim g4 As New Grammar(gb4)
    g4.Name = "Pages"

    _engine.LoadGrammar(g)
    _engine.LoadGrammar(g2)
    _engine.LoadGrammar(g3)
    _engine.LoadGrammar(g4)

End Sub
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-21 17:17:39

您可以通过遍历中间的Choices对象来嵌套GrammarBuilder对象。

Choices对象具有一个接受GrammarBuilders数组的构造函数,而GramarBuilder对象有一个接受Choices对象的构造函数。您可能希望使用SemanticResultKeys和SemanticValues,这样您就可以知道实际说了什么(我不想说明)。

我不是VB.net专家,所以语法可能不在这里;但是看起来如下所示:

代码语言:javascript
复制
Dim numChoices As New Choices '// create Choices with each number in the range
Dim y() As String = Enumerable.Range(1, count).Select(Function(t) t.ToString()).ToArray()
numChoices.Add(y)

gb.Append(numChoices)
Dim g As New Grammar(gb)
g.Name = "Numbers"

'// Page must be followed by Up or Down
Dim gb2 As New GrammarBuilder()
gb2.Append("Page")
gb2.Append(New Choices("Up", "Down"))

Dim gb3 As New GrammarBuilder()
gb3.Append("Prior")

Dim gb4 As New GrammarBuilder()
gb4.Append(New Choices("Bottom", "Top"))

Dim gbArray() as GrammarBuilder(4) = {gb1, gb2, gb3, gb4};
Dim g as new Grammar(new GrammarBuilder(new Choices(gbArray)));
g.Name = "All"

_engine.LoadGrammar(g);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22542578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档