语言: HTML | XAML

快速入门:语音命令 (HTML)

Applies to Windows Phone only

结合使用语音命令和 Cortana 以启动应用并指定要执行的操作或命令。 例如,用户可以点击“开始”按钮并说"Contoso Widgets,显示畅销商品",该操作可以同时启动名为 "Contoso Widgets" 的应用并导航至应用内的"畅销商品"页面。

要点  

Cortana 给予了用户通过使用特定语音命令访问手机的某些内置功能的能力。这些是系统语音命令,它们根据为使用手机上的语音功能而进行配置的语音语言而有所不同。当你为你的应用选择名称,或选择由于语音认证要求而为应用使用的可选 CommandPrefix 元素时,请注意到这些系统语音命令;有关详细信息,请参阅 Windows Phone 的应用策略

有关语音语言存储的系统语音命令的列表,请参阅 Windows Phone 8 的系统语音命令

以下是使用语音或键盘输入添加语音命令功能并将 Cortana 与你的应用集成的基本步骤:

  1. 创建语音命令定义 (VCD) 文件。这是一个 XML 文档,可以定义在激活应用时用户可说出以启动操作或调用命令的所有语音命令。请参阅 Voice command elements and attributes
  2. 通过电话的语音功能在 VCD 文件中注册命令集。
  3. 处理通过语音命令激活、在应用内导航以及执行命令的任务。

目标: 了解如何启用语音命令。

先决条件

如果你刚开始使用 JavaScript 开发应用:  

要完成该教程,请阅读这些主题来熟悉此处讨论的技术。

用户体验指南:  

要获得有助于设计既实用又有吸引力且支持语音的应用的提示,请参阅适用于 Windows Phone 的语音设计指南

1. 设置音频源

确保你的设备具有麦克风或等效硬件。

应用程序包清单package.appxmanifest 文件)中设置“麦克风”设备功能 (DeviceCapability) 以获取麦克风音频源的访问权限。这允许应用从所连接的麦克风录制音频。

请参阅应用功能声明

2. 创建 VCD 文件

  1. 在 Visual Studio 中,右键单击项目名称,选择 Add->New Item,然后选择“文本文件”
  2. 为 VCD 文件键入一个名称并确保附加“.xml”文件扩展名。例如,“ContosoWidgets.xml”。选择“添加”
  3. 在“解决方案资源管理器”中,选择 VCD 文件。
  4. 在“属性”窗口中,将“构建操作”设置为“内容”,然后将“复制到输出目录”设置为“如果较新则复制”。

3. 编辑 VCD 文件

VCD 文件中声明的每个语音命令都必须包含一些基本信息。

  • 用于展示用户如何调用命令的短语示例。

    What can I say 屏幕列出了支持语音命令的应用名称,以及可用于启动每个应用并启动操作的命令示例。

    该命令示例从 Example 元素(CommandSet 元素的子项)的内容中提取而来。此屏幕会在用户进行以下操作时出现:长按“搜索”按钮以启动 Cortana 并说“"帮助"”或“"我可以说什么?"”,或者点击“查看详细信息”

  • 应用将识别以启动命令的字词或短语。

    注意  

    命令由 Command 元素定义,该元素至少包含一个 ListenFor 元素。每个 ListenFor 元素都包含可启动由 Command 元素指定的操作的一个或多个字词。

    ListenFor 元素无法以编程方式修改。但是,与 ListenFor 元素相关联的 PhraseList 元素可以以编程方式修改。例如,假设你有针对相对较少的一组电影的电影查看器应用,并且希望允许用户只需说出应用名称后接“"播放 [<MovieName>]"”便可启动电影。无需为每个可能的电影创建单独的 ListenFor 元素。相反,你可以在运行时使用电影选项动态填充 PhraseList。在 ListenFor 元素本身中,你可以指定如下内容:<ListenFor> Play {movies} </ListenFor>,其中“"电影"”是用于 PhraseListLabel

    请参阅如何以编程方式修改短语列表

  • 应用在识别出命令时显示并说出的文本。
  • 在识别出命令时要在应用内导航到的页面或屏幕。

