动态修改 Cortana VCD 短语列表
警告
自 Windows 10 2020 年 5 月更新(版本 2004,codename“20H1”)起,不再支持此功能。
在运行时使用语音识别结果,在语音命令定义 (VCD) 文件中访问和更新支持的短语列表(PhraseList 元素)。
注意
语音命令是在语音命令定义 (VCD) 文件中定义且具有特定意图的单个言语,通过 Cortana 指向一个已安装的应用。
VCD 文件定义了一个或多个语音命令,每个命令都有一个独特的意图。
语音命令定义在复杂性方面可能各不相同。 这些定义可以支持任何内容,从单一的受约束的言语到更灵活的自然语言言语的集合,所有这些都表示相同的意图。
如果语音命令特定于某个涉及某种用户定义应用数据或暂时性应用数据的任务,则在运行时动态修改短语列表非常有用。
例如,假设你有一个旅行应用,用户可以在该应用中输入目的地,而你希望用户能够通过说出应用名称后跟“显示到 <destination> 的行程”来启动该应用。 在 ListenFor 元素本身中,可以指定类似 <ListenFor> Show trip to {destination} </ListenFor>
的内容,其中“destination”是 PhraseList 的 Label 属性的值。
通过在运行时更新短语列表,无需为每个可能的目的地创建单独的 ListenFor 元素。 相反,你可以在用户输入其行程时,使用用户指定的目的地动态填充 PhraseList。
有关 PhraseList 和其他 VCD 元素的详细信息,请参阅 VCD 元素和属性 v1.2 参考。
提示
必备条件
如果你还不熟悉通用 Windows 平台 (UWP) 应用开发,请查看这些主题来熟悉此处讨论的技术。
用户体验指南
有关如何将你的应用与 Cortana 和语音交互集成的信息,请参阅 Cortana 设计指南,了解有关设计有用且具有吸引力的支持语音的应用的有用提示。
标识命令并更新短语列表
下面是定义命令“showTripToDestination”的示例 VCD 文件,以及一个在 Adventure Works 旅行应用中为目的地定义三个选项的 PhraseList。 用户保存和删除应用中的目的地时,应用会更新 PhraseList 中的选项。
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.1">
<CommandSet xml:lang="en-us" Name="AdventureWorksCommandSet_en-us">
<AppName> Adventure Works, </AppName>
<Example> Show trip to London </Example>
<Command Name="showTripToDestination">
<Example> show trip to London </Example>
<ListenFor> show trip to {destination} </ListenFor>
<Feedback> Showing trip to {destination} </Feedback>
<Navigate/>
</Command>
<PhraseList Label="destination">
<Item> London </Item>
<Item> Dallas </Item>
<Item> New York </Item>
</PhraseList>
</CommandSet>
<!-- Other CommandSets for other languages -->
</VoiceCommands>
若要更新 VCD 文件中的 PhraseList 元素,请获取包含短语列表的 CommandSet 元素。 使用该 CommandSet 元素的 Name 属性(Name 必须在 VCD 文件中独一无二)作为键来访问 VoiceCommandManager.InstalledCommandSets 属性并获取 VoiceCommandSet 引用。
确定命令集后,获取对要修改的短语列表的引用,并调用 SetPhraseListAsync 方法;使用 PhraseList 元素的 Label 属性和字符串数组作为短语列表的新内容。
注意
如果你修改某个短语列表,则系统会替换整个短语列表。 如果要将新项插入到短语列表中,则必须在调用 SetPhraseListAsync 时同时指定现有项和新项。
在此示例中,我们用一个额外的目的地“Phoenix”更新了上一示例中显示的 PhraseList。
Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinition.VoiceCommandSet commandSetEnUs;
if (Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.
InstalledCommandSets.TryGetValue(
"AdventureWorksCommandSet_en-us", out commandSetEnUs))
{
await commandSetEnUs.SetPhraseListAsync(
"destination", new string[] {"London", "Dallas", "New York", "Phoenix"});
}
注解
对于相对较小的一组单词,可以使用 PhraseList 来约束识别。 当单词集太大(例如,数百个单词)或根本不应约束时,请使用 PhraseTopic 元素和 Subject 元素来优化语音识别结果的相关性以提高可伸缩性。
在示例中,我们有一个 Scenario 为“Search”的 PhraseTopic,该 Scenario 通过 Subject“City\State”进一步进行了优化。
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.1">
<CommandSet xml:lang="en-us" Name="AdventureWorksCommandSet_en-us">
<AppName> Adventure Works, </AppName>
<Example> Show trip to London </Example>
<Command Name="showTripToDestination">
<Example> show trip to London </Example>
<ListenFor> show trip to {destination} </ListenFor>
<Feedback> Showing trip to {destination} </Feedback>
<Navigate/>
</Command>
<PhraseList Label="destination">
<Item> London </Item>
<Item> Dallas </Item>
<Item> New York </Item>
</PhraseList>
<PhraseTopic Label="destination" Scenario="Search">
<Subject>City/State</Subject>
</PhraseTopic>
</CommandSet>