我正在使用 System.Speech.Recognition.Choices 类,我想有一种方法向用户展示给定语音会话剩余的可能选择(我不确定这里的正确术语)。
例如,如果选择是“热”、“铝热”和“关闭”,那么我想显示一个包含所有三个的列表。如果用户启动“th”声音,我想只显示前两个,并且随着用户的继续,其他选择就会消失。基本上,我想显示剩余的可能选择。
这可能吗?
谢谢!埃里克
我正在使用 System.Speech.Recognition.Choices 类,我想有一种方法向用户展示给定语音会话剩余的可能选择(我不确定这里的正确术语)。
例如,如果选择是“热”、“铝热”和“关闭”,那么我想显示一个包含所有三个的列表。如果用户启动“th”声音,我想只显示前两个,并且随着用户的继续,其他选择就会消失。基本上,我想显示剩余的可能选择。
这可能吗?
谢谢!埃里克
根据您的语法,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>
另一种选择是在语法中指定选项(使用 one-of 标记)并使用替代项。例如:
<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 来跟上这些事件并且仍然提供良好的(也就是不迟钝的)用户体验。