Vb.net 如何让多个SrgsRules在SrgsGrammar中工作?

Vb.net 如何让多个SrgsRules在SrgsGrammar中工作?,vb.net,speech-recognition,Vb.net,Speech Recognition,我正在学习VisualBasic,我正在修补语音识别。我正试图让一个有多种规则的语法起作用,但没有成功。我创建了一个包含3个规则的语法,[搜索、颜色和根],根规则只包含其他2个规则的SrgsRuleRefs Private Sub setColors() reco.UnloadAllGrammars() Dim gram As New Recognition.SrgsGrammar.SrgsDocument Dim searchRule

我正在学习VisualBasic,我正在修补语音识别。我正试图让一个有多种规则的语法起作用,但没有成功。我创建了一个包含3个规则的语法,[搜索、颜色和根],根规则只包含其他2个规则的
SrgsRuleRef
s

    Private Sub setColors()
        reco.UnloadAllGrammars()

        Dim gram As New Recognition.SrgsGrammar.SrgsDocument

        Dim searchRule As New Recognition.SrgsGrammar.SrgsRule("Search")
        Dim searchRef As New Recognition.SrgsGrammar.SrgsRuleRef(searchRule)
        searchRule.Add(New Recognition.SrgsGrammar.SrgsOneOf("search", "serch"))
        searchRule.Add(Recognition.SrgsGrammar.SrgsRuleRef.Dictation)
        searchRule.Scope = Recognition.SrgsGrammar.SrgsRuleScope.Public

        Dim colorRule As New Recognition.SrgsGrammar.SrgsRule("color")
        Dim colorRef As New Recognition.SrgsGrammar.SrgsRuleRef(colorRule)
        Dim colorList As New Recognition.SrgsGrammar.SrgsOneOf("red", "green", "blue")
        colorRule.Add(colorList)
        colorRule.Scope = Recognition.SrgsGrammar.SrgsRuleScope.Public

        Dim rootRule As New Recognition.SrgsGrammar.SrgsRule("root")
        rootRule.Scope = Recognition.SrgsGrammar.SrgsRuleScope.Public
        rootRule.Add(searchRef)
        rootRule.Add(colorRef)

        gram.Rules.Add(rootRule)
        gram.Rules.Add(colorRule)
        gram.Rules.Add(searchRule)

        gram.Root = rootRule

        reco.LoadGrammar(New Recognition.Grammar(gram))
    End Sub
如果我将“searchRule”或“colorRule”设置为语法的根,那么无论设置哪一个都会起作用——因此我知道这些规则是独立工作的——它们只是在“rootRule”中没有响应

有什么想法吗?

我终于想出了答案: 将规则添加到另一个规则时,使用rule
.Add
不起作用,但是rule
.Elements.Add
起作用

另外,仅仅添加一个规则引用是不完整的(至少在我的例子中是这样)。我必须先将引用转换为一个项目,然后再添加它

最后,我将两个规则/项添加到
SrgsOneOf
中,然后将其中一个添加到规则中

下面是问题中的代码应该如何正常工作:

    ...

    Dim rootRule As New Recognition.SrgsGrammar.SrgsRule("root")
    rootRule.Scope = Recognition.SrgsGrammar.SrgsRuleScope.Public

    Dim colorItem As New Recognition.SrgsGrammar.SrgsItem(colorRef) ' <--- '
    Dim searchItem As New Recognition.SrgsGrammar.SrgsItem(searchRef) ' <--- '

    Dim opts As New Recognition.SrgsGrammar.SrgsOneOf(colorItem, searchItem) ' <--- '

    rootRule.Elements.Add(opts) ' <--- '

    gram.Rules.Add(rootRule)
    gram.Rules.Add(colorRule)
    gram.Rules.Add(searchRule)

    gram.Root = rootRule

    ...
。。。
Dim rootRule作为新的Recognition.SrgsGrammar.SrgsRule(“根”)
rootRule.Scope=Recognition.SrgsGrammar.SrgsRuleScope.Public
将colorItem调暗为新识别。SrgsGrammar.SrgsItem(colorRef)'