[UWP开发] Cortana启动应用

来源:互联网 发布:中企动力垃圾 网络何 编辑:程序博客网 时间:2024/05/27 20:15

适用于win10应用开发。

使用Cortana可以快速启动应用,甚至可以根据说出的指令,快速到达应用内的某个页面或启动某项功能。如通过Cortana说出,“微博 搜索计算机”就可以声控打开并搜索有关计算机的微博内容。
在win10手机中,启动Cortana,点击左上角菜单,帮助。可以查看Cortana支持应用列表。
列表
点击后可以查看详细的指令列表,以微信为例。
列表
可以看出部分指令是完整的语句(如打开话费充值),而部分指令包含可选择部分(如找{某人})


  • 编写VCD文件
    供Cortana使用的指令,定义在vcd文件中。vcd文件是xml格式文件。
    在VS中新建并添加xml格式文件,文件名无要求,后缀为.xml。
    第一行为:
<?xml version="1.0" encoding="utf-8"?>

xml根节点为VoiceCommands节点,里面指出vcd文件版本。其中包含数个CommandSet节点,每个CommandSet中定义一种语言的指令列表,每种程序支持的语言要单独定义。

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">  <CommandSet xml:lang="zh-cn" Name="2048CommandSet_zh-cn">    <CommandPrefix> 2048 </CommandPrefix>    <Example> 快乐游戏 </Example>     </CommandSet></VoiceCommands>

xml:lang=”zh-cn” 表示语言为简体中文。Name是标记,在程序中引用和动态修改vcd文件时有用。
CommandSet以下有CommandPrefix节点,意义是应用名称的简写或别名,用户说出CommandPrefix中的名称,即可在Cortana中调起该应用。
Example节点,按照官方文档说是给一个可用功能的示例。但现在多用于展示应用的特性与口号。
CommandPrefix与Example中的内容,如文章开头的第一幅图,信息在其中显示。可以看出微信的CommandPrefix是MicroMsg,Example是微信,是一个生活方式。
在最新的1.2版vcd中,CommandPrefix可以换为AppName,AppName是新的用法,表示的意义相同。

详细的口语指令,每一条指令包含在一个Command节点下。Command节点为CommandSet的子节点。
一个Command节点的例子如下所示:

<Command Name="Start">  <Example> 新游戏 </Example>  <ListenFor> [开始][启动]新游戏 </ListenFor>  <Feedback> 正在开始新游戏 </Feedback>  <Navigate/></Command>

其中Name=”Start”表示指令名称,在应用后台代码中进行处理。
Example,在文章开头的第二幅图中的指令列表中显示,告诉用户可以怎样说。
ListenFor节点可以有多个,当Cortana听到ListenFor中的文字内容后,就会执行本条指令。中括号包含的部分表示可选部分。在上例中,当听到“新游戏”或“开始新游戏“或”启动新游戏“甚至是”开始启动新游戏“时,都会执行这一条指令,但是”启动开始新游戏“不会被执行,因为顺序不对。
FeedBack表示当用户说了本条指令后,Cortana在执行指令时,对用户的反馈。在上例中,当用户说出“新游戏”后,Cortana执行指令,同时告诉用户“正在开始新游戏”。
Navigate表示执行指令后,打开应用跳转到的Page名称,如“MainPage.xaml”。也可以不写,但需要在App.cs文件中处理相应的事件。

对于那些有可选择部分的指令,给一个例子:

<Command Name="Load">  <Example> 读取存档 1 </Example>  <ListenFor> [读取][使用]存档 {SaveNum} </ListenFor>  <Feedback> 使用存档 {SaveNum} 进行游戏 </Feedback>  <Navigate/></Command><PhraseList Label="SaveNum">  <Item>1</Item>  <Item>2</Item>  <Item>3</Item>  <Item>4</Item>  <Item>5</Item></PhraseList>   

其中ListenFor中{SaveNum}表示使用label {SaveNum}中的Item项的内容进行替换。此处只有说存档1~5,Cortana才会相应,当说出存档6时,Cortana不会响应。如Item项的内容不确定,如想搜索某个地点,此处直接用{*},表示此处可以用任意语句匹配。

其中的PhraseList,可以替换为PhraseTopic,用来表示指令目的和类别范围,如下所示:

 <PhraseTopic Label="SearchTerms" Scenario="Search">    <Subject> City/State </Subject> </PhraseTopic>

Scenario用来更精确表示语句应用的场景,使得语句能够被更精确识别。Scenario可以为:”Natural Language”, “Search”, “Short Message”, “Dictation”, “Commands”, “Form Filling”。
Subjectfont 可以有多个,用来表示该语句的主题,是一个范围,实际操作时会在该范围内进行匹配。可以为 “Addresses”, “City/State”, “Person Names”, “Movies”, “Music”, “Phone Number”。


  • 处理语音事件
    首先需要在代码中应用vcd文件,在App.cs的OnLaunched方法中添加如下语句。
try{    var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Command.xml"));    await Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(storageFile);}catch (Exception ex){    System.Diagnostics.Debug.WriteLine("Installing Voice Commands Failed: " + ex.ToString());}

当启动一次应用后,就会将vcd文件进行应用,之后就可以使用Cortana快速启动应用。
通过Cortana启动的应用,不会调用OnLaunched方法,而是使用OnActivated方法。需要在程序中重写此方法。

protected async override void OnActivated(IActivatedEventArgs e){    //如果是被语音指令激活    if (e.Kind == Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand)    {        var commandArgs = e as Windows.ApplicationModel.Activation.VoiceCommandActivatedEventArgs;        Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = commandArgs.Result;        //获取语音指令的Name        string voiceCommandName = speechRecognitionResult.RulePath[0];        if (voiceCommandName == "Load")        {            // 获取匹配到的可选部分,标签为SaveNum的指令语句内容            string item = speechRecognitionResult.SemanticInterpretation.Properties["SaveNum"][0];            //后续指令处理        }    }}

需要注意的是,如果vcd文件中某条指令的Navigate项没有写明跳转的页面,那么会调用App.cs中的OnActivated方法,在其中进行处理。而此时OnLaunched方法是不会被执行的,其中的一些应用初始化操作,需要自行复制到OnActivated方法中。


测试环境Windows 10 UWP

1 0
原创粉丝点击