将选项附加到 GrammarBuilder 对象的奇怪行为
Append Choices to GrammarBuilder object strange behaviour
假设我想将此正则表达式放入 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);
问题出现在带箭头的句子中。如果我取消注释,程序就会崩溃。我之前只做了几行,我不明白为什么现在有问题而不是以前有问题。
注意:我知道这不是构建语法的最佳方式,我只是简化了问题的重点。
为了回答 Nikolay 的建议,让我更具体一些。问题是我需要识别 "flight level" 后跟数字 [30, 700]。但是飞行员不说 "fourty",他们说 "four zero",这就是为什么我这样分开数字的原因。我知道 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);
您不能追加 all_choices
两次,您必须创建新的选择。
总的来说,你不应该设计非常复杂的语法。用户永远不会关注他们,识别者将很难过。允许用户说出任意数字序列,并用正则表达式解析语音识别结果。如果数字序列不匹配,请警告用户。如果部分字符串被识别,这也允许您等待输入。
通过执行严格而复杂的语法,您将失去识别和处理用户错误的能力。
知道了!虽然我仍然不确定为什么我尝试的一些东西不起作用。
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
假设我想将此正则表达式放入 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);
问题出现在带箭头的句子中。如果我取消注释,程序就会崩溃。我之前只做了几行,我不明白为什么现在有问题而不是以前有问题。
注意:我知道这不是构建语法的最佳方式,我只是简化了问题的重点。
为了回答 Nikolay 的建议,让我更具体一些。问题是我需要识别 "flight level" 后跟数字 [30, 700]。但是飞行员不说 "fourty",他们说 "four zero",这就是为什么我这样分开数字的原因。我知道 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);
您不能追加 all_choices
两次,您必须创建新的选择。
总的来说,你不应该设计非常复杂的语法。用户永远不会关注他们,识别者将很难过。允许用户说出任意数字序列,并用正则表达式解析语音识别结果。如果数字序列不匹配,请警告用户。如果部分字符串被识别,这也允许您等待输入。
通过执行严格而复杂的语法,您将失去识别和处理用户错误的能力。
知道了!虽然我仍然不确定为什么我尝试的一些东西不起作用。
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