對於HoloLens,語音輸入是三大基本輸入方式之一,廣泛地運用在各種交互中。HoloLens上語音輸入有三種形式,分別是:
- 語音命令 Voice Command
- 聽寫 Diction
- 語法識別 Grammar Recognition
語音命令 Voice Command
對於做過Windows Phone或許Windows Store應用開發的人來說,語音命令是經常使用到的特性。開發者可以通過為應用設定關鍵詞,和對應的行為,來為用戶提供語音命令體驗。當用戶說出關鍵詞時,預設的動作就會被調用。在HoloLens上,語音命令也是此模式。
KeywordRecognizer
命名空間: UnityEngine.Windows.Speech
類: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
使用方法很簡單,通過注冊<關鍵詞>來初始化KeywordRecognizer實例,同時注冊語音命令事件來做后續處理。
using UnityEngine.Windows.Speech; using System.Collections.Generic; using System.Linq; public class KeywordManager : MonoBehavior { KeywordRecognizer keywordRecognizer; Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>(); void Start() { //初始化關鍵詞 keywords.Add("activate", () => { // 想執行的行為 }); keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray()); keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized; //開始識別 keywordRecognizer.Start(); } private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args) { System.Action keywordAction; // 如果識別到關鍵詞就調用 if (keywords.TryGetValue(args.text, out keywordAction)) { keywordAction.Invoke(); } } }
語法識別 Grammar Recognition
語法識別同Windows Store應用類似,依賴於實現設定好的SRGS文件,文件中定義了一系列語法規則用於語音識別。更多信息請閱讀:https://msdn.microsoft.com/zh-cn/library/hh378349(v=office.14).aspx
GrammarRecognizer
命名空間:UnityEngine.Windows.Speech
類: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
在你創建好SRGS文件后,將它放進StreamingAessets文件夾:
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
使用起來也很簡單,代碼如下:
public class GrammarManager : MonoBehavior { private GrammarRecognizer grammarRecognizer; void Start() { //初始化 grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml"); grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized; //開始識別 grammarRecognizer.Start(); } private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args) { SemanticMeaning[] meanings = args.semanticMeanings; // 執行動作 } }
聽寫 Diction
聽寫即語音轉文字,此前我們稱之為Speech to Text,同樣是Windows Store應用特性之一。在HoloLens上,發揮了比其他平台更大的作用。因為HoloLens的操作特性,使用鍵盤操作起來十分不方便,語音則無此問題,能大大提高輸入效率。
DictationRecognizer
命名空間: UnityEngine.Windows.Speech
類: DictationRecognizer, SpeechError, SpeechSystemStatus
聽寫特性用於將用戶語音轉為文字輸入,同時支持內容推斷和事件注冊特性。Start()和Stop()方法用於啟用和禁用聽寫功能,在聽寫結束后需要調用Dispose()方法來關閉聽寫頁面。GC會自動回收它的資源,如果不Dispose會帶來額外的性能開銷。
完整的使用方法如下:
public class DictionManager : MonoBehavior { private DictationRecognizer dictationRecognizer; void Start() { dictationRecognizer = new DictationRecognizer(); //注冊事件 dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis; dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete; dictationRecognizer.DictationError += DictationRecognizer_DictationError; //開始聽寫識別 dictationRecognizer.Start(); } private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence) { // 自定義行為 } private void DictationRecognizer_DictationHypothesis(string text) { // 自定義行為 } private void DictationRecognizer_DictationComplete(DictationCompletionCause cause) { // 自定義行為 } private void DictationRecognizer_DictationError(string error, int hresult) { // 自定義行為 } void OnDestroy() { //釋放資源 dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete; dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis; dictationRecognizer.DictationError -= DictationRecognizer_DictationError; dictationRecognizer.Dispose(); } }
注意:以下情況中,聽寫識別會自動觸發超時行為:
- 如果在聽寫開始后第一個5秒內沒聽到任何聲音,將會超時
- 如果識別到了一個結果但是之后20秒沒聽到任何聲音,也會超時
同時使用以上特性
如果你想同時使用語音命令、語法識別和聽寫特性,那么一定要在完全關閉當前語音識別行為后再開始另一個識別動作。如果有多個KeywordRecognizer在運行,你可以使用如下代碼一次性關閉它們:
PhraseRecognitionSystem.Shutdown();
為了從先前狀態恢復所有的識別器,可以在聽寫識別完成后調用如下代碼:
PhraseRecognitionSystem.Restart();
當然你也可以重新開始一個 KeywordRecognizer,這將會重啟PhraseRecognitionSystem,達到上面的效果。
總結
Windows平台上的語音識別特性從Windows 8以來一直都很強大,但是在HoloLens上會有更大的用武之地。這是最基本的交互方式,從系統層級上提供了強大的支持,甚至和Cortana結合到了一起,非常有用。