追加选择GrammarBuilder对象的奇怪行为

时间:2016-11-15 20:26:04

标签: speech-recognition

假设我想在Choice对象 total_choice 中使用这个正则表达式,它将成为更大语法的一部分: value([3-9] [0-9] | [ 1-7] [0-9]) 这就是我构建它的方式:

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]。但是飞行员并没有说“四十”,他们说“四零”,这就是为什么我把这样的数字分开。据我所知,尼古拉建议我建立一个更简单的语法(三个连续的数字)并控制另一个级别的范围。我喜欢这个主意。所以我这样做:

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

2 个答案:

答案 0 :(得分:1)

你不能追加all_choices两次,你必须创建新的选择。

总的来说,你永远不应该设计非常复杂的语法。用户永远不会关注它们,识别器将很难。允许用户说出任意数字序列,并用正则表达式解析语音识别结果。如果数字序列不匹配,则仅警告用户。如果识别出部分字符串,则允许您等待输入。

通过强制执行严格而复杂的语法,您无法识别和处理用户错误。

答案 1 :(得分:1)

知道了!虽然我仍然不确定为什么我试过的一些东西不起作用。

   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