Hololens官方教程精简版 - 05. Voice(语音)

来源:互联网 发布:今日头条乱下软件 编辑:程序博客网 时间:2024/06/10 06:14

前言

注意:本文已更新到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 0
原创粉丝点击