假设我想在一个选项对象total_choice中匹配这个正则表达式,这个正则表达式将是一个更好的语法的一部分:值( 3-9 \ 1-7 ),我就是这样构建它的:
Choices total_choice= new Choices();
Choices all_digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });
// value [3-9][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append( new Choices(new string[] { "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(all_digits);
total_choice.Add(gb_aux);
// value [1-7][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append(new Choices(new string[] { "1", "2", "3", "4", "5", "6", "7" }));
gb_aux.Append(all_digits); ///// <------
total_choice.Add(gb_aux);这个问题出现在带有箭头的句子中。如果我取消评论,程序就会崩溃。我以前做过同样的几行,我不明白为什么现在有问题,而不是以前。
注意:我知道这不是构建语法的最佳方法,我只是简化了问题的重点。
为了回答尼古拉的建议,让我说得更具体些。问题是,我需要识别“飞行水平”,然后是数字30,700。但是飞行员不会说“四十”,他们说“四零”,这就是为什么我把数字分开的原因。我知道Nikolay建议我建立一个更简单的语法(三个连续数字),并将范围控制在另一个层次上。我喜欢这个主意。所以我想:
// flight level [0-9][0-9][0-9]
gb_aux = new GrammarBuilder("flight level");
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
level_choices.Add(gb_aux);但是,当我附加第二组数字时,就会出现和以前一样的问题。它不会崩溃,实际上界面从来没有启动过。意识到现在我不再重复使用all_digits对象了,我每次都创建一个新的对象。
另一次尝试,当我说第二个数字(然后崩溃)时,这个方法跳转到拒绝的方法:
gb_aux = new GrammarBuilder("flight level");
Regex reg = new Regex(@"^\d\d\d?$"); //also tried "^\s?\d\s\d\s\d?\s?$"
Choices chose = new Choices();
chose.Add(reg.ToString());
gb_aux.Append(chose);发布于 2016-11-16 16:48:13
明白了!虽然我仍然不知道为什么我尝试过的一些东西不起作用。
GrammarBuilder level = new GrammarBuilder();
level.Append("flight level", 0, 1); //"flight level" is optional
Choices digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });
level.Append(digits, 2, 3); //minimum 2 digits, maximum 3 digits发布于 2016-11-15 21:36:03
您不能追加all_choices两次,您必须创建新的选择。
总之,您不应该设计非常复杂的语法。用户永远不会跟踪他们,识别器将有困难的时间。允许用户说出任意的数字序列,并使用正则表达式解析语音识别结果。如果数字序列不匹配,只需警告用户。这允许您在识别了部分字符串时也可以等待输入。
通过执行严格而复杂的语法,您就失去了识别和处理用户错误的能力。
https://stackoverflow.com/questions/40619066
复制相似问题