【问题标题】:Merging multiple Speech.Recognition.Grammar into 1将多个 Speech.Recognition.Grammar 合并为 1
【发布时间】:2014-03-22 01:18:27
【问题描述】:

用 VB.NET 编写的 Winforms 应用程序。我正在使用来自System.Speech.RecognitionSpeechRecognitionEngine

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

可能的命令:

  • 底部
  • 顶部
  • 之前
  • 页面[上|下]
  • [打开|保存|打印] #(其中数字在我的有效范围内)。

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

我有什么作品。不过我希望看看是否有更好的方法。我试图看看我是否可以将ChoicesChoices 结合起来做出一种复合选择,但我似乎无法在脑海中做出正面或反面,所以并没有真正得到任何结果.

那么,我该如何改进呢?我知道我可以将语法 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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2017-05-04
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多