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文件示例:
<?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[];
Type navType = null;
string propertie = null;
//判断用户使用的是哪种语音指令
switch (cmdName)
{
case "OpenMainPage":
navType = typeof(MainPage);
break;
case "QueryFlight":
navType = typeof(QueryPage);
//获取语音指令的参数
propertie = res.SemanticInterpretation.Properties["City"][];
break;
case "NavToPage":
//获取语音指令的参数
propertie = res.SemanticInterpretation.Properties["Destination"][]; //根据 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是如何实现的。这里推荐一个UWP开发群:53078485 大家可以一起学习~~
Win10/UWP开发—使用Cortana语音指令与App的前台交互的更多相关文章
- Win10/UWP开发—使用Cortana语音指令启动前台App
这两天进群(53078485)找大咖的童鞋比较多,只是大咖比较忙,目前Demo还没有要到,这里先给大家转载一篇Aran大咖的博客学习下,以下是原文: Win10开发中最具有系统特色的功能点绝对少不了集 ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...
- Win10/UWP开发—凭据保险箱PasswordVault
PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么 ...
- Win10 UWP 开发系列:使用SQLite
在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...
- Win10/UWP开发-Ink墨迹书写
在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记. InkCanvas控件使用很简单,从 ...
- 【Win10 应用开发】集成语音命令
记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语 ...
随机推荐
- 二:基础概述netty
如果不了解netty的,可以百度下,netty社区现在也比较活跃. 现在所谓的大数据,flume,storm等底层都是netty. netty的性能模型: io模型---->异步非阻塞io ...
- Windows Store App 网络通信 HttpWebRequest
如果希望更好地控制HTTP请求,可以使用System.Net类库中的HttpWebRequest类,该类对HTTP协议进行了完整的封装,并且提供了很多对HTTP协议中的 Header.Content和 ...
- PHP实现微信公众平台开发 全套视频资源下载
好久没有在博客园更新东西了,今天给大家分享一份比较不错的视频学习资源吧. 主要是关于PHP实现微信公众平台开发, 不知道大家对于微信平台的开发有多少了解,那么今天就从基础开始吧,资源目录如下(PS ...
- 对git的认识
对git这个词我听过但不了解,更谈不了认识.只能咨询百度了. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮 ...
- algorithm -- 选择排序
选择排序是<导论>第一章课后习题,仿照插入排序,再次运用循环不变式来证明下算法的正确性,C++ 源码: // 交换函数 void swap( int& a, int& b ...
- Pythonn 内置函数
abs 绝对值 n = abs(-1) print(n) ========================= /usr/bin/python3.5 /home/liangml/pythonscript ...
- storm启动过程之源码分析
TopologyMaster: 处理拓扑的一些基本信息和工作,比如更新心跳信息,拓扑指标信息更新等 NimbusServer: ** * * NimbusServer work flow: 1. ...
- OC基础--对象做参数在方法间传递
剧情描述: 美国大兵抗把汉阳造 拿着5个弹夹(每个弹夹5发子弹) 带着弟兄们干架 子弹打完了就求救 类: 士兵: 属性: 姓名(_name) 身高(_height) 体重(_weight) 行为: 开 ...
- Making the Newsfeed web part available outside of My Sites in SharePoint 2013 分类: Sharepoint 2015-07-07 19:29 4人阅读 评论(0) 收藏
The Newsfeed is a key piece in SP2013's approach to social computing. It appears on the landing page ...
- USB协议规范学习(一)
什么是USB OHCI规范? OHCI(Open HCI)是目前使用比较广泛的三种USB主机控制器规范之一.USB体系结构是由四个主要部分组成:客户软件/USB驱动,主机控制器驱动(HCD),主机控制 ...