你可以为用于激活应用和执行命令的命令指定多个语言版本。你可以创建多个 CommandSet 元素,每个都带有不同的 xml:lang 属性以使你的应用可用于不同的市场。例如,用于美国的应用可能有一个用于英语的 CommandSet 和一个用于西班牙语的 CommandSet

小心  

要使用语音命令激活应用并启动操作,该应用必须注册一个 VCD 文件,此文件包含带有匹配用户在电话上选择的语音语言的 CommandSet。此语言由用户在手机的“设置”> System > Speech > Speech Language 屏幕上设置。

有关更多详细信息,请参阅 Voice command elements and attributes 参考。

下面是一个 VCD 文件的示例,它为实现各种语音识别的演示应用定义了四个命令选项。

该特定示例具有以下内容:命令前缀("识别")、可选字词("显示")、用于标识应用实现的不同类型语音识别的主题列表,以及 PhraseTopic,它允许用户听写与语音命令内联的自由格式消息。


<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">

  <CommandSet xml:lang="en-us" Name="examplevcd">
    <CommandPrefix>Recognize</CommandPrefix>
    <Example>Show default speech recognition</Example>

  <Command Name="showRecognition">
      <Example>Show default recognition</Example>
      <ListenFor>[Show] {options} {msgText}</ListenFor>
      <Feedback>Showing {options} {msgText}</Feedback>
      <Navigate/>
    </Command>

    <PhraseList Label="options">
      <Item>default recognition</Item>
      <Item>web search</Item>
      <Item>list constraint</Item>
      <Item>file constraint</Item>
    </PhraseList>
    
    <PhraseTopic Label="msgText" Scenario="Short Message">
      <Subject>Person Names</Subject>
    </PhraseTopic>
  
  </CommandSet>

  <!-- Other CommandSets for other languages -->

</VoiceCommands>


注意  

虽然设置 CommandPrefix 元素是可选的,但它在两个主要方案中十分有用。

  • 你的应用名称很难(或不可能)发音。例如,如果你的应用名称是 "Contoso Widg3ts",你可以将 CommandPrefix 设置为“"Contoso Widgets"”。
  • 语音命令经过本地化。如果你让每种受支持的语言都拥有命令集,你可以根据每种语言以不同的方式设置 CommandPrefix 元素。例如,你的应用名称为“"Contoso Table"”,你可以将 CommandPrefix 设置为“"Contoso Mesa"”以用于任何西班牙语命令集。

无法在 CommandPrefix 元素中子集匹配文本。例如,如果 CommandPrefix 设置为“"Contoso Weather"”,“Contoso Weather [<"phrase">]”将得到识别,但是“Contoso [<"phrase">]”或“Weather [<"phrase">]”不会得到识别。

4. 安装 VCD 命令

你的应用必须运行一次,才能安装 VCD 中的命令集。

当你的应用激活时,在 Launch 期间调用 InstallCommandSetsFromStorageFileAsync 以注册系统应该侦听的命令。

注意  如果发生电话备份而且应用自动重新安装,将不保留任何语音命令数据。要确保应用的语音命令数据保持完好,请考虑每当应用启动或激活时初始化你的 VCD 文件,或者存储表示当前是否已安装 VCD 的设置,并且每当应用启动或激活时检查该设置。

以下示例将显示如何安装 VCD 文件 (vcd.xml) 指定的命令。


if (args.detail.kind === activation.ActivationKind.launch) {
    if (args.detail.previousExecutionState !==
        activation.ApplicationExecutionState.terminated) {
        // This application has been newly launched. 
        // TODO: Initialize your application here.

        var uri = new Windows.Foundation.Uri("ms-appx:///data/vcd.xml");
        var storageFile =
            Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(
            // Success function.
            function (vcd) {
                Windows.Media.SpeechRecognition.VoiceCommandManager.installCommandSetsFromStorageFileAsync(vcd);
            },
            // Error function.
            function (err) {
                WinJS.log && WinJS.log("File access failed.");
            });

        initialize();

    } else {
        // This application has been reactivated from suspension.
        // TODO: Restore application state here.
    }
    args.setPromise(WinJS.UI.processAll());
}


