Win10/UWP開發—使用Cortana語音指令與App的前臺交互

Win10開發中最具備系統特點的功能點絕對少不了集成Cortana語音指令,其實Cortana語音指令在之前的wp8/8.1時就已經存在了,發展到了Win10,Cortana最明顯的進步就是開始支持調用App 的App Service。固然App Service也是Win10 App的新特性之一,經過調用App Service就能夠在App沒有前臺運行的時候爲Cortana提供數據交互。這樣一來Cortana就具備了兩種App交互方式:windows

  • Cortana語音指令與前臺App的交互
  • Cortana語音指令與後臺服務的交互

今天咱們之前先看看Cortana與前臺App的交互,與前臺App的交互容許Cortana經過特定的語音指令來喚起App,並傳遞給App用戶想要的是怎樣的信息,App被喚起後經過用戶的語音指令參數就能夠判斷接下來要作怎樣的處理。app

下面咱們作一個App來集成Cortana,經過語音指令來啓動App並根據參數來響應不一樣的用戶請求,先看效果圖:async

Ok 開工!ide

建立VCD語音指令文件

在項目中添加一個xml文件並輸入文件名,我這裏建立的爲VoiceCommandsFile.xml學習

編輯VCD文件

針對App的實際狀況,能夠建立不一樣語言的指令集CommandSet,優化

Win10使用的是V1.2的語音指令模板,具體的模板使用詳情可訪問:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn706593.aspxspa

每一個VCD文件中聲明的Command都必須包含如下信息:code

  • AppName元素,應用程序用於Cortana中的語音識別的名稱
  • Example元素,告訴用戶該App所支持的語音指令的描述
  • ListenFor 元素,監聽並識別用戶的指令,每一個Command都至少有一個該元素
  • Feedback 元素,指令識別成功後的反饋
  • Navigate 元素,聲明語音指令將在前臺啓動應用。和VoiceCommandService互斥
  • VoiceCommandService 元素,聲明語音指令將啓動後臺應用

VCD文件示例:xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2  
 3 <!--UWP使用的是語音命令v1.2模板  wp8.1是v1.1 wp8是v1.0-->
 4 <!--等多V1.2模板詳情請訪問:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn706593.aspx-->
 5  
 6 <!--能夠建立多個 CommandSet 元素,每一個都帶有不一樣的 xml:lang 屬性以使你的應用可用於不一樣的市場。
 7     例如,用於美國的應用可能有一個英語版本的 CommandSet 和一個西班牙語版本的 CommandSet-->
 8  
 9 <!--
10       -每一個CommandSet表明一種語言的語音指令,
11       -每一個Command表明一種指定情景下的語音指令,每一個CommandSet能夠包含多種語音使用情景
12       -Example 會出如今Cortana -> App 幫助界面中,提示用戶能夠怎麼使用該語音場景
13       -ListenFor 表示Cortana要監聽的語音語法,每一個命令都須要具備至少一個 ListenFor 元素
14       -Feedback 指識別語音命令成功時,Cortana將顯示該元素內的內容
15       -Navigate 用於指示語音命令將在前臺啓動應用,若是語音命令改在後臺啓動應用,則指定VoiceCommandService
16       -VoiceCommandService 標籤表示Cortana要啓用後臺應用服務來處理用戶需求,
17           例: <VoiceCommandService Target="BusQueryService"/> Target填寫後臺應用服務的名稱
18         -->
19  
20  
21 <VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
22   <CommandSet xml:lang="zh-cn" Name="set">
23     <AppName>小祕</AppName>
24     <Example> 打開主頁 或 查詢航班 </Example>
25  
26     <Command Name="OpenMainPage">
27       <Example>打開主頁</Example>
28       <ListenFor>打開主頁</ListenFor>
29       <Feedback>正在啓動航班助手……</Feedback>
30       <Navigate  />
31     </Command>
32  
33     <Command Name="QueryFlight">
34       <Example> 查詢去西雅圖的航班  </Example>
35       <ListenFor >[搜索]去{City}[的]航班</ListenFor>
36       <ListenFor >[查詢]去{City}[的]航班</ListenFor>
37       <Feedback> 正在查詢去{City}的航班 </Feedback>
38       <Navigate />
39     </Command>
40  
41     <Command Name="NavToPage">
42       <Example> 跳轉到某個界面  </Example>
43       <ListenFor >[跳轉]到{Destination}界面</ListenFor>
44       <Feedback> 正在跳轉到{Destination}界面 </Feedback>
45       <Navigate />
46     </Command>
47  
48     <!--PhraseList用來定義一組語音字符,指定相應規定的字符,用來消除歧義-->
49     <!--使用 PhraseList 限制識別適用於一組相對較小的單詞。當單詞組過大(例如數百個單詞)或者根本不該被限制時,
50         請使用 PhraseTopic 元素和 Subject 元素來優化語音識別結果的相關性,從而加強可擴展性。-->
51     <PhraseList Label="Destination">
52       <Item>設置</Item>
53       <Item>關於</Item>
54     </PhraseList>
55  
56     <!--能夠提升識別率,內部屬性Subject可指定該關鍵字類型,好比 城市名 姓名  地址 等類型-->
57     <PhraseTopic Label="City" Scenario="Natural Language">
58       <Subject>City/State</Subject>
59     </PhraseTopic>
60   </CommandSet>
61  
62   <!-- 其餘語言的 CommandSet -->
63  
64 </VoiceCommands>

上面例子中咱們定義了三種Command指令,分別是"打開主頁","查詢去某城市的航班","跳轉到某個界面"。對象

ListenFor元素能夠存在多個,其中認爲可忽略的詞能夠用[]符號進行修飾。

PhraseList用來定義一組語音字符,指定相應規定的字符,用來消除歧義, 使用 PhraseList 限制識別適用於一組相對較小的單詞。當單詞組過大(例如數百個單詞)或者根本不該被限制時,要使用 PhraseTopic 元素和 Subject 元素來優化語音識別結果的相關性,從而加強可擴展性。

PhraseTopic能夠提升識別率,內部屬性Subject可指定該關鍵字類型,好比 城市名 姓名 地址 等類型

安裝VCD命令文件

咱們的App安裝後必須運行一次才能安裝VCD指令集,咱們能夠在App的OnLaunched中調用下面方法去註冊並激活語音指令集,代碼以下:

1 /// <summary>
2 /// 註冊語音指令
3 /// </summary>
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是如何實現的。這裏推薦一個UWP開發羣:53078485 你們能夠一塊兒學習~~

相關文章
相關標籤/搜索