Hololens输入——Unity语音输入

发表于2017-06-06
评论0 3.8k浏览

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

前言:

Unity公开了将Voice输入添加到Unity应用程序的三种方法。

使用KeywordRecognizer(两种类型的PhraseRecognizers之一),您的应用程序可以被赋予一系列要监听的字符串命令。使用GrammarRecognizer(另一种类型的PhraseRecognizer),您的应用程序可以被赋予一个定义特定语法的SRGS文件进行监听。使用DictationRecognizer,您的应用程序可以听任何单词,并向用户提供其语音的音符或其他显示。

注意:只有听写或词组识别才能立即处理。这意味着如果语法识别器或关键字识别器处于活动状态,则DictationRecognizer不能处于活动状态,反之亦然。

 

步骤如下所示:

启动语音功能

Unity必须启用Microphone 功能,才能使用语音功能,启用步骤如下所示:

Unity——Edit——Project Settings——Capabilitees——勾选Microphone选项

 

词组识别——KeywordRecognizer

要使您的应用程序听取用户使用的特定短语,然后采取一些措施,您需要:

· 指定使用KeywordRecognizerGrammarRecognizer侦听哪些短语

  • 处理OnPhraseRecognized事件,并采取与识别的短语相对应的操作

所需命名空间:UnityEngine.Windows.Speech

1.      using UnityEngine.Windows.Speech;  

2.      using System.Collections.Generic;  

3.      using System.Linq;  

然后用一个Dictionary存储需要进行语音识别的关键字:

1.     KeywordRecognizer keywordRecognizer;  

2.     Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();  

添加任意字符串作为关键词,并添加进字典(比如下面所示以activete作为关键词):

1.     //Create keywords for keyword recognizer  

2.     keywords.Add("activate", () =>  

3.     {  

4.         // action to be performed when this keyword is spoken  

5.     });  

最后添加一个识别事件:

1.     keywordRecognizer.OnPhraseRecognized  = KeywordRecognizer_OnPhraseRecognized;  

举一个例子:

1.     private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)  

2.     {  

3.         System.Action keywordAction;  

4.         // if the keyword recognized is in our dictionary, call that Action.  

5.         if (keywords.TryGetValue(args.text, out keywordAction))  

6.         {  

7.             keywordAction.Invoke();  

8.         }  

9.     }  

启动语音识别:

1.     keywordRecognizer.Start();  

整体简单案例如下所示:

1.     using UnityEngine.Windows.Speech;  

2.     using System.Collections.Generic;  

3.     using System.Linq;  

4.     using UnityEngine;  

5.       

6.     /// 

  

7.     /// Made By Bruce  

8.     /// 

  

9.     public class AudioCommond : MonoBehaviour  

10.   {  

11.       KeywordRecognizer keywordRecognizer;  

12.       Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();  

13.       public GameObject cube;  

14.     

15.       void Start()  

16.       {  

17.           var t = CoroutineWrapper.Inst;  

18.           keywords.Add("MoveUp", () =>  

19.           {  

20.               cube.transform.localPosition  = new Vector3(0, 1, 0);  

21.           });  

22.     

23.           keywords.Add("MoveDown", () =>  

24.           {  

25.               cube.transform.localPosition  = new Vector3(0, -1, 0);  

26.           });  

27.     

28.           keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());  

29.           keywordRecognizer.OnPhraseRecognized  = KeywordRecognizer_OnPhraseRecognized;  

30.           //开始识别  

31.           keywordRecognizer.Start();  

32.       }  

33.     

34.       private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)  

35.       {  

36.           System.Action keywordAction;  

37.           if (keywords.TryGetValue(args.text, out keywordAction))  

38.           {  

39.               keywordAction.Invoke();  

40.           }  

41.       }  

42.   }  

语言输入——Dictation

所需命名空间——UnityEngine.Windows.Speech

使用DictationRecognizer将用户的语音转换为文本。DictationRecognizer公开了听写功能,并支持注册和聆听假设和短语完成的事件,因此您可以在发言和以后给您的用户反馈。Start()和Stop()方法分别启用和禁用听写识别。使用识别器完成后,应使用Dispose()方法来释放其使用的资源。如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。

开始使用录音只需要几个步骤:

  • 创建一个新的DictationRecognizer
  • 处理听写事件
  • 启动DictationRecognizer