5. 处理激活并执行语音命令

启动应用并安装命令集之后,指定你的应用如何响应后续语音命令激活。例如,你的应用可能会导航到特定页的内容、显示地图或其他导航实用工具,或者说出确认语句或状态。

你需要:

  1. 确认你的应用已通过语音命令激活。

    onactivated 事件中,检查 ActivationKind 是否为 voiceCommand

  2. 确定命令名称和说出的内容。

    针对 kind 属性查询 WebUILaunchActivatedEventArgsdetail 属性。对于语音命令激活,该值等于 ActivationKind.voiceCommand

当你确定所使用的语音命令和所说的文本时,你可以在应用中采取适当的操作。

要点:  VCD 文档允许你将不同的语音命令映射到不同的屏幕上;你无需将 URI 映射器用于语音命令。但是如果你为其他功能使用 URI 映射器(例如搜索可扩展性),请确保传递语音命令激活并保留完整的 URI 方案以防止 VCD 信息丢失。

对于该示例,我们可重新参考编辑 VCD 文件步骤中的 VCD。

一旦我们得到语音命令对应的语音识别结果,我们会从 rulePath 数组的第一个值获取命令名称。如果 VCD 文件定义了多个可能的语音命令,我们将循环访问数组中所有的值。

然后,我们将说出的文本与受支持的命令之一进行比对。此处,我们仅向用户提供带有 MessageDialog 的提示,其中包含识别结果。

我们还可以显示如何访问 Navigate 元素的 Target 属性值。对于该示例,我们没有指定目标。有关详细信息,请参阅 Voice command elements and attributes

注意  你可以查明实际是否已说出已启动应用的语音命令,或者是否已使用 commandMode 注册表项从 SpeechRecognitionSemanticInterpretation.Properties 字典中以文本形式键入它。该注册表项的值为将“"voice"”或“"text"”。


if (args.detail.kind === activation.ActivationKind.voiceCommand) {
    // This application has been activated with a voice command.

    var speechRecognitionResult = args.detail.result;

    // Get the name of the voice command. 
    // For this example, we declare only one command.
    var voiceCommandName = speechRecognitionResult.rulePath[0];

    // Get the actual text spoken.
    var textSpoken =
        speechRecognitionResult.text !==
        undefined ? speechRecognitionResult.text : "EXCEPTION";

    // Get the value of Command/Navigate@Target.
    // Navigate is a required child element of the Command element. 
    // The Target attribute is optional and is typically used to 
    // specify the page that the app should navigate to when it launches. 
    // You can obtain the value of the Target attribute from the 
    // SpeechRecognitionSemanticInterpretation.Properties dictionary 
    // using the "NavigationTarget" key. 
    // For this example, we declare only one command with no target.
    var navigationTarget = speechRecognitionResult.semanticInterpretation.properties["NavigationTarget"][0];

    if (voiceCommandName === "showRecognition") {
        if (textSpoken.indexOf("default recognition") > -1) {
            // Code for default recognition.
        }
        else if (textSpoken.indexOf("web search") > -1) {
            // Code for default recognition.
        }
        else if (textSpoken.indexOf("list constraint") > -1){
            // Code for default recognition.
        }
        else if (textSpoken.indexOf("file constraint") > -1){
            // Code for default recognition.
        }
    }
    else {
        // There is no match for the voice command name.
    }

    var messageDialog =
        new Windows.UI.Popups.MessageDialog(
        textSpoken, "Text spoken");
    messageDialog.showAsync();
}


摘要和后续步骤

你在这里了解到如何使用 VCD 文件和 Windows Phone 提供的语音识别实现基础语音命令。

接下来,你可能希望了解如何动态修改 VCD 短语列表

相关主题

响应语音交互
如何定义自定义识别约束
适用于 Windows Phone 的语音设计指南

 

 

显示:
© 2014 Microsoft