使用VB.NET编写的Winforms应用程序。我使用SpeechRecognitionEngine
中的System.Speech.Recognition
。
我正在寻找构建Grammar
的最佳方式。我生成语法的方法传递一个数字,表示有效对象的数量,因此是有效的数字范围。
可能的命令:
我已完成的工作是创建了四个不同的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
答案 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);