这两天进群(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的更多相关文章

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

    Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...

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

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

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

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

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

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  5. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

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

    PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么 ...

  7. Win10 UWP 开发系列:使用SQLite

    在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...

  8. Win10/UWP开发-Ink墨迹书写

    在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记. InkCanvas控件使用很简单,从 ...

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

    记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语 ...

随机推荐

  1. Python基本数据结构-集合-创建/与其他类型比较

  2. springMVC请求流程详解

    SpringMVC框架是一个基于请求驱动的Web框架,并且使用了'前端控制器'模型来进行设计,再根据'请求映射规则'分发给相应的页面控制器进行处理. (一)整体流程 具体步骤: 1.  首先用户发送请 ...

  3. jetbrains DataGrip 导出Excel

    之前一直不知道如何通过DataGrip 导出Excel,导致每次都是用Navcat来做导出,今天研究了下,原来用TSV格式就能复制到Excel表格,具体步骤如下: ------------------ ...

  4. Hibernate学习笔记整理系列-------一、Hibernate简介

    Hibernate的官网:http://hibernate.org/ 1.1 Hibernate框架的作用 Hibernate框架是一个数据访问框架(也叫持久层框架,可将实体对象变成持久对象).通过H ...

  5. matlab里.*和*的区别

    *:矩阵相乘 (cross) .*:矩阵你元素一对一相乘 (dot) 例子: >> a=[2 3];>> b=[4 5];>> a*b' ans = 23 > ...

  6. C++中对象初始化

    在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...

  7. 2016开发一个app需要多少钱?app开发需要哪些成本-app开发问题汇总-广州达到信息

    作为一个APP开发从业者,被外行的朋友们问及最多的问题是,"做一个网站需要多少钱?"或者"开发一个APP需要多少钱?".作为开发过完整网站项目和手机APP的人, ...

  8. 搭建appium的android环境

    首先需要准备: 1.jdk(步骤不再啰嗦) 2.android SDK,下载地址:http://developer.android.com/sdk/index.html,下载sdk tools,可能需 ...

  9. 基于对话框的MFC应用程序基本结构

    新建一个基于对话框的MFC应用程序,假设命名为 Test:则该应用程序在刚创建的时候,有4个非常重要的文件和3个类: 4个非常重要的文件 1.Test.h 2.Test.cpp (应用程序类头文件) ...

  10. jquery实现整屏翻屏效果:jquery.mousewheel(一)

    实现整屏上下翻效果:需加载的js <script type="text/javascript" src="js/jquery-1.8.3.min.js"& ...