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通用应用开发中,有关语 ...
随机推荐
- Progress Control with Text
原文链接:http://www.codeproject.com/Articles/80/Progress-Control-with-Text 重写的Progress 包括,设置bar前景背景颜色,设置 ...
- 大数据公益课堂成就你高薪之梦,30W,50W,100W...
从之前的知道“大数据”这词,到2013年正式开始了解大数据领域,再到2014年深入研究大数据相关的领域,到现在逐渐影响周围的同学.朋友和家人.大数据技术将给我们带来的远不止我们想到的这些.曾经我身边的 ...
- shell的查找与替换
shell中做查找,grep是注定逃不开的. cat file | grep austin 就是在文档中查找Austin所在行. grep和正则表达式匹配之后,查找功能变得异常强大. 这个时候,要保证 ...
- statement和preparedstatement用法区别
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 ...
- oc-基本语法
一.第一个oc程序 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSLog(@& ...
- (四) openwrt单个ipk编译过程
Tags : Makefile 本周是成胖子每周一博的第五周. 更好的阅读体验,请点击这里 [TOC] 前言 前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单 ...
- [转]Worksheet.Change Event (Excel)
本文转自:https://msdn.microsoft.com/en-us/library/office/ff839775.aspx#AboutContributor Example The fo ...
- [转]ionic项目之上传下载数据
本文转自:http://blog.csdn.net/superjunjin/article/details/44158567 一,首先是上传数据 记得在angularjs的controller中注入$ ...
- socket通信入门
以一个基本的python程序为例解释 源代码如下: #!/usr/bin/env python #指出代码用什么程序去运行它.首先会到env设置里查找python的安装路径,再调用对应路径下的解释器 ...
- UESTC 878 温泉旅馆 --性质+枚举
设FA为A的牌中数字异或和,FB为B的. 则有性质: ans = (所有的(A&B=0)个数 + (FA=FB且A&B=0)的个数)/2.即所有的FA>FB的个数(除2是因为这里 ...