Hololens输入——Unity语音输入
对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中。
前言:
Unity公开了将Voice输入添加到Unity应用程序的三种方法。
使用KeywordRecognizer(两种类型的PhraseRecognizers之一),您的应用程序可以被赋予一系列要监听的字符串命令。使用GrammarRecognizer(另一种类型的PhraseRecognizer),您的应用程序可以被赋予一个定义特定语法的SRGS文件进行监听。使用DictationRecognizer,您的应用程序可以听任何单词,并向用户提供其语音的音符或其他显示。
注意:只有听写或词组识别才能立即处理。这意味着如果语法识别器或关键字识别器处于活动状态,则DictationRecognizer不能处于活动状态,反之亦然。
步骤如下所示:
启动语音功能
Unity必须启用Microphone 功能,才能使用语音功能,启用步骤如下所示:
Unity——Edit——Project Settings——Capabilitees——勾选Microphone选项
词组识别——KeywordRecognizer
要使您的应用程序听取用户使用的特定短语,然后采取一些措施,您需要:
· 指定使用KeywordRecognizer或GrammarRecognizer侦听哪些短语
- 处理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_DictationResult(string text,ConfidenceLevel confidence)
2. {
3. //do something
4. }
DictationHypothesis
这个事件在用户正在说话时被持续触发。当识别器侦听时,它提供了迄今为止所听到的内容。
DictationComplete
无论从Stop()被调用,是否发生超时或其他错误,识别器将停止此事件。
DictationError
发生错误时触发此事件。
提示
§ Start()和Stop()方法分别启用和禁用听写识别。
§ 使用识别器完成后,必须使用Dispose()方法进行处理,以释放其使用的资源。如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。
§ 超时发生在一段时间后。您可以在DictationComplete事件中检查这些超时。有两个超时要注意:
1. 如果识别器开始并且在前5秒钟内没有听到任何音频,它将超时。
1. 如果识别器给出了一个结果,然后听到静音二十秒钟,它将超时。
使用短语识别和听写
如果你想在你的应用程序中同时使用短语识别和口授,你需要完全关闭一个,然后才能开始另一个。如果您有多个KeywordRecognizer运行,您可以一次关闭它们:
为了将所有识别器恢复到之前的状态,在DictationRecognizer停止之后,您可以调用:
您也可以启动一个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)