设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 697|回复: 1

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

[复制链接]
发表于 2017-12-5 22:09:30 | 显示全部楼层 |阅读模式

前言注意:本文已更新到5.5.1f1版本个人建议,学习Holograms 212之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。本篇集中学习语音功能,完成以下目标: - 语音命令(目前仅支持英文) - 操作麦克风注意:因为这部分只支持英文,所以我只保留了语音命令和麦克风...

前言
注意:本文已更新到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,按如下属性进行设置:
37.png
本节完成,测试运行!
Chapter 1 - 添加语音命令目标
使用KeywordRecognizer添加语音命令
实践添加全局语音命令
对麦克风说出”Follow Me”时,Cube跟随我们移动,当说出”Leave Along”时,Cube停止跟随。
  • Cube添加Tagalong组件,并去掉默认的勾选
  • 新增文件:”Assets/_Scenes/Holograms 212/Scripts/Cube212.cs”,内容如下:
    1. using HoloToolkit.Unity;
    2. using HoloToolkit.Unity.InputModule;
    3. using UnityEngine;

    4. public class Cube212 : MonoBehaviour{
    5.     // Cube跟随组件
    6.     private Tagalong tagalong;
    7.     void Start () {
    8.         // 获取Cube上Tagalong组件
    9.         tagalong = GetComponent<Tagalong>();
    10.     }

    11.     // 让Cube跟随
    12.     public void OnFollowMe()
    13.     {
    14.         tagalong.enabled = true;
    15.     }

    16.     // 停止Cube跟随
    17.     public void OnLeaveAlong()
    18.     {
    19.         tagalong.enabled = false;
    20.     }
    21. }
    复制代码

  • Hierarchy面板,新增空对象,重命名为:Controller
  • Controller添加Keyword Manager组件
  • Keyword ManagerRecognizer Start设置为:Auto Start
  • 按下图增加两个语音命令:”Follow Me“及”Leave Along“,并指向Cube212脚本中对应的两个方法:OnFollowMe()和OnLeaveAlong()
    38.png

本节第一部分完成!
当发出语音”Follow Me”时,Cube会跟随我们移动,当发出语音”Leave Along”时,Cube将停止跟随。
添加特定语音命令
当凝视Cube,并说出”Start Rotate”时,Cube开始旋转。当凝视Cube,并说出”Stop Rotate”时,Cube停止旋转。
  • Project面板中,搜索Input ManagerDefault Cursor预设体,添加到Hierarchy面板根级。
  • 打开Cube212.cs脚本,编辑如下:

  1. using HoloToolkit.Unity;
  2. using HoloToolkit.Unity.InputModule;
  3. using UnityEngine;

  4. public class Cube212 : MonoBehaviour, IFocusable {

  5.     // Cube状态枚举值
  6.     private enum CubeStatus
  7.     {
  8.         Normal = 1, // 正常状态
  9.         Rotating    // 旋转状态
  10.     }

  11.     // 当前Cube状态
  12.     private CubeStatus cubeStatus;

  13.     // Cube的语音命令组件
  14.     private KeywordManager keywordManager;

  15.     // Cube跟随组件
  16.     private Tagalong tagalong;

  17.     void Start () {
  18.         // 设置Cube默认状态
  19.         cubeStatus = CubeStatus.Normal;

  20.         // 获取Cube上的KeywordManager组件
  21.         keywordManager = GetComponent<KeywordManager>();

  22.         // 获取Cube上Tagalong组件
  23.         tagalong = GetComponent<Tagalong>();
  24.     }

  25.     void Update () {
  26.         // 根据状态旋转Cube
  27.         if (cubeStatus == CubeStatus.Rotating)
  28.         {
  29.             transform.Rotate(Vector3.up);
  30.         }
  31.     }

  32.     // 开始旋转
  33.     public void OnRotate()
  34.     {
  35.         cubeStatus = CubeStatus.Rotating;
  36.     }

  37.     // 停止旋转
  38.     public void OnStopRotate()
  39.     {
  40.         cubeStatus = CubeStatus.Normal;
  41.     }

  42.     // Cube被凝视时,开启语音命令
  43.     public void OnFocusEnter()
  44.     {
  45.         keywordManager.StartKeywordRecognizer();
  46.     }

  47.     // Cube不被凝视时,关闭语音命令
  48.     public void OnFocusExit()
  49.     {
  50.         keywordManager.StopKeywordRecognizer();
  51.     }

  52.     // 让Cube跟随
  53.     public void OnFollowMe()
  54.     {
  55.         tagalong.enabled = true;
  56.     }

  57.     // 停止Cube跟随
  58.     public void OnLeaveAlong()
  59.     {
  60.         tagalong.enabled = false;
  61.     }
  62. }
