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

时间:2014-03-20 18:57:07

标签: vb.net .net-4.5 speech-recognition grammar sapi

使用VB.NET编写的Winforms应用程序。我使用SpeechRecognitionEngine中的System.Speech.Recognition

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

可能的命令:

  • 之前
  • Page [Up | Down]
  • [打开|保存|打印]#(其中数字在我的有效范围内)。

我已完成的工作是创建了四个不同的Grammar个对象,并将它们加载到我的SpeechRecognitionEngine中。由于消费RecognitionResult的代码当前有效,我的两个Grammar被命名为" Pages"其中两个"数字"。我可以改变这些,他们只是通过这种方式进化。我实际上不确定是否将两个具有相同名称的语法加载到引擎中会起作用,显然它确实有效。

我的作品。但是我希望看看是否有更好的方法。我试着看看我是否可以在Choices内组合Choices来制作一种复合选择,但我似乎无法在头脑中做出头也没有,所以没有&# 39;真的无处可去。

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

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

1 个答案:

答案 0 :(得分:1)

您可以通过浏览中间Choices对象来嵌套GrammarBuilder个对象。

Choices对象有一个构造函数,它接受GrammarBuilders数组,而GramarBuilder对象有一个带Choices对象的构造函数。您可能希望使用SemanticResultKeys和SemanticValues,以便您可以弄清楚实际上说的是什么(我不会说明)。

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

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);