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,按如下属性进行设置:

设置Cube

本节完成,测试运行!

Chapter 1 - 添加语音命令

目标

使用KeywordRecognizer添加语音命令

实践

添加全局语音命令

对麦克风说出”Follow Me”时,Cube跟随我们移动,当说出”Leave Along”时,Cube停止跟随。

  1. Cube添加Tagalong组件,并去掉默认的勾选
  2. 新增文件:”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;
        }
    }
  3. Hierarchy面板,新增空对象,重命名为:Controller
  4. Controller添加Keyword Manager组件
  5. Keyword ManagerRecognizer Start设置为:Auto Start
  6. 按下图增加两个语音命令:”Follow Me“及”Leave Along“,并指向Cube212脚本中对应的两个方法:OnFollowMe()OnLeaveAlong()

    增加语音命令

本节第一部分完成!

当发出语音”Follow Me”时,Cube会跟随我们移动,当发出语音”Leave Along”时,Cube将停止跟随。

添加特定语音命令

当凝视Cube,并说出”Start Rotate”时,Cube开始旋转。当凝视Cube,并说出”Stop Rotate”时,Cube停止旋转。

  1. Project面板中,搜索Input ManagerDefault Cursor预设体,添加到Hierarchy面板根级。
  2. 打开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;
        }
    }
  3. 按照之前的方法,给Cube添加Keyword Manager组件,并按图进行设置:

    为Cube设置Keyword Manager

本节第二部分完成!

当凝视Cube时,发出Start Rotate语音命令,Cube开始旋转。发出Stop Rotate语音命令,Cube停止旋转。

如果语音命令不奏效,请检查代码并参考:《Hololens官方教程精简版 - 02. Introduction with Device》所说的进行检查。

说明

  • TagAlong
    HoloToolkit提供的跟随脚本
  • Keyword Manager
    语音命令管理器,内部实际上使用了”KeywordRecognizer“类对语音命令进行处理。

Chapter 2 - 操作麦克风

目标

麦克风回放,并控制Cube大小

实践

  1. Cube添加Audio Source组件
  2. 新建文件:”Assets/_Scenes/Holograms 212/Scripts/Cube212Mic.cs”,并拖拽到Cube
  3. 编写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
VR/AR/MR技术交流QQ群:594299228

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值