我正在尝试创建一个包含语音命令的 Windows Phone 8 应用程序。语音命令类似于“[艺术家] 的热门歌曲是什么”,因此我需要为“[艺术家]”使用某种通配符,允许用户说出任何艺术家。如果不在 PhraseList 中列出世界上所有的艺术家,我怎么能做到这一点?
3 回答
这绝对是可能的。
简短回答 这在 Windows Phone 8.1 中可以使用所谓的 PhraseTopics。
长版
首先,您需要声明ID_CAP_SPEECH_RECOGNITION
和ID_CAP_MICROPHONE
要求。
然后您创建一个 VCD(语音命令描述)文件。这个文件基本上是一个 XML 文件,它“告诉”电话要听什么。(注意,ListenFor 元素可以在一对花括号内包含一个星号字符以实现通配符功能。有关详细信息,请参阅语音命令元素和属性参考(Windows Phone Store 应用程序)。)(取自 MSDN)在您的情况下,此文件例如看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">
<CommandSet xml:lang="en-us" Name="SuperMusicFinder">
<!-- Command set for all US English commands-->
<CommandPrefix>SuperMusicFinder</CommandPrefix>
<Example>Find Top 10 from Europe</Example>
<Command Name="findCharts">
<Example>Find Europe Top 40</Example>
<ListenFor>Find [Europe Top40] {chartlist}</ListenFor>
<ListenFor>Get [US Top100] charts {chartlist}</ListenFor>
<Feedback>Looking up the charts for you-...</Feedback>
<Navigate />
<!-- Navigation defaults to Main page -->
</Command>
<Command Name="topSongs">
<Example>Show top songs by Pharrell Williams</Example>
<ListenFor>Show [number] {num} songs by [Pink]{artist} </ListenFor>
<ListenFor>Give me [number] {num} songs by [Beethoven]{artist}</ListenFor>
<ListenFor>Show [top songs] by [Pharell Williams]</ListenFor>
<Feedback>Okay, I got that. I will look up the songs you want!</Feedback>
<Navigate Target="/artistSong.xaml"/>
</Command>
<PhraseList Label="num">
<Item> 1 </Item>
<Item> 2 </Item>
<Item> 3 </Item>
</PhraseList>
<PhraseTopic label="chartlist" Scenario="Chartlisting" />
<PhraseTopic label="artist" Scenario="Artist" />
</CommandSet>
</VoiceCommands>
然后您需要在 App.xaml.cs 文件中初始化您的 VCD:
using Windows.Phone.Speech.VoiceCommands;
private async void Application_Launching(object sender,
LaunchingEventArgs e)
{
try
{
await VoiceCommandService.InstallCommandSetsFromFileAsync(
new Uri("ms-appx:///SuperMusicFinderVCD.xml"));
}
catch (Exception ex)
{
// Handle exception
}
}
要处理语音命令,只需执行以下操作:例如,如果您说:“SuperMusicFinder 显示 Pharell Williams 的热门歌曲”,此请求的查询将类似于以下内容:“/artistSong.xaml?voiceCommandName=topSongs&by=Pharell% 20Williams&reco=show%20top%20songs%Pharell%20Williams"
private void artistSong_Loaded(object sender, RoutedEventArgs e)
{
if (this.NavigationContext.QueryString != null
&& this.NavigationContext.QueryString.ContainsKey("voiceCommandName"))
{
// Page was launched by Voice Command
string commandName =
NavigationContext.QueryString["voiceCommandName"];
string spokenNumber = "";
if (commandName == "topSongs" &&
this.NavigationContext.QueryString.TryGetValue("by",
out artist))
{
//do whatever you want to do
}
}
}
}
您可以在此处找到更多信息- 注意:所有代码片段均取自该示例并进行了编辑以适合此问题,不能 100% 确定这是否有效,您可以获得适用于 8.1 上的“高级”命令或简单命令的示例代码从这里开始 8.0
不,WP8 语音命令不支持短语列表中的通配符。问题是,WP8 将无法对没有固定短语列表的音频执行本地语音识别。对于通配符短语,每次用户使用 WP8 的语音命令时,WP8 都必须在云中执行语音到文本,这不是一个好的用户体验。
目前,语音命令中可以支持的最大短语数为2,000 个短语。这是针对单个应用程序的所有命令。这个限制是为了使消歧更容易,并为消费者提供更准确的结果。总的来说,最好使用尽可能少的短语来使消歧更准确。
对于需要语音命令中的通配符短语的合理用例,有一个推荐的解决方法。第一步,有一个“*”语音命令,以正确的语法启动应用程序。打开应用程序后,通过让用户重复他们的特定命令,在应用程序中使用语音到文本(使用SpeechRecognizer),这将触发云中的语音到文本。
“{*} 的热门歌曲是什么”有效吗?至少文档为配置中的 ListenFor 元素提到了这一点。Windows Phone 8 的语音命令元素和属性参考