[UWP开发] Cortana启动应用

适用于win10应用开发。

使用Cortana可以快速启动应用,甚至可以根据说出的指令,快速到达应用内的某个页面或启动某项功能。如通过Cortana说出,“微博 搜索计算机”就可以声控打开并搜索有关计算机的微博内容。
在win10手机中,启动Cortana,点击左上角菜单,帮助。可以查看Cortana支持应用列表。
列表
点击后可以查看详细的指令列表,以微信为例。
列表
可以看出部分指令是完整的语句(如打开话费充值),而部分指令包含可选择部分(如找{某人})


  • 编写VCD文件
    供Cortana使用的指令,定义在vcd文件中。vcd文件是xml格式文件。
    在VS中新建并添加xml格式文件,文件名无要求,后缀为.xml。
    第一行为:
<?xml version="1.0" encoding="utf-8"?>

xml根节点为VoiceCommands节点,里面指出vcd文件版本。其中包含数个CommandSet节点,每个CommandSet中定义一种语言的指令列表,每种程序支持的语言要单独定义。

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
  <CommandSet xml:lang="zh-cn" Name="2048CommandSet_zh-cn">
    <CommandPrefix> 2048 </CommandPrefix>
    <Example> 快乐游戏 </Example>   
  </CommandSet>
</VoiceCommands>

xml:lang=”zh-cn” 表示语言为简体中文。Name是标记,在程序中引用和动态修改vcd文件时有用。
CommandSet以下有CommandPrefix节点,意义是应用名称的简写或别名,用户说出CommandPrefix中的名称,即可在Cortana中调起该应用。
Example节点,按照官方文档说是给一个可用功能的示例。但现在多用于展示应用的特性与口号。
CommandPrefix与Example中的内容,如文章开头的第一幅图,信息在其中显示。可以看出微信的CommandPrefix是MicroMsg,Example是微信,是一个生活方式。
在最新的1.2版vcd中,CommandPrefix可以换为AppName,AppName是新的用法,表示的意义相同。

详细的口语指令,每一条指令包含在一个Command节点下。Command节点为CommandSet的子节点。
一个Command节点的例子如下所示:

<Command Name="Start">
  <Example> 新游戏 </Example>
  <ListenFor> [开始][启动]新游戏 </ListenFor>
  <Feedback> 正在开始新游戏 </Feedback>
  <Navigate/>
</Command>

其中Name=”Start”表示指令名称,在应用后台代码中进行处理。
Example,在文章开头的第二幅图中的指令列表中显示,告诉用户可以怎样说。
ListenFor节点可以有多个,当Cortana听到ListenFor中的文字内容后,就会执行本条指令。中括号包含的部分表示可选部分。在上例中,当听到“新游戏”或“开始新游戏“或”启动新游戏“甚至是”开始启动新游戏“时,都会执行这一条指令,但是”启动开始新游戏“不会被执行,因为顺序不对。
FeedBack表示当用户说了本条指令后,Cortana在执行指令时,对用户的反馈。在上例中,当用户说出“新游戏”后,Cortana执行指令,同时告诉用户“正在开始新游戏”。
Navigate表示执行指令后,打开应用跳转到的Page名称,如“MainPage.xaml”。也可以不写,但需要在App.cs文件中处理相应的事件。

对于那些有可选择部分的指令,给一个例子:

<Command Name="Load">
  <Example> 读取存档 1 </Example>
  <ListenFor> [读取][使用]存档 {SaveNum} </ListenFor>
  <Feedback> 使用存档 {SaveNum} 进行游戏 </Feedback>
  <Navigate/>
</Command>

<PhraseList Label="SaveNum">
  <Item>1</Item>
  <Item>2</Item>
  <Item>3</Item>
  <Item>4</Item>
  <Item>5</Item>
</PhraseList>   

其中ListenFor中{SaveNum}表示使用label {SaveNum}中的Item项的内容进行替换。此处只有说存档1~5,Cortana才会相应,当说出存档6时,Cortana不会响应。如Item项的内容不确定,如想搜索某个地点,此处直接用{*},表示此处可以用任意语句匹配。

其中的PhraseList,可以替换为PhraseTopic,用来表示指令目的和类别范围,如下所示:

 <PhraseTopic Label="SearchTerms" Scenario="Search">
    <Subject> City/State </Subject>
 </PhraseTopic>

Scenario用来更精确表示语句应用的场景,使得语句能够被更精确识别。Scenario可以为:”Natural Language”, “Search”, “Short Message”, “Dictation”, “Commands”, “Form Filling”。
Subjectfont 可以有多个,用来表示该语句的主题,是一个范围,实际操作时会在该范围内进行匹配。可以为 “Addresses”, “City/State”, “Person Names”, “Movies”, “Music”, “Phone Number”。


  • 处理语音事件
    首先需要在代码中应用vcd文件,在App.cs的OnLaunched方法中添加如下语句。
try
{
    var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Command.xml"));
    await Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(storageFile);
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine("Installing Voice Commands Failed: " + ex.ToString());
}

当启动一次应用后,就会将vcd文件进行应用,之后就可以使用Cortana快速启动应用。
通过Cortana启动的应用,不会调用OnLaunched方法,而是使用OnActivated方法。需要在程序中重写此方法。

protected async override void OnActivated(IActivatedEventArgs e)
{
    //如果是被语音指令激活
    if (e.Kind == Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand)
    {
        var commandArgs = e as Windows.ApplicationModel.Activation.VoiceCommandActivatedEventArgs;
        Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = commandArgs.Result;
        //获取语音指令的Name
        string voiceCommandName = speechRecognitionResult.RulePath[0];
        if (voiceCommandName == "Load")
        {
            // 获取匹配到的可选部分,标签为SaveNum的指令语句内容
            string item = speechRecognitionResult.SemanticInterpretation.Properties["SaveNum"][0];
            //后续指令处理
        }
    }
}

需要注意的是,如果vcd文件中某条指令的Navigate项没有写明跳转的页面,那么会调用App.cs中的OnActivated方法,在其中进行处理。而此时OnLaunched方法是不会被执行的,其中的一些应用初始化操作,需要自行复制到OnActivated方法中。


测试环境Windows 10 UWP

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值