Win10/UWP开发—使用Cortana语音指令启动前台App
这两天进群(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. wp8是v1.-->
<!--等多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是如何实现的。
Win10/UWP开发—使用Cortana语音指令启动前台App的更多相关文章
- Win10/UWP开发—使用Cortana语音指令与App的前台交互
Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...
- 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通用应用开发中,有关语 ...
随机推荐
- 【MySQL】MySQL忘记root密码解决方案
转眼间从实习到现在已经快两年了.两年的工作做遇到过很多很多的拦路虎,大部分也通过搜索引擎找到了解决的方案.奈何大脑不是硬盘,偶尔有的问题第二次遇到还是有点抓蒙...所以决定把这些东西记录在博客上.这样 ...
- 比较全面的MySQL优化参考(上下篇)
转自:http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨 ...
- 一·创建Linux服务器(基于阿里云)
本系统是基于阿里云服务器,购买请前往https://www.aliyun.com/?spm=5176.8142029.388261.1.taXish ,由于经济能力的限制,本人购买的是最低配置如下 其 ...
- 快速熟悉Zbrush中的四种裁切笔刷
ZBrush 4.0R4完善了裁切的功能.捷就可以把模型想要隐藏的地方用选择裁切的方法隐藏掉,其中ZBrush在®4.0R4软件中提供了4中裁切笔刷,分别为ClipCircle笔刷.ClipCircl ...
- AD批量创建用户
实验环境:Windows Server 2008R 2 由于测试需要,需要创建数百个用户,手动创建当然不可取,此时需要批量创建,操作记录如下 1 首先将要批量创建的人员信息导入到一个csv文件中,表中 ...
- GetComponent
GetComponent 的几种写法: 1.AutoRotation cmp1=(AutoRotation) GetComponent(typeof(AutoRotation)); 2.AutoRot ...
- Blend Tree Type
1D 只有一个参数,用于控制状态之间的切换 2D Simple Directional 2D Simple Directional :具有方向性的动画片段,同一方向上最好不要有多个动画片段 2D ...
- [本人开发的游戏] Discuz网页动物园插件1.0Beta发布!让积分流动起来!
插件发布 插件名称: DZ网页动物园插件 插件来源: 原创插件 适用版本: Discuz! X3 语言编码: GBK简体 UTF8简体 BIG5繁体 UTF8繁体 最后更新时间: 2014- ...
- Iron man
儿子的手办在近期又新增一套钢铁侠,来自于淘宝的玩具推荐,这个推荐也得益于小美和他平日在淘宝商城里的各种玩具浏览,充分体现了现阶段对复仇者联盟成员的喜爱. 一套共六个,有着不同的颜色,但造型基本一致带L ...
- C语言 文件操作9--fgetc()和fputc()
//fgetc()和fputc() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...