复制代码




  • 按照之前的方法,给Cube添加Keyword Manager组件,并按图进行设置:
    39.png

本节第二部分完成!
当凝视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脚本如下:

   
  1. using HoloToolkit.Unity.InputModule;
  2. using UnityEngine;

  3. public class Cube212Mic : MonoBehaviour {

  4.     // Cube原始大小
  5.     private Vector3 origScale;

  6.     // 当前麦克风"音量"
  7.     private float averageAmplitude = 0;

  8.     void Start()
  9.     {
  10.         // 保存Cube原始大小
  11.         origScale = transform.localScale;
  12.         // 设置麦克风音量
  13.         MicStream.MicSetGain(10);
  14.         // 开启麦克风
  15.         MicStream.MicStartStream(false, false);
  16.     }

  17.     // 声音过滤
  18.     private void OnAudioFilterRead(float[] buffer, int numChannels)
  19.     {
  20.         // 将麦克风输入到声音过滤管线中,将麦克风的声音从耳机播放出来
  21.         MicStream.MicGetFrame(buffer, buffer.Length, numChannels);

  22.         // 计算麦克风"音量"大小
  23.         float sumOfValues = 0;
  24.         for (int i = 0; i < buffer.Length; i++)
  25.         {
  26.             sumOfValues += Mathf.Abs(buffer[i]);
  27.         }
  28.         averageAmplitude = sumOfValues / buffer.Length;
  29.     }

  30.     void Update()
  31.     {
  32.         // 根据"音量"调整Cube大小
  33.         transform.localScale = origScale * (1 + averageAmplitude * 10);
  34.     }
  35. }
复制代码



本节完成!
当麦克风有声音时,耳机中会回放麦克风声音,并且Cube会根据音量改变大小
说明
  • MicStream
    HoloToolkit提供的麦克风操作类,详细的用法可参考工具包中的MicStreamDemo
  • OnAudioFilterRead
    Unity引擎提供的声音滤波函数,具体原理可参考官方文档《OnAudioFilterRead》
  • MicStream.MicGetFrame(…)
    这个方法可以获取到麦克风的帧数据(float[]),可以在类似OnAudioFilterRead或者Update等高频事件中调用并获取。因为获取到的是麦克风最小数据单元,使用起来非常灵活。我们可以在OnAudioFilterRead中播放,也可以使用Socket进行远程通话。后面我会详细说明,如何用Hololens实现远程通话。
小结
在Hololens未正式支持中文语音前,我们只能暂时使用英文语音命令啦。
另外,如果小伙伴们要做通话,那么本人强烈建议深入了解MicStream的使用。当然,也少不了需要研究一下Unity中关于Microphone的部分。
关于OnAudioFilterRead(…),在声音处理和回放中起到了很重要的作用。通过Socket远程通话,就会用到这个方法。






上一篇:Hololens官方教程精简版 - 04. Gesture(手势)
下一篇:Hololens官方教程精简版 - 06. Spatial sound(空间声音)
发表于 2017-12-5 22:10:29 | 显示全部楼层
这么牛,顶一个
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

注册验证邮件查收提醒:

由于各大邮箱政策原因,

如果没收到邮件提醒,

您的注册验证邮件可能

被投送到您邮箱的垃圾箱,

请注意查收验证哦


QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-7-16 18:24 , Processed in 0.566867 second(s), 30 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

快速回复 返回顶部 返回列表