使用VB.NET编写的Winforms应用程序。我使用System.Speech.Recognition
中的SpeechRecognitionEngine
我正在寻找最好的方法来构建Grammar
。生成语法的方法传递了一个数字,表示有效对象的计数,从而表示有效的数字范围。
可能的命令:
- 顶部 前
- 页面(上|下)
- [打开|保存|打印]#(其中数字在我的有效范围内)。
我所做的是创建四个不同的Grammar
对象并将它们加载到SpeechRecognitionEngine
中。由于当前使用RecognitionResult
的代码的工作方式,我的两个Grammar
被命名为"Pages",其中两个被命名为"Numbers"。我可以改变它们,它们就是这样进化的。实际上,我不确定是否将两个同名的语法加载到引擎中会工作,显然它可以。
What I have works然而,我希望看看是否有一个更好的方法。我试着看看我是否能把Choices
和Choices
结合起来,做出一种复合选择,但我似乎无法在脑海中做出正面或负面的选择,所以没有真正取得任何进展。
那么,我该如何改进呢?我知道我可以将语法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
可以通过中间的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);