如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )
随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布,相信有很多用户或开发者都在调戏 Windows Phone 的语音私人助理 Cortana 吧,在世界杯的时候我亲测 Cortana 预测德国和阿根廷的比赛很准的。(题外话扯远了),可是作为开发者我们怎么将Cortana集成到应用中呢,今天我用一点时间给大家介绍一下如何使用 voice command 集成 Windows Phone 8.1 的应用。
简单的说在 Windows Phone 8.0 voice command 功能比较简单,主要是通过 Voice Command Name 判断预制在VCD文件中的几个命令。
在 Windows Phone 8.1 应用中 Cortana 提供了更强的自然语言识别(Natural language recognition)
当然 VCD 文件的中的 grammars 也得到了扩充,并且区别两个OS版本的
详细内容请参考
通过 8.0 和 8.1 VCD 文件属性支持情况来看有一个最主要的区别在8.1 VCD中支持 PhraseTopic 这个属性。
文字说的太抽象了还是贴出代码给大家说说吧:
这里我主要强调说一下 ListenFor 结点和 PhraseTopic 结点。 注意在 Listenfor 结点中的中括号 {dictatedSearchTerms} 是对应的 PhraseTopic 结点中的 Label 属性。同时我们可以把 PhraseTopic 理解成任意内容。最后都可以从Cortana回传到我们的应用当中来。
了解完新的VCD文件,在这里我提醒下大家,其实在Windows Phone 8.0的应用中也可以兼容 Cortana的功能的,在8.0的应用当中我们只需要判断一下操作系统的版本然后选择不同的VCD文件向系统注册即可。
首先我们需要把两个版本的VCD文件都存放到项目中来
其次在注册VCD文件的时候根据系统版本进行一下判断即可。
/// /// Installs the Voice Command Definition (VCD) file associated with the application. /// Based on OS version, installs a separate document based on version 1.0 of the schema or version 1.1. /// private async void InstallVoiceCommands() { const string wp80vcdPath = "ms-appx:///VoiceCommandDefinition_8.0.xml"; const string wp81vcdPath = "ms-appx:///VoiceCommandDefinition_8.1.xml"; const string chineseWp80vcdPath = "ms-appx:///ChineseVoiceCommandDefinition_8.0.xml"; const string chineseWp81vcdPath = "ms-appx:///ChineseVoiceCommandDefinition_8.1.xml"; try { bool using81orAbove = ((Environment.OSVersion.Version.Major >= 8) && (Environment.OSVersion.Version.Minor >= 10)); string vcdPath = using81orAbove ? wp81vcdPath : wp80vcdPath; if (InstalledSpeechRecognizers.Default.Language.Equals("zh-CN", StringComparison.InvariantCultureIgnoreCase)) { vcdPath = using81orAbove ? chineseWp81vcdPath : chineseWp80vcdPath; } Uri vcdUri = new Uri(vcdPath); await VoiceCommandService.InstallCommandSetsFromFileAsync(vcdUri); } catch (Exception vcdEx) { Dispatcher.BeginInvoke(() => { MessageBox.Show(String.Format( AppResources.VoiceCommandInstallErrorTemplate, vcdEx.HResult, vcdEx.Message)); }); } }
最后在应用当中获取用户的语音输入方法,注意这里也是需要通过 PhraseTopic 结点的 Label 名称获取的。
/// /// Takes specific action for a retrieved VoiceCommand name. /// /// the command name triggered to activate the application private void HandleVoiceCommand(string voiceCommandName) { // Voice Commands can be typed into Cortana; when this happens, "voiceCommandMode" is populated with the // "textInput" value. In these cases, we'll want to behave a little differently by not speaking back. bool typedVoiceCommand = (NavigationContext.QueryString.ContainsKey("commandMode") && (NavigationContext.QueryString["commandMode"] == "text")); string phraseTopicContents = null; bool doSearch = false; switch (voiceCommandName) { case "MSDNNaturalLanguage": if (NavigationContext.QueryString.TryGetValue("naturalLanguage", out phraseTopicContents) && !String.IsNullOrEmpty(phraseTopicContents)) { // We'll try to process the input as a natural language query; if we're successful, we won't // fall back into searching, since the query will have already been handled. doSearch = TryHandleNlQuery(phraseTopicContents, typedVoiceCommand); } break; case "MSDNSearch": // The user explicitly asked to search, so we'll attempt to retrieve the query. NavigationContext.QueryString.TryGetValue("dictatedSearchTerms", out phraseTopicContents); doSearch = true; break; } if (doSearch) { HandleSearchQuery(phraseTopicContents, typedVoiceCommand); } }
整个过程就这么简单,心动不如行动,赶快把你的应用加入Cortana 功能让小伙伴儿们调戏一番。
更多参考资料:
源码-:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~