Hololens官方教程精简版 - 05. Voice(语音)
Posted PhiloChou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hololens官方教程精简版 - 05. Voice(语音)相关的知识,希望对你有一定的参考价值。
前言
注意:本文已更新到5.5.1f1版本
个人建议,学习Holograms 212之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。
本篇集中学习语音功能,完成以下目标:
- 语音命令(目前仅支持英文)
- 操作麦克风
注意:因为这部分只支持英文,所以我只保留了语音命令和麦克风操作的部分,去掉了语音识别和语义识别。文章结构跟官方会不一致,但并不影响我们的学习!
Unity Setup
请按照第一篇的教程,完成项目的创建。
新建文件夹:”Assets/_Scenes/Holograms 212/”
新建场景:”Assets/_Scenes/Holograms 212/Holograms 212.unity”
打开场景,删除默认的Main Camera
将”Assets/HoloToolkit/Input/Prefabs/HololensCamera.prefab”添加到Hierarchy根级
添加一个Cube,按如下属性进行设置:
本节完成,测试运行!
Chapter 1 - 添加语音命令
目标
使用KeywordRecognizer添加语音命令
实践
添加全局语音命令
对麦克风说出”Follow Me”时,Cube跟随我们移动,当说出”Leave Along”时,Cube停止跟随。
- 给Cube添加Tagalong组件,并去掉默认的勾选
新增文件:”Assets/_Scenes/Holograms 212/Scripts/Cube212.cs”,内容如下:
using HoloToolkit.Unity; using HoloToolkit.Unity.InputModule; using UnityEngine; public class Cube212 : MonoBehaviour // Cube跟随组件 private Tagalong tagalong; void Start () // 获取Cube上Tagalong组件 tagalong = GetComponent<Tagalong>(); // 让Cube跟随 public void OnFollowMe() tagalong.enabled = true; // 停止Cube跟随 public void OnLeaveAlong() tagalong.enabled = false;
- 在Hierarchy面板,新增空对象,重命名为:Controller
- 为Controller添加Keyword Manager组件
- 将Keyword Manager的Recognizer Start设置为:Auto Start
按下图增加两个语音命令:”Follow Me“及”Leave Along“,并指向Cube212脚本中对应的两个方法:
OnFollowMe()
和OnLeaveAlong()
本节第一部分完成!
当发出语音”Follow Me”时,Cube会跟随我们移动,当发出语音”Leave Along”时,Cube将停止跟随。
添加特定语音命令
当凝视Cube,并说出”Start Rotate”时,Cube开始旋转。当凝视Cube,并说出”Stop Rotate”时,Cube停止旋转。
- 在Project面板中,搜索Input Manager和Default Cursor预设体,添加到Hierarchy面板根级。
打开Cube212.cs脚本,编辑如下:
using HoloToolkit.Unity; using HoloToolkit.Unity.InputModule; using UnityEngine; public class Cube212 : MonoBehaviour, IFocusable // Cube状态枚举值 private enum CubeStatus Normal = 1, // 正常状态 Rotating // 旋转状态 // 当前Cube状态 private CubeStatus cubeStatus; // Cube的语音命令组件 private KeywordManager keywordManager; // Cube跟随组件 private Tagalong tagalong; void Start () // 设置Cube默认状态 cubeStatus = CubeStatus.Normal; // 获取Cube上的KeywordManager组件 keywordManager = GetComponent<KeywordManager>(); // 获取Cube上Tagalong组件 tagalong = GetComponent<Tagalong>(); void Update () // 根据状态旋转Cube if (cubeStatus == CubeStatus.Rotating) transform.Rotate(Vector3.up); // 开始旋转 public void OnRotate() cubeStatus = CubeStatus.Rotating; // 停止旋转 public void OnStopRotate() cubeStatus = CubeStatus.Normal; // Cube被凝视时,开启语音命令 public void OnFocusEnter() keywordManager.StartKeywordRecognizer(); // Cube不被凝视时,关闭语音命令 public void OnFocusExit() keywordManager.StopKeywordRecognizer(); // 让Cube跟随 public void OnFollowMe() tagalong.enabled = true; // 停止Cube跟随 public void OnLeaveAlong() tagalong.enabled = false;
按照之前的方法,给Cube添加Keyword Manager组件,并按图进行设置:
本节第二部分完成!
当凝视Cube时,发出Start Rotate语音命令,Cube开始旋转。发出Stop Rotate语音命令,Cube停止旋转。
如果语音命令不奏效,请检查代码并参考:《Hololens官方教程精简版 - 02. Introduction with Device》所说的进行检查。
说明
- TagAlong
HoloToolkit提供的跟随脚本 - Keyword Manager
语音命令管理器,内部实际上使用了”KeywordRecognizer“类对语音命令进行处理。
Chapter 2 - 操作麦克风
目标
麦克风回放,并控制Cube大小
实践
- 给Cube添加Audio Source组件
- 新建文件:”Assets/_Scenes/Holograms 212/Scripts/Cube212Mic.cs”,并拖拽到Cube上
编写Cube212Mic.cs脚本如下:
using HoloToolkit.Unity.InputModule; using UnityEngine; public class Cube212Mic : MonoBehaviour // Cube原始大小 private Vector3 origScale; // 当前麦克风"音量" private float averageAmplitude = 0; void Start() // 保存Cube原始大小 origScale = transform.localScale; // 设置麦克风音量 MicStream.MicSetGain(10); // 开启麦克风 MicStream.MicStartStream(false, false); // 声音过滤 private void OnAudioFilterRead(float[] buffer, int numChannels) // 将麦克风输入到声音过滤管线中,将麦克风的声音从耳机播放出来 MicStream.MicGetFrame(buffer, buffer.Length, numChannels); // 计算麦克风"音量"大小 float sumOfValues = 0; for (int i = 0; i < buffer.Length; i++) sumOfValues += Mathf.Abs(buffer[i]); averageAmplitude = sumOfValues / buffer.Length; void Update() // 根据"音量"调整Cube大小 transform.localScale = origScale * (1 + averageAmplitude * 10);
本节完成!
当麦克风有声音时,耳机中会回放麦克风声音,并且Cube会根据音量改变大小
说明
- MicStream
HoloToolkit提供的麦克风操作类,详细的用法可参考工具包中的MicStreamDemo类 - OnAudioFilterRead
Unity引擎提供的声音滤波函数,具体原理可参考官方文档《OnAudioFilterRead》 - MicStream.MicGetFrame(…)
这个方法可以获取到麦克风的帧数据(float[]),可以在类似OnAudioFilterRead或者Update等高频事件中调用并获取。因为获取到的是麦克风最小数据单元,使用起来非常灵活。我们可以在OnAudioFilterRead中播放,也可以使用Socket进行远程通话。后面我会详细说明,如何用Hololens实现远程通话。
小结
在Hololens未正式支持中文语音前,我们只能暂时使用英文语音命令啦。
另外,如果小伙伴们要做通话,那么本人强烈建议深入了解MicStream的使用。当然,也少不了需要研究一下Unity中关于Microphone的部分。
关于OnAudioFilterRead(…),在声音处理和回放中起到了很重要的作用。通过Socket远程通话,就会用到这个方法。
参考文档
官方教程Holograms 212:https://developer.microsoft.com/en-us/windows/mixed-reality/holograms_212
VR/AR/MR技术交流QQ群:594299228
以上是关于Hololens官方教程精简版 - 05. Voice(语音)的主要内容,如果未能解决你的问题,请参考以下文章
Hololens官方教程精简版 - 02. Introduction with Device
Hololens官方教程精简版 - 02. Introduction with Device
Hololens官方教程精简版 - 04. Gesture(手势)
Hololens官方教程精简版 - 04. Gesture(手势)