我正在尝试创建一个包含语音命令的Windows Phone 8应用程序。语音命令类似于“[艺术家]的顶级歌曲”,所以我需要使用某种通配符“[artist]”,这将允许用户说出任何艺术家。如果没有在PhraseList中列出世界上的每位艺术家,我怎么能这样做呢?
答案 0 :(得分:3)
这绝对是可能的。
简短回答 这可以在Windows Phone 8.1中使用所谓的PhraseTopics。
LONG VERSION
首先,您需要声明ID_CAP_SPEECH_RECOGNITION
和ID_CAP_MICROPHONE
要求。
然后创建VCD(语音命令描述)文件。这个文件基本上是一个XML文件,"告诉"电话听什么。 (注意:ListenFor元素可以在一对花括号内包含星号字符以实现通配符功能。有关详细信息,请参阅语音命令元素和属性引用(Windows Phone应用商店应用)。)(摘自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
}
}
要处理语音命令,只需执行以下操作: 如果你说例如:&#34; SuperMusicFinder播放Pharell Williams的热门歌曲&#34;对此请求的查询看起来类似于以下内容: &#34; /artistSong.xaml voiceCommandName = topSongs&安培;通过= Pharell%20Williams&安培; RECO =节目%20top%20songs%Pharell%20Williams&#34;
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
}
}
}
}
您可以找到更多信息here - 注意:所有代码段都是从该示例中获取并编辑以适应此问题,而不是100%确定如果这样做,您可以获得与&#一起使用的示例代码34;高级&#34; 8.1上的命令或来自here
的8.0上的简单命令答案 1 :(得分:2)
不,WP8语音命令不支持短语列表中的通配符。问题是,如果没有固定的短语列表,WP8将无法在音频上执行本地语音识别。对于通配符短语,每当用户使用WP8的语音命令并且这不是一个好的用户体验时,WP8就必须在云中执行语音到文本。
现在,语音命令可支持的最大短语数为2,000 phrases。这是针对一个应用程序的所有命令。并且该限制可以使消歧更容易,并为消费者提供更准确的结果。总的来说,最好使用尽可能少的短语来使消歧更准确。
对于需要在语音命令中使用通配符短语的合理用例,有一个推荐的解决方法。第一步,使用“*”语音命令启动应用程序以获得正确的语法。应用程序打开后,通过让用户重复其特定命令并在云中触发语音转文本,在应用程序中使用语音转文本(使用SpeechRecognizer)。
答案 2 :(得分:-1)
&#34; {*}&#34;的最佳歌曲是什么?工作?至少文档在配置中提到了ListenFor元素。 Voice command element and attribute reference for Windows Phone 8