Win10/UWP开发—使用Cortana语音指令启动前台App

转载 2015年09月17日 14:16:34

这两天进群(53078485)找大咖的童鞋比较多,只是大咖比较忙,目前Demo还没有要到,这里先给大家转载一篇Aran大咖的博客学习下,以下是原文:

 

Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调用App 的App Service。当然App Service也是Win10 App的新特性之一,通过调用App Service就可以在App没有前台运行的时候为Cortana提供数据交互。这样一来Cortana就具有了两种App交互方式:

  •  Cortana语音指令与前台App的交互
  •  Cortana语音指令与后台服务的交互

 

今天我们以前先看看Cortana与前台App的交互,与前台App的交互允许Cortana通过特定的语音指令来唤起App,并传递给App用户想要的是怎样的信息,App被唤起后通过用户的语音指令参数就可以判断接下来要做怎样的处理。

 

下面我们做一个App来集成Cortana,通过语音指令来启动App并根据参数来响应不同的用户请求,先看效果图: 

 

 

 Ok 开工!


创建VCD语音指令文件

在项目中添加一个xml文件并输入文件名,我这里创建的为VoiceCommandsFile.xml


编辑VCD文件

针对App的实际情况,可以创建不同语言的指令集CommandSet,

 

Win10使用的是V1.2的语音指令模板,具体的模板使用详情可访问:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn706593.aspx

 

每个VCD文件中声明的Command都必须包含以下信息:

  • AppName元素,应用程序用于Cortana中的语音识别的名称
  • Example元素,告诉用户该App所支持的语音指令的描述
  • ListenFor 元素,监听并识别用户的指令,每个Command都至少有一个该元素
  • Feedback 元素,指令识别成功后的反馈
  • Navigate 元素,声明语音指令将在前台启动应用。和VoiceCommandService互斥
  • VoiceCommandService 元素,声明语音指令将启动后台应用

 

VCD文件示例: 

 

<?xml version="1.0" encoding="utf-8"?>
 
<!--UWP使用的是语音命令v1.2模板  wp8.1是v1.1 wp8是v1.0-->
<!--等多V1.2模板详情请访问:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn706593.aspx-->
 
<!--可以创建多个 CommandSet 元素,每个都带有不同的 xml:lang 属性以使你的应用可用于不同的市场。
    例如,用于美国的应用可能有一个英语版本的 CommandSet 和一个西班牙语版本的 CommandSet-->
 
<!--
      -每个CommandSet代表一种语言的语音指令,
      -每个Command代表一种指定情景下的语音指令,每个CommandSet可以包含多种语音使用情景
      -Example 会出现在Cortana -> App 帮助界面中,提示用户可以怎么使用该语音场景
      -ListenFor 表示Cortana要监听的语音语法,每个命令都需要具有至少一个 ListenFor 元素
      -Feedback 指识别语音命令成功时,Cortana将显示该元素内的内容
      -Navigate 用于指示语音命令将在前台启动应用,如果语音命令改在后台启动应用,则指定VoiceCommandService
      -VoiceCommandService 标签表示Cortana要启用后台应用服务来处理用户需求,
          例: <VoiceCommandService Target="BusQueryService"/> Target填写后台应用服务的名称
        -->
 
 
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
  <CommandSet xml:lang="zh-cn" Name="set">
    <AppName>小秘</AppName>
    <Example> 打开主页 或 查询航班 </Example>
 
    <Command Name="OpenMainPage">
      <Example>打开主页</Example>
      <ListenFor>打开主页</ListenFor>
      <Feedback>正在启动航班助手……</Feedback>
      <Navigate  />
    </Command>
 
    <Command Name="QueryFlight">
      <Example> 查询去西雅图的航班  </Example>
      <ListenFor >[搜索]去{City}[的]航班</ListenFor>
      <ListenFor >[查询]去{City}[的]航班</ListenFor>
      <Feedback> 正在查询去{City}的航班 </Feedback>
      <Navigate />
    </Command>
 
    <Command Name="NavToPage">
      <Example> 跳转到某个界面  </Example>
      <ListenFor >[跳转]到{Destination}界面</ListenFor>
      <Feedback> 正在跳转到{Destination}界面 </Feedback>
      <Navigate />
    </Command>
 
    <!--PhraseList用来定义一组语音字符,指定相应规定的字符,用来消除歧义-->
    <!--使用 PhraseList 限制识别适用于一组相对较小的单词。当单词组过大(例如数百个单词)或者根本不应被限制时,
        请使用 PhraseTopic 元素和 Subject 元素来优化语音识别结果的相关性,从而增强可扩展性。-->
    <PhraseList Label="Destination">
      <Item>设置</Item>
      <Item>关于</Item>
    </PhraseList>
 
    <!--可以提高识别率,内部属性Subject可指定该关键字类型,比如 城市名 姓名  地址 等类型-->
    <PhraseTopic Label="City" Scenario="Natural Language">
      <Subject>City/State</Subject>
    </PhraseTopic>
  </CommandSet>
 
  <!-- 其他语言的 CommandSet -->
 
</VoiceCommands>

 

 上面例子中我们定义了三种Command指令,分别是"打开主页","查询去某城市的航班","跳转到某个界面"。

 

    ListenFor元素可以存在多个,其中认为可忽略的词可以用[]符号进行修饰。

    PhraseList用来定义一组语音字符,指定相应规定的字符,用来消除歧义, 使用 PhraseList 限制识别适用于一组相对较小的单词。当单词组过大(例如数百个单词)或者根本不应被限制时,要使用 PhraseTopic 元素和 Subject 元素来优化语音识别结果的相关性,从而增强可扩展性。

    PhraseTopic可以提高识别率,内部属性Subject可指定该关键字类型,比如 城市名 姓名 地址 等类型

 

