这两天进群(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文件示例:
1 "1.0" encoding="utf-8"?> 2 3 4 5 6 8 9 19 20 21"http://schemas.microsoft.com/voicecommands/1.2"> 22 "zh-cn" Name="set"> 23 61 62 63 64小秘 24打开主页 或 查询航班 25 26"OpenMainPage"> 27 32 33打开主页 28打开主页 29正在启动航班助手…… 3031 "QueryFlight"> 34 40 41查询去西雅图的航班 35[搜索]去{City}[的]航班 36[查询]去{City}[的]航班 37正在查询去{City}的航班 3839 "NavToPage"> 42 47 48 49 51跳转到某个界面 43[跳转]到{Destination}界面 44正在跳转到{Destination}界面 4546 "Destination"> 52 55 56 57- 设置
53- 关于
54"City" Scenario="Natural Language"> 58 60City/State 59
上面例子中我们定义了三种Command指令,分别是"打开主页","查询去某城市的航班","跳转到某个界面"。
ListenFor元素可以存在多个,其中认为可忽略的词可以用[]符号进行修饰。
PhraseList用来定义一组语音字符,指定相应规定的字符,用来消除歧义, 使用 PhraseList 限制识别适用于一组相对较小的单词。当单词组过大(例如数百个单词)或者根本不应被限制时,要使用 PhraseTopic 元素和 Subject 元素来优化语音识别结果的相关性,从而增强可扩展性。
PhraseTopic可以提高识别率,内部属性Subject可指定该关键字类型,比如 城市名 姓名 地址 等类型
安装VCD命令文件
我们的App安装后必须运行一次才能安装VCD指令集,我们可以在App的OnLaunched中调用下面方法去注册并激活语音指令集,代码如下:
1 ///2 /// 注册语音指令 3 /// 4 private async Task InsertVoiceCommands() 5 { 6 await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync( 7 await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///VoiceCommandsFile.xml"))); 8 }
处理语音指令
在VCD程序集安装正确的情况下,Cortana的帮助界面就会出现我们的App的语音指令集的调用说明:
通过相应的语音指令,Cortana就会启动我们的App,我们需要在App中重写OnActivated事件,判断用户使用的是哪个语音指令,并实现相应的逻辑,代码如下:
1 protected override void OnActivated(IActivatedEventArgs args) 2 { 3 base.OnActivated(args); 4 // 如果程序不是因为语音命令而激活的,就不处理 5 if (args.Kind != ActivationKind.VoiceCommand) return; 6 7 //将参数转为语音指令事件对象 8 var vcargs = (VoiceCommandActivatedEventArgs)args; 9 // 分析被识别的命令 10 var res = vcargs.Result; 11 // 获取被识别的命令的名字 12 var cmdName = res.RulePath[0]; 13 Type navType = null; 14 string propertie = null; 15 //判断用户使用的是哪种语音指令 16 switch (cmdName) 17 { 18 case "OpenMainPage": 19 navType = typeof(MainPage); 20 break; 21 case "QueryFlight": 22 navType = typeof(QueryPage); 23 //获取语音指令的参数 24 propertie = res.SemanticInterpretation.Properties["City"][0]; 25 break; 26 case "NavToPage": 27 //获取语音指令的参数 28 propertie = res.SemanticInterpretation.Properties["Destination"][0]; 29 30 //根据 propertie 参数决定跳转到指定界面,这里就不判断了 31 navType = typeof(QueryPage); 32 break; 33 } 34 //获取页面引用 35 var root = Window.Current.Content as Frame; 36 if (root == null) 37 { 38 root = new Frame(); 39 Window.Current.Content = root; 40 } 41 root.Navigate(navType, propertie); 42 43 // 确保当前窗口处于活动状态 44 Window.Current.Activate(); 45 }
Ok,至此代码部分已经完工,可以通过Cotrana语音指令启动我们的App了,这种启动方式为前台启动,下篇文章中将介绍Cortana调用App后台service是如何实现的。