信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的语音命令

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

用户可以使用语音命令启动应用和执行操作。例如,使用 Contoso Widgets 应用的用户可以通过点按“开始”按钮并说出“Contoso Widgets,显示畅销商品”来启动 Contoso Widgets 应用并导航到“畅销商品”页面,或执行开发人员指定的一些其他操作。通过完成以下三个步骤,您可以向应用添加语音命令功能:

  1. 创建语音命令定义 (VCD) 文件。这是一个 XML 文档,它在启动应用时定义用户可以讲出的用于启动操作的语音命令。

  2. 添加代码以使用手机的语音功能初始化 VCD 文件。

  3. 添加代码以处理导航和执行命令。

说明注意:

若要使用语音命令,您必须在应用清单文件中设置 ID_CAP_SPEECH_RECOGNITION、ID_CAP_MICROPHONE 和 ID_CAP_NETWORKING 功能。如果您没有设置这些功能,您的应用可能无法正常工作。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

本主题包括以下部分。

以下部分介绍如何将 VCD 文件添加到您的项目中以及如何创建文件内容。

将 VCD 文件添加到项目中

以下步骤介绍如何将 VCD 文件添加到项目中。

  1. 在 Visual Studio 中,右击项目名称,选择“添加->新项”,然后选择“语音命令定义”

  2. 键入 VCD 文件的名称,然后选择“添加”

  3. “解决方案资源管理器”中,选择 VCD 文件。

  4. “属性”窗口中,将“生成操作”设置为“内容”,然后将“复制到输出目录”设置为“如果较新则复制”

创建 VCD 文件的内容

每个语音命令包含:

  • 有关用户通常该如何调用命令的短语示例。

  • 应用将识别进而启动命令的单词或短语。

  • 识别命令后,应用将显示和向用户读出的文本。

  • 识别命令后,应用将导航到的屏幕。

下面的代码示例演示一个示例 VCD 文件:

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="en-us">
    <CommandPrefix> Contoso Widgets </CommandPrefix>
    <Example> Show today's specials </Example>
    <Command Name="showWidgets">
      <Example> Show today's specials </Example>
      <ListenFor> [Show] {widgetViews} </ListenFor>
      <Feedback> Showing {widgetViews} </Feedback>
      <Navigate Target="/favorites.xaml"/>
    </Command>

    <PhraseList Label="widgetViews">
      <Item> today's specials </Item>
      <Item> best sellers </Item>
    </PhraseList>
  
  </CommandSet>
  
  <!-- Other CommandSets for other languages -->

</VoiceCommands>

选择命令前缀

CommandPrefix 元素值的设置是可选的,在两个主要场景中进行设置会很有用:

  • 无法读出您的应用名称。例如,如果您的应用名称是 Contoso Widg3ts,您可以将 CommandPrefix 元素设置为“Contoso Widgets”。

  • 您在将您的语音命令本地化。如果您选择使每一个受支持的语言都拥有命令集,那么您可以根据各语言分别设置 CommandPrefix 元素。例如,如果您的应用名为“Contoso 桌子”,那么您可以为任何西班牙语命令集,将 CommandPrefix 元素设置为“Contoso Mesa”。

警告说明警告:

不能匹配 CommandPrefix 元素中的文本子集。例如,如果您的 CommandPrefix 元素设置为“Contoso Weather”,那么“Contoso Weather[phrase]”将被识别,而“Contoso [phrase]”或“Weather[phrase]”将不会被识别。

有关 CommandPrefix 元素的更多信息,请参见 Windows Phone 8 的语音命令元素和特性引用

指定 VCD 文件中的单词或短语

每个 Command 元素必须至少包含一个 ListenFor 元素。每个 ListenFor 元素包含将启动 Command 元素指定的操作的单词。

无法以编程方式修改 ListenFor 元素。但是,可以采用编程方式修改与 ListenFor 元素相关的 PhraseList 元素。例如,假设我们拥有一个电影查看器应用并且想要使用户只需说出应用的名称,后跟“播放 MovieName”,即可启动电影。若要为每个可能的电影创建单独的 ListenFor 元素,这将是个非常艰巨的任务。您可以改为使用所有可能的电影选项,在运行时动态地填充 PhraseList。在 ListenFor 元素本身中,您可以讲出类似以下内容:<ListenFor>Play {movies}</ListenFor>,其中“movies”是 PhraseList 的标签名称。您需要至少创建一个空白的已标记的 PhraseList 元素,以便在运行时能够采用编程方式修改它。有关如何执行此操作的更多信息,请参见后面的“以编程方式修改短语列表”部分。可以从封闭的 CommandSet 内的任意 Command 元素,引用 PhraseList 元素中的单词或短语。

在您的应用首次运行期间,使用单个方法调用以初始化 VCD 文件。初始化 VCD 文件将使用用户手机上的语音系统,注册要进行侦听的命令。

下面的代码示例演示如何初始化 VCD 文件:

await VoiceCommandService.InstallCommandSetsFromFileAsync(
    new Uri("ms-appx:///ContosoWidgets.xml"));

此时,您的应用可以加载用于定义应用将侦听的语音命令的 VCD 文件。现在,您需要告诉应用如何响应特定的语音命令。根据应用的用途,这可能意味着您要显示地图、读回预订确认、显示航班状态或导航到其他屏幕。

首先,您需要确定应用是否是由语音命令启动的,然后确定语音命令的名称和参数是什么。您可以通过查看 NavigationContext 类的 QueryString 属性完成此操作。决定要使用的语音命令后,您可以在应用中进行相应的操作。

返回“创建 VCD 文件”部分的示例,这意味着如果用户说出“Contoso Widgets,显示畅销商品”,则 NavigationContext.QueryString 字典将包含 showWidgets、widgetViews 和 reco 密钥的条目。

