HoloLens開發手記 - Unity之語音輸入


對於HoloLens,語音輸入是三大基本輸入方式之一,廣泛地運用在各種交互中。HoloLens上語音輸入有三種形式,分別是:

  • 語音命令 Voice Command
  • 聽寫 Diction
  • 語法識別 Grammar Recognition

 

語音命令 Voice Command


 

對於做過Windows Phone或許Windows Store應用開發的人來說,語音命令是經常使用到的特性。開發者可以通過為應用設定關鍵詞,和對應的行為,來為用戶提供語音命令體驗。當用戶說出關鍵詞時,預設的動作就會被調用。在HoloLens上,語音命令也是此模式。

KeywordRecognizer

命名空間UnityEngine.Windows.Speech

KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

 

使用方法很簡單,通過注冊<關鍵詞>來初始化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

類: GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

在你創建好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

: DictationRecognizerSpeechErrorSpeechSystemStatus

聽寫特性用於將用戶語音轉為文字輸入,同時支持內容推斷和事件注冊特性。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();
    }
}

 

注意:以下情況中,聽寫識別會自動觸發超時行為:

  1. 如果在聽寫開始后第一個5秒內沒聽到任何聲音,將會超時
  2. 如果識別到了一個結果但是之后20秒沒聽到任何聲音,也會超時

 

同時使用以上特性


 

如果你想同時使用語音命令、語法識別和聽寫特性,那么一定要在完全關閉當前語音識別行為后再開始另一個識別動作。如果有多個KeywordRecognizer在運行,你可以使用如下代碼一次性關閉它們:

 

PhraseRecognitionSystem.Shutdown();

 

為了從先前狀態恢復所有的識別器,可以在聽寫識別完成后調用如下代碼:

 

PhraseRecognitionSystem.Restart();

 

當然你也可以重新開始一個 KeywordRecognizer,這將會重啟PhraseRecognitionSystem,達到上面的效果。

 

總結


 

Windows平台上的語音識別特性從Windows 8以來一直都很強大,但是在HoloLens上會有更大的用武之地。這是最基本的交互方式,從系統層級上提供了強大的支持,甚至和Cortana結合到了一起,非常有用。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM