我正在使用System.Speech.Recognition.Choices类,我希望有一种方法向用户呈现给定语音会话剩余的可能选择(我不确定这里是否正确的术语) 。
例如,如果选择是“热”,“热”和“关”,那么我想显示所有三个列表。如果用户启动“th”声音,我想只显示前两个声音,并且当用户继续时,其他选择会下降。基本上,我想显示剩余的可能选择。
这可能吗?
谢谢! 埃里克
答案 0 :(得分:2)
根据您的语法,System.Speech.Recognition.RecognitionResult应具有Alternate属性,该属性显示有序识别列表,这些识别是最有信心的识别替代方案。许多支持语音的应用程序使用它来消除可能的错误识别歧义。
// Handle the SpeechRecognized event.
void SpeechRecognizedHandler(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result == null) return;
// Display the recognition alternates for the result.
foreach (RecognizedPhrase phrase in e.Result.Alternates)
{
Console.WriteLine(" alt({0}) {1}", phrase.Confidence, phrase.Text);
}
}
另一种可能的解决方案(在某些情况下运行良好)是使用语法中的垃圾规则充当外卡(这不适用于上面的示例)。由于通配符(又名GARBAGE规则),以下内容会识别出“请打开我的消息”之类的内容。
<rule id="WildcardExample" scope="private">
<item>open</item>
<ruleref special="GARBAGE"/>
<item>message</item>
<ruleref special="GARBAGE"/>
</rule>
另一种选择是在语法中指定选择(使用一个标签)并使用替代选项。例如:
<rule id="ListExample" scope="private">
<item>I'd like a</item>
<one-of>
<item>chocolate</item>
<item>coco</item>
<item>vanilla</item>
</one-of>
<item>please</item>
</rule>
如果用户说“我喜欢巧克力请”,您可以使用替代品的置信度值来检查并查看是否需要显示一个询问“你想要巧克力或可可吗?”的对话框。
// Handle the SpeechRecognized event.
void SpeechRecognizedHandler(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result == null) return;
// Display the recognition alternates for the result.
foreach (RecognizedPhrase phrase in e.Result.Alternates)
{
if (.2 > Math.Abs(e.Result.Confidence-phrase.Confidence && phrase.Text.Equals("coco"))
{
//Set chocolate or coco grammar/rule
Console.WriteLine(" Did you mean chocolate or coco?");
break;
}
}
}
您的最终选项(尽管没有详细记录)是使用Hypothesis events。语音引擎在生成识别结果的过程中基本上调用此回调。这适合你上面的TH例子。然而,在实践中,很难设计一个能够跟上这些事件并仍能提供良好(又非缓慢)用户体验的UI。