zoukankan      html  css  js  c++  java
  • 如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command

    随着 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)

    Cortana1

    当然 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.

    Cortana2

    详细内容请参考

    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 这个属性。

    image

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

    这里我主要强调说一下 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文件都存放到项目中来

    image

    其次在注册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);
                }
            }

    image

    整个过程就这么简单,心动不如行动,赶快把你的应用加入Cortana 功能让小伙伴儿们调戏一番。

    更多参考资料:

    Quickstart: Voice commands (XAML)

    Speech for Windows Phone 8

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

    源码下载:

    MSDN Voice Search for Windows Phone 8.1

  • 相关阅读:
    SqlServer存储过程函数加解密[极有用]
    BMDThread控件动态创建多线程示例
    cxGrid右键自定义菜单
    越狱中Michael的一种疾病
    静态链表
    单行编辑框SelectText()
    开机得按F1
    jquery调用页面后台方法‏
    .net调用存储过程详解
    javascript兼容各种浏览器的异步请求
  • 原文地址:https://www.cnblogs.com/sonic1abc/p/3868729.html
Copyright © 2011-2022 走看看