Win10/UWP开发—使用Cortana语音指令与App的前台交互

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文件示例:

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

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

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

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

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

安装VCD命令文件

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

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

处理语音指令

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

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

 1 protected override void OnActivated(IActivatedEventArgs args)
 2 {
 3     base.OnActivated(args);
 4     // 如果程序不是因为语音命令而激活的,就不处理
 5     if (args.Kind != ActivationKind.VoiceCommand) return;
 6
 7     //将参数转为语音指令事件对象
 8     var vcargs = (VoiceCommandActivatedEventArgs)args;
 9     // 分析被识别的命令
10     var res = vcargs.Result;
11     // 获取被识别的命令的名字
12     var cmdName = res.RulePath[0];
13     Type navType = null;
14     string propertie = null;
15     //判断用户使用的是哪种语音指令
16     switch (cmdName)
17     {
18         case "OpenMainPage":
19             navType = typeof(MainPage);
20             break;
21         case "QueryFlight":
22             navType = typeof(QueryPage);
23             //获取语音指令的参数
24             propertie = res.SemanticInterpretation.Properties["City"][0];
25             break;
26         case "NavToPage":
27             //获取语音指令的参数
28             propertie = res.SemanticInterpretation.Properties["Destination"][0];
29
30             //根据 propertie 参数决定跳转到指定界面,这里就不判断了
31             navType = typeof(QueryPage);
32             break;
33     }
34     //获取页面引用
35     var root = Window.Current.Content as Frame;
36     if (root == null)
37     {
38         root = new Frame();
39         Window.Current.Content = root;
40     }
41     root.Navigate(navType, propertie);
42
43     // 确保当前窗口处于活动状态
44     Window.Current.Activate();
45 }

Ok,至此代码部分已经完工,可以通过Cotrana语音指令启动我们的App了,这种启动方式为前台启动,下篇文章中将介绍Cortana调用App后台service是如何实现的。这里推荐一个UWP开发群:53078485 大家可以一起学习~~

时间: 2024-10-19 10:45:28

Win10/UWP开发—使用Cortana语音指令与App的前台交互的相关文章

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

上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比调用前台的App,调用后台任务有个有点就是App不用被启动即可为用户提供服务. 要想使用Cortana调用App后台任务,首先我们需要定义VCD文件,我们依旧使用上篇中的代码,让它支持Cortana调用后台任务. 创建后台任务 新增一个[Windows运行时组件]项目,暂时起名叫做:XiaoMiBa

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错. 为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时候是基于

Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

原文:Win10 UWP开发系列--开源控件库:UWPCommunityToolkit 在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在Github上:https://github.com/Microsoft/UWPCommunityToolkit 包括以下几个类库: 都可以很方便的从Nuget上安装. NuGet Package Name des

【Win10 应用开发】集成语音命令

原文:[Win10 应用开发]集成语音命令 记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语音命令集成相关的内容.虽然还是一脉相承,大的变化没有,不过Win10 sdk在语音命令定义文件中添加了新内容,而且现在不仅能在手机应用中加入语音集成,在面向PC和板子的应用中也能如愿,因为应用程序已经通用. 同理,在开始之前,老周仍然先给大家讲个故事. 话

Win10 UWP开发系列:实现Master/Detail布局

在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn997765.aspx 样式如下: 在微软官方的Sample里,有这种样式的代码示例,下载地址:https://github.com/Microsoft/Windows-univ

Win10 UWP开发实现Bing翻译

微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Windows通用应用平台,在Win 10 Mobile/Surface(Windows平板电脑)/PC/Xbox/HoloLens等平台上运行,uwp不同于传统pc上的exe应用也跟只适用于手机端的app有本质区别.它并不是为某一个终端而设计,而是可以在所有windows10设备上运行. 简单的说,u

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

PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么是凭据保险箱呢?简单的说就是开发者可以在用户输入完凭证(一般是用户名和密码),凭证有效的情况下将该凭证存储在叫做"凭据保险箱"里,该凭据保险箱里的用户凭据将会自动漫游到用户设备的Windows账户中并随时能够再次被App获取. 例如:有一个UWP的App运行在PC上,某用户在使用该App时

Win10 UWP 开发系列:使用SQLite

在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中,可以使用SQLite.本篇文章说一下如何在UWP中使用SQLite.因为SQLite是跨平台的,版本众多,我刚开始用的时候不知道要装哪个,什么WP8的.WP8.1的.Win RT的……简直摸不着头脑.希望这篇文章能让大家少走点弯路. 其实这篇文章写到一半就看到已经有大神写了这个:http://ww