说明注意:

ListenFor 元素可能包括由一对大括号括起来的星号字符,用以实现通配符功能。有关更多信息,请参见 Windows Phone 8 的语音命令元素和特性引用。如果启用通配符的 ListenFor 元素的语音命令得到匹配,则 reco 密钥将包含字符串“…”。

以下示例显示当您的 VCD 文件使用 showWidgets 语音命令导航至 favorites.xaml 页面时,启动 URI 的外观。

"/favorites.xaml?voiceCommandName=showWidgets&widgetViews=best%20sellers&reco=Contoso%20Widgets%Show%20best%20sellers"

重要说明重要说明:

VCD 文件允许您将不同的语音命令映射至不同的屏幕;您无需使用语音命令的 URI 映射器。但是如果您针对其他功能(如搜索可扩展性)使用 URI 映射器,请确保传递语音命令启动并保留完整的 URI 方案,以便 VCD 信息不会丢失。

当您的屏幕启动时,它可以使用 NavigationContext 类的 QueryString 属性提取 URI 参数值和获取关于语音命令的信息。下面的代码示例显示如何使用 QueryString 获取有关语音命令的信息以及随后如何启动相应的操作:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
  base.OnNavigatedTo(e);

  // Is this a new activation or a resurrection from tombstone?
  if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)
  {

    // Was the app launched using a voice command?
    if (NavigationContext.QueryString.ContainsKey("voiceCommandName"))
    {

      // If so, get the name of the voice command.
      string voiceCommandName 
        = NavigationContext.QueryString["voiceCommandName"];

      // Define app actions for each voice command name.
      switch (voiceCommandName)
      {
        case "showWidgets":
          string viewWidget = NavigationContext.QueryString["widgetViews"];
                   
          // Add code to display specified widgets.
          break;
 
        // Add cases for other voice commands. 
        default:

          // There is no match for the voice command name.
          break;
      }
    }
  }
}

VCD 文件允许您为用于启动应用和执行命令的命令,指定多个语言版本。您可以创建多个 CommandSet,每个皆带有不同的 xml:lang 特性,以使您的应用可在多个市场中使用。例如,面向美国的应用可能包括英语版本的 CommandSet 和西班牙语版本的 CommandSet。

警告说明警告:

要使用语音命令启动应用和启动操作,应用必须注册 VCD 文件,它包含一个其语言与用户在手机上所选的语音语言相匹配的 CommandSet。用户在手机的“设置 > 系统 > 语音 > 语音语言”屏幕上设置该语言。

语音命令的 API 包括两种方法,使您可以在 VCD 文件中动态地更新短语列表。当语音命令特定于涉及更新数据(如用户的收藏夹列表或已更新的应用数据)的任务时,以编程方式更新 PhraseList 非常有用。要在 VCD 文件中更新短语列表,请首先获取包含要更新的短语列表的 CommandSet。然后,将检索的 CommandSet 存储在 VoiceCommandSet 对象中。该调用通过其“名称”特性的值(在 VCD 文件中,该值必须是唯一的)指定 CommandSet。

在以下代码示例中,使用字符串“en-US”检索命令集,该字符串必须设置为 CommandSet 元素的“名称”特性。

VoiceCommandSet widgetVcs =
    VoiceCommandService.InstalledCommandSets["en-US"];

现在,您可以通过指定其“标签”特性和字符串的数组(该数组将构成短语列表的新内容)更新短语列表中的项目。

await widgetVcs.UpdatePhraseListAsync("saved", 
    new string[] {"today’s special", "best sellers", "hammer", "plane", "scroll saw"});

请注意,此调用将替换短语列表的所有内容。如果您只想要将新项目添加到短语列表中的现有项目,您需要在此调用中指定现有的项目和新项目。在前面的示例中,短语列表已经包含值“今日特别推荐”和“畅销商品”,但是您必须在此调用中进行指定,否则它们将被覆盖。

如果出现手机备份而且应用自动重装,则任何语音命令数据都不会保留。为了避免此情况,确保您的应用的语音命令数据保持完整,请考虑在每次应用启动时初始化您的 VCD 文件,或存储这样一种设置,它指示如果当前安装了 VCD,那么每次应用启动时检查该设置。

语音命令功能包括 GUI 屏幕,该屏幕将帮助用户找出手机上哪些应用支持语音命令,以及应用可以使用哪些语音命令。

  • 用户从手机的应用列表中选择应用。

  • 用户说出一个语音命令,应用而非要求的操作识别了该命令。出现的“消除歧义”屏幕包含一个链接到“您是否了解?”屏幕的问号按钮。

“我可以说什么”屏幕

“我可以说什么”屏幕列出支持语音命令的应用的名称,以及可用于启动应用和启动操作的命令的示例。示例命令是示例元素的内容,其中示例元素是 VCD 文件中 CommandSet 元素的子元素。当用户按下“开始”按钮并说出“我可以说什么?”时,或当用户在全局“侦听”屏幕上按下问号按钮时,将显示该屏幕。

What can I say screen

“您是否了解?”屏幕

“您是否了解?”屏幕列出可用于启动应用的语音命令。用户通过点按“我可以说什么”屏幕上的“您是否了解?”链接,可以访问该屏幕,该屏幕包括应用名称(或 CommandPrefix 元素的值,如果开发人员在 VCD 文件中指定了它)和语音命令示例。

如果用户说出应用名称(或 CommandPrefix 元素的值),后跟未识别的语音命令,那么也会出现指向“您是否了解?”屏幕的链接。

Did you know? screen

使用该功能时,您可能会碰到语音命令错误。有关这些错误更多信息,请参见处理 Windows Phone 8 语音应用中的错误

显示: