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状态进行监控
1.mysqladmin 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如 ...
- oracle-删除归档日志
rman target user/password; DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
- PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求
使用了笨重fsockopen()方法后,我们开始在PHP函数库里寻找更简单的方式来进行POST请求,这时,我们发现了PHP的文件函数也具有与远程URL交互的功能. 最简单的是fopen()和fread ...
- linux 下安装nodejs,CentOS 6.5 系统
本文采用nodejs 通过源码编译安装方式 编译需要gcc-c++编译器和openssl-devel库的支持,如果没有需要先安装. 在centos下可以先执行:yum install gcc-c++ ...
- gdb调试常用命令
gdb 调试常用命令 gcc -g mian.c -o main.out -o (定制生成的可执行文件的名称,缺省时为a.out) -g 使gdb可调试,在编译的时候,产生调试信息 gdb main. ...
- 数据结构--AC自动机--hdu 2896
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Sublime Text 2 (for OS X )配置成可以运行基于python3解释器的 .py文件
Mac自带的python 其version是python 2.7 官网下的Sublime Text 2部署好了以后默认也是 为了使ST2 可以在command+B时可以运行基于python3的.py, ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- runc的detach, console, tty等相关问题
runc 端解析: 1. runc/utils_linux.go func (r *runner) run(config *specs.Process) (int , error) 在该函数中第一次对 ...
- 分享十个JavaScript在线调试工具
测试Javascript可能是网页开发中最让人忧伤的工作.这里我找一些比较好的工具来帮助大家进行测试工作.这10款是我精选的基于浏览器的JavaScript在线调试工具,希望你们对你们有用. 1.Op ...