安装VCD命令文件

我们的App安装后必须运行一次才能安装VCD指令集,我们可以在App的OnLaunched中调用下面方法去注册并激活语音指令集,代码如下: 

 

/// <summary>
/// 注册语音指令
/// </summary>
private async Task InsertVoiceCommands()
{
    await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///VoiceCommandsFile.xml")));
}


 处理语音指令

在VCD程序集安装正确的情况下,Cortana的帮助界面就会出现我们的App的语音指令集的调用说明: 

 

 

通过相应的语音指令,Cortana就会启动我们的App,我们需要在App中重写OnActivated事件,判断用户使用的是哪个语音指令,并实现相应的逻辑,代码如下: 

 

protected override void OnActivated(IActivatedEventArgs args)
{
    base.OnActivated(args);
    // 如果程序不是因为语音命令而激活的,就不处理
    if (args.Kind != ActivationKind.VoiceCommand) return;
 
    //将参数转为语音指令事件对象
    var vcargs = (VoiceCommandActivatedEventArgs)args;
    // 分析被识别的命令
    var res = vcargs.Result;
    // 获取被识别的命令的名字
    var cmdName = res.RulePath[0];
    Type navType = null;
    string propertie = null;
    //判断用户使用的是哪种语音指令
    switch (cmdName)
    {
        case "OpenMainPage":
            navType = typeof(MainPage);
            break;
        case "QueryFlight":
            navType = typeof(QueryPage);
            //获取语音指令的参数
            propertie = res.SemanticInterpretation.Properties["City"][0];
            break;
        case "NavToPage":
            //获取语音指令的参数
            propertie = res.SemanticInterpretation.Properties["Destination"][0];
 
            //根据 propertie 参数决定跳转到指定界面,这里就不判断了
            navType = typeof(QueryPage);
            break;
    }
    //获取页面引用
    var root = Window.Current.Content as Frame;
    if (root == null)
    {
        root = new Frame();
        Window.Current.Content = root;
    }
    root.Navigate(navType, propertie);
 
    // 确保当前窗口处于活动状态
    Window.Current.Activate();
}

Ok,至此代码部分已经完工,可以通过Cotrana语音指令启动我们的App了,这种启动方式为前台启动,下篇文章中将介绍Cortana调用App后台service是如何实现的。

相关文章推荐

Win10/UWP开发—使用Cortana语音与App后台Service交互

上篇文章中介绍了(53078485群)大咖Aran的博客:Win10/UWP开发—使用Cortana语音指令启动前台App ;而这篇博客我们将接着上篇文章的内容为大家带来大咖Aran的讲解:讲讲如何使...
  • igweyou
  • igweyou
  • 2015年09月22日 10:27
  • 1407

Win10/UWP开发—凭据保险箱PasswordVault

PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据。 那...
  • igweyou
  • igweyou
  • 2015年12月15日 10:24
  • 987

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备...
  • igweyou
  • igweyou
  • 2015年12月10日 09:26
  • 993

Win10/UWP开发—系统级导航

Win10系统为确保所有应用中的一致导航体验,提供后退导航功能。当你的应用在手机、平板电脑上或者在支持系统后退功能的电脑或笔记本电脑上运行时,系统会在"后退"按钮被按下时通知你的应用。 由你来决定要将...
  • igweyou
  • igweyou
  • 2015年11月26日 10:25
  • 766

[UWP开发] Cortana启动应用

使用Cortana可以快速启动应用,甚至可以根据说出的指令,快速到达应用内的某个页面或启动某项功能。如通过Cortana说出,“微博 搜索计算机”就可以声控打开并搜索有关计算机的微博内容。 在win...
  • xiahn1a
  • xiahn1a
  • 2015年11月27日 21:27
  • 776

Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便。全景视图因为对设计要求比较高,自己总是做不出好的效果。对于一般的新闻阅读类Ap...
  • igweyou
  • igweyou
  • 2016年01月14日 13:27
  • 1665

UWP win10 app 新关键字x:Bing

原本使用MVVM开发,我们使用数据绑定是x:Binging 新的关键字x:Bing使用和原来x:Binging区别不大。 优点是性能提升,强类型,可以在编译找出类型不同的错误...

Win10 UWP 开发教程 课程 资源

  • 2017年09月27日 13:15
  • 48B
  • 下载

Android App开发基础篇—64位Win10系统下安装配置开发环境

安装配置Android App开发环境     前言:要进行一个Android App的开发,需要使用到Java、Android SDK、ADT以及一些软件开发工具IDE的帮助。本文将首先介绍这些工具...

Win 10 UWP开发系列:设置AppBarButton的图标

在WP8以前,页面最下面的四个小圆按钮是不支持绑定的,WP8.1 RT之后,系统按钮升级成了AppBarButton,并且支持绑定了。在Win10 UWP开发中,按钮的样式发生了变化,外面的圆圈没有了...
  • igweyou
  • igweyou
  • 2016年01月12日 10:12
  • 1643
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win10/UWP开发—使用Cortana语音指令启动前台App
举报原因:
原因补充:

(最多只允许输入30个字)