启用支持语言听写功能:

Unity——Edit——ProjectSettings——Capabilitees——勾选InternetClient选项

语音输入——DictationRecognizer

创建一个DictationRecognizer,如下所示:

1.     dictationRecognizer = new DictationRecognizer();  

有四个听写事件可以被订阅和处理以实施听写行为。

1.    DictationResult

2.    DictationComplete

3.    DictationHypothesis

4.    DictationError

DictationResult

用户暂停之后,通常在句子结尾处触发此事件。完整识别的字符串在这里返回。

注册DictationResult事件:

1.     dictationRecognizer.DictationResult   = DictationRecognizer_DictationResult;  

然后处理其回调:

1.     private void DictationRecognizer_DictationResultstring textConfidenceLevel confidence  

2.     {   

3.         //do something  

4.     }  

DictationHypothesis

这个事件在用户正在说话时被持续触发。当识别器侦听时,它提供了迄今为止所听到的内容。

DictationComplete

无论从Stop()被调用,是否发生超时或其他错误,识别器将停止此事件。

DictationError

发生错误时触发此事件。

 

提示

§  Start()和Stop()方法分别启用和禁用听写识别。

§  使用识别器完成后,必须使用Dispose()方法进行处理,以释放其使用的资源。如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。

§  超时发生在一段时间后。您可以在DictationComplete事件中检查这些超时。有两个超时要注意:

1.    如果识别器开始并且在前5秒钟内没有听到任何音频,它将超时。

1.    如果识别器给出了一个结果,然后听到静音二十秒钟,它将超时。

使用短语识别和听写

如果你想在你的应用程序中同时使用短语识别和口授,你需要完全关闭一个,然后才能开始另一个。如果您有多个KeywordRecognizer运行,您可以一次关闭它们:

PhraseRecognitionSystem.Shutdown();

为了将所有识别器恢复到之前的状态,在DictationRecognizer停止之后,您可以调用:

PhraseRecognitionSystem.Restart();

您也可以启动一个KeywordRecognizer,这将重新启动PhraseRecognitionSystem

 

简单案例如下所示:

1.     using UnityEngine;  

2.     using UnityEngine.Windows.Speech;  

3.     using UnityEngine.UI;  

4.       

5.     public class AudioDiction : MonoBehaviour  

6.     {  

7.         private DictationRecognizer dictationRecognizer;  

8.         public Text showResultText;  

9.       

10.       void Start()  

11.       {  

12.           dictationRecognizer = new DictationRecognizer();  

13.     

14.           //This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.  

15.           dictationRecognizer.DictationResult  = DictationRecognizer_DictationResult;  

16.     

17.           //This event is fired while the user is talking. As the recognizer listens, it provides text of what it‘s heard so far.  

18.           dictationRecognizer.DictationHypothesis  = DictationRecognizer_DictationHypothesis;  

19.     

20.           //This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.  

21.           dictationRecognizer.DictationComplete  = DictationRecognizer_DictationComplete;  

22.             

23.           //This event is fired when an error occurs.  

24.           dictationRecognizer.DictationError  = DictationRecognizer_DictationError;  

25.     

26.           //开始听写识别  

27.           dictationRecognizer.Start();  

28.       }  

29.     

30.       private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)  

31.       {  

32.           // 自定义行为  

33.           showResultText.text = text;  

34.       }  

35.     

36.       private void DictationRecognizer_DictationHypothesis(string text)  

37.       {  

38.           // 自定义行为  

39.           showResultText.text = text;  

40.     

41.       }  

42.     

43.       private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)  

44.       {  

45.           // 自定义行为  

46.           showResultText.text = "Complete!";  

47.       }  

48.     

49.       private void DictationRecognizer_DictationError(string error, int hresult)  

50.       {  

51.           // 自定义行为  

52.       }  

53.     

54.     

55.       void OnDestroy()  

56.       {  

57.           //释放资源  

58.           dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;  

59.           dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete;  

60.           dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis;  

61.           dictationRecognizer.DictationError -= DictationRecognizer_DictationError;  

62.           dictationRecognizer.Dispose();  

63.       }  

64.   }  

 

本篇文章翻译来自Hololens官方文档

Unity语音输入https://developer.microsoft.com/en-us/windows/mixed-reality/voice_input_in_unity

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: