如何将 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 的应用。

首先要明确两个名词 Voice command & Voice Command Definition 即 VCD文件,相信做过windows Phone 8.0 开发的朋友应该有所了解,通过注册VCD文件 Windows phone 8.0 的应用当中就可以实现 voice command 的功能,如果你不了解请先读一下我之前的文章(这里我就不在过多介绍 8.0 Voice command 的重复内容了),Windows Phone 8 语音 - Speech for Windows Phone 8 快速了解一下Windows Phone 开发语音功能的前期准备工作。

简单的说在 Windows Phone 8.0 voice command 功能比较简单,主要是通过 Voice Command Name 判断预制在VCD文件中的几个命令。

在 Windows Phone 8.1 应用中 Cortana 提供了更强的自然语言识别(Natural language recognition)

当然 VCD 文件的中的 grammars  也得到了扩充,并且区别两个OS版本的

http://schemas.microsoft.com/voicecommands/1.0 for Windows Phone 8.0 Voice Command and Cortana compatible.

http://schemas.microsoft.com/voicecommands/1.1 only for Widnows Phone 8.1 Cortnan.

详细内容请参考

Windows Phone 8.0:  Voice command element and attribute reference for Windows Phone 8

Windows Phone 8.1:  Voice command elements and attributes

通过 8.0 和 8.1 VCD 文件属性支持情况来看有一个最主要的区别在8.1 VCD中支持 PhraseTopic 这个属性。

文字说的太抽象了还是贴出代码给大家说说吧:

这里我主要强调说一下 ListenFor  结点和 PhraseTopic 结点。 注意在 Listenfor 结点中的中括号 {dictatedSearchTerms} 是对应的 PhraseTopic  结点中的 Label 属性。同时我们可以把 PhraseTopic 理解成任意内容。最后都可以从Cortana回传到我们的应用当中来。

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">
    <!-- The CommandSet Name is used to programmatically access the CommandSet -->
    <CommandSet xml:lang="zh-CN" Name="chineseCommands">
        <!-- The CommandPrefix provides an alternative to your full app name for invocation -->
        <CommandPrefix> 微软 文档 </CommandPrefix>
        <!-- The CommandSet Example appears in the global help alongside your app name -->
        <Example> 搜索 构造 函数 </Example>

        <Command Name="MSDNSearch">
            <!-- The Command example appears in the drill-down help page for your app -->
            <Example> 搜索 构造 函数‘ </Example>

            <!-- ListenFor elements provide ways to say the command, including references to
            {PhraseLists} and {PhraseTopics} as well as [optional] words -->
            <ListenFor> 查找 {dictatedSearchTerms} </ListenFor>
            <ListenFor> 搜 {dictatedSearchTerms} </ListenFor>
            <ListenFor> 搜索  {dictatedSearchTerms} </ListenFor>
            <ListenFor> 查 {dictatedSearchTerms} </ListenFor>
            <ListenFor> 找 {dictatedSearchTerms} </ListenFor>

          <!--Feedback provides the displayed and spoken text when your command is triggered -->
            <Feedback> 查找 MSDN... </Feedback>

            <!-- Navigate specifies the desired page or invocation destination for the Command-->
            <Navigate Target="MainPage.xaml" />
        </Command>

        <Command Name="MSDNNaturalLanguage">
            <Example> 我 想 去 Windows 手机 开发 中心 </Example>
            <ListenFor> {naturalLanguage} </ListenFor>
            <Feedback> 启动 MSDN... </Feedback>
            <Navigate Target="MainPage.xaml" />
        </Command>

        <PhraseTopic Label="dictatedSearchTerms" Scenario="Search">
            <Subject> MSDN </Subject>
        </PhraseTopic>

        <PhraseTopic Label="naturalLanguage" Scenario="Natural Language">
            <Subject> MSDN </Subject>
        </PhraseTopic>

    </CommandSet>
</VoiceCommands>

了解完新的VCD文件,在这里我提醒下大家,其实在Windows Phone 8.0的应用中也可以兼容 Cortana的功能的,在8.0的应用当中我们只需要判断一下操作系统的版本然后选择不同的VCD文件向系统注册即可。

首先我们需要把两个版本的VCD文件都存放到项目中来

其次在注册VCD文件的时候根据系统版本进行一下判断即可。

        /// <summary>
        /// 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.
        /// </summary>
        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 名称获取的。

        /// <summary>
        /// Takes specific action for a retrieved VoiceCommand name.
        /// </summary>
        /// <param name="voiceCommandName"> the command name triggered to activate the application </param>
        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 功能让小伙伴儿们调戏一番。

