Voice input in Unity 语音识别

对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中。HoloLens上语音输入有三种形式,分别是:

  • 语音命令 Voice Command
  • 听写 Diction
  • 语法识别 Grammar Recognition
  • </ul>

     

    语音命令 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 keywords = new Dictionary();
    
        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结合到了一起,非常有用。

     

     

    results matching ""

      No results matching ""