9

我正在尝试创建一个包含语音命令的 Windows Phone 8 应用程序。语音命令类似于“[艺术家] 的热门歌曲是什么”,因此我需要为“[艺术家]”使用某种通配符,允许用户说出任何艺术家。如果不在 PhraseList 中列出世界上所有的艺术家,我怎么能做到这一点?

4

3 回答 3

3

这绝对是可能的。

简短回答 这在 Windows Phone 8.1 中可以使用所谓的 PhraseTopics。

长版

首先,您需要声明ID_CAP_SPEECH_RECOGNITIONID_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

于 2014-05-07T11:40:04.977 回答
2

不,WP8 语音命令不支持短语列表中的通配符。问题是,WP8 将无法对没有固定短语列表的音频执行本地语音识别。对于通配符短语,每次用户使用 WP8 的语音命令时,WP8 都必须在云中执行语音到文本,这不是一个好的用户体验。

目前,语音命令中可以支持的最大短语数为2,000 个短语。这是针对单个应用程序的所有命令。这个限制是为了使消歧更容易,并为消费者提供更准确的结果。总的来说,最好使用尽可能少的短语来使消歧更准确。

对于需要语音命令中的通配符短语的合理用例,有一个推荐的解决方法。第一步,有一个“*”语音命令,以正确的语法启动应用程序。打开应用程序后,通过让用户重复他们的特定命令,在应用程序中使用语音到文本(使用SpeechRecognizer),这将触发云中的语音到文本。

于 2012-11-11T19:24:35.690 回答
-1

“{*} 的热门歌曲是什么”有效吗?至少文档为配置中的 ListenFor 元素提到了这一点。Windows Phone 8 的语音命令元素和属性参考

于 2012-11-10T05:45:23.710 回答