更多参考资料:

Quickstart: Voice commands (XAML)

Speech for Windows Phone 8

快速入门:语音命令 (XAML)

源码下载:

MSDN Voice Search for Windows Phone 8.1

如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )

时间: 2024-08-05 05:09:03

如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )的相关文章

Windows phone 8.1应用集成cortana语音命令

微软推出小娜已经有一段时间了,最近恰好在研究其用法,就随便写点记录一下自己的心得. 在研究时参考了@王博_Nick的博客:http://www.cnblogs.com/sonic1abc/p/3868729.html,在此先表示感谢. 闲话不多说,让我们开始吧. 要将语音命令功能添加到应用中需要三个步骤: 1. 创建语音命令定义 (VCD) 文件.这是一个 XML 文档,可以定义在激活应用时用户可说出以启动操作的所有语音命令. 首先向项目中添加一个新的VCD文件, 创建的新文件如下: 以下对各个

WAMP Server助你在Windows上快速搭建PHP集成环境

WAMP Server助你在Windows上快速搭建PHP集成环境 原文地址 我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分论坛都是PHP的哦.据我所知很多同学都想要试着学习一下PHP,无奈要在Windows下安装搭建好一个PHP环境来学习对于菜鸟同学来说繁琐程度足以让一半以上的人放弃,毕竟 Apache+PHP+MySQL 这3个程序配置起来比较麻烦,对于新手来说,要弄清楚那些配置还真是云里雾里.所以傻瓜式整合型的WA

windows linux—unix 跨平台通信集成控制系统----文件搜索

跨平台的网络通信,跟设备的集成控制,牵扯到在各种平台下的文件搜索问题,windows下面的已经有了. 地址如下: http://blog.csdn.net/wangyaninglm/article/details/8668132 这篇文章主要介绍一下linux下面的文件搜索实现: Filesearch.h // // Filesearch.h // // // Created by mac mac on 13-4-28. // Copyright (c) 2013年 __MyCompanyNam

高仿QQ源码下载 (android前端+JAVA后台+spark&lt;windows版聊天&gt;)方便集成到自己系统

 A openfire (XMPP+开源源码); B android前端源码(仿QQ高大上UI); C JAVA后台源码(UI高大上HTML5);  Dspark(windows版);  系统主要实现为:JAVA后台(springmvc+mybaits)+openfire(xmpp推送)+android(asmark+ActiveAndroid+async-http+universal-image-loader)+spark(windows版);  android前端 1.集成Activie

Jenkins在Windows系统dotnet平台持续集成

        之前写过一篇文章是在CentOS上构建.net自动化编译环境, 今天这篇是针对于Windows平台的环境.        Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作, Jenkins是由Sun的前员工开发的,它的根基是Java,但也可以用在非Java的项目里,比如PHP.Ruby on Rails..NET.持续集成相关的工具有很多.它提供了Web界面,用户

几款Windows平台下的PHP集成开发环境

WAMP 下载地址:http://www.onlinedown.net/soft/82112.htm Zend Core Zend Core 产品由PHP工具公司 Zend Technologies 发行, Zend Core 是Zend 的认证分发版本,其2.5版是专门为Windows Server 2008 开发的产品, 它能有效利用微软的 FastCGI 特性,为PHP的解析工作提供更高的可靠性和性能. Zend Core 也可用于 Windows 2003 IIS 6,采用图形化的安装,

一步步部署基于Windows系统的Jenkins持续集成环境

如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一些问题,而大多数教程文档都是基于Mac或是Linux平台.为此很是头疼,经过一番摸索,终于走通了Windows平台下的一条路. 本CI系统流程:Dev提交代码,并merge到master分支-->Jenkns获取最新代码,开始构建(解析git触发响应,build solution,run automation,get result都在此步内完成)

windows下msysgit+copssh出现bash: git-upload-pack: command not found的问题

bash: git-upload-pack: command not found 从字面意思看,是bash程序找不到git-upload-pack命令所致. bash是CopSSH的一个exe,在ICW\bin目录下,bash找不到git-upload-pack,那么bash是依据什么去找命令的呢? 简单看下ICW目录,即可知道bash的查找一句是ICW\etc\profile文件中的path变量决定,因此把git-upload-pack所在路径追加到path变量即可. export PATH=

Python Windows环境下安装Python集成开发环境 学习之路(一)

一.安装下载安装 Python https://www.python.org/ 全部下一步,直接Finish  PyCharm http://www.jetbrains.com/pycharm/ 全部下一步,直接Finish