HoloLens开发学习记录--- 5.Voice 语音操作( 说话控制旋转 + 录音并实时回放 根据声音大小控制cube大小 )

  一 , 用     unity2018.4.9  vs2017    创建一个新的 Unity 项目 VoiceDemo,初始化项目:

1.导入 MRTK 包                        (版本 HoloToolkit-Unity-2017.4.2.0)

2.应用项目设置为 MR 项目       (一键设置成为可以部署的环境)

3.使用 HoloLensCamera 替代默认相机

4.添加 CursorWithFeedback       (识别并反馈手势的光标控件)

5.添加 InputManager                   (作为输入源管理器,管理 gaze,gesture,speech等)

6.设置 InputManager 的 SimpleSinglePointerSelector 脚本的 Cursor 属性为添加的 CursorWithFeedback      (添加手势源到inputmanger)

7.添加一个 Cube

最终 Hierarchy 结构如下:

二,语音控制  SpeechInputSource.cs脚本      (效果:说出start rotate时,cube开始旋转.  说出stop rotate时,cube停止旋转)

(1),在 Hierarchy 创建一个空的 gameObject 并重命名为 SpeechManager为其添加 MRTK 的 SpeechInputSource.cs 脚本,为其添加两个关键字,分别是 start rotate 和 stop rotate。   //也许是作为一个监听的预设体,用来监听声音,无需附加给其他

speech

属性说明:

PersistentKeywords Keyword 在所有场景中都是持久的,此语音输入源实例在加载新场景时不会被销毁
RecognizerStart 是否在启动时激活识别器
recognitionConfidenceLevel Keyword 识别器的置信度

(2),新建一个脚本 CubRotate.cs,并将其添加到 Cube 上。//用来使cube旋转

这个脚本十分简单,调用 StartRotate() 方法就能够使 Cube 开始旋转,调用 StopRotate() 方法使 Cube 停止旋转。

using UnityEngine;

public class CubRotate : MonoBehaviour {
    bool HasRotate = false;
    
	void Update () {
        if(HasRotate)
        {
            transform.Rotate(Vector3.up);
        }
    }

    public void StartRotate()
    {
        HasRotate = true;
    }

    public void StopRotate()
    {
        HasRotate = false;
    }
}

(3),为 Cube 添加 MRTK 中的 SpeechInputHandler.cs 脚本,     该脚本用于处理语音输入,利用上面的SpeechInputSource.cs脚本获得的声源进行处理。


在该脚本中,添加了两个要处理的关键字,也就是在 SpeechInputSource.cs 中设置的 start rotate 和 stop rotate。在对应的 Response() 中调用了 Cube 的 CubeRotate.StartRotate() 和 CubeRotate.StopRotate() 方法。

//SpeechInputSource.cs捕获到说出对应的关键字之后,   SpeechInputHandler.cs来处理关键字(调用不同的方法),进而使cube做出动作

 

运行程序,因为使用到了语音,所以必须使用真机运行,在运行前,不要忘记添加 Microphone 的权限。在 Edit/Project Settings/Player/Publishing Settings/Capabilities中勾选 Microphone 。

 

二,实现用声音操作  cube大小   (效果:首先会录入外界的声音,并实时播放.  当外界声音大时,cube变大)

下面实现一个在耳机中播放麦克风录入的声音,并能够根据声音音量调整 Cube 的大小。

(1)  新建一个脚本 CubeMic.cs,并将其添加到 Cube 上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity.InputModule;

public class CubeMic : MonoBehaviour
{
    //表示cube的原始大小
    private Vector3 origScale;
    //设置当前麦克风的“音量”,平均振幅
    private float averageAmplitude;

    void Start()
    {
        //保存原始大小
        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);
    }

}

总结一下代码:

  1. MicStream :  HoloToolkit提供的麦克风操作类,详细的用法可参考工具包中的MicStreamDemo类
  2. OnAudioFilterRead      Unity引擎提供的声音滤波函数,具体原理可参考官方文档《OnAudioFilterRead》
  3. MicStream.MicGetFrame(…) :  这个方法可以获取到麦克风的帧数据(float[]),可以在类似 OnAudioFilterRead 或者 Update 等高频事件中调用并获取。因为获取到的是麦克风最小数据单元,使用起来非常灵活。我们可以在 OnAudioFilterRead 中播放,也可以使用Socke实现远程通话.

(2).为 Cube 添加一个 Audio Souce 组件,用于播放声音,它的属性使用默认值即可。

在真机中运行程序,我们能够听见麦克风的声音,并且 Cube 根据音量大小发生改变。

 

三, 有关语音中设置关键字的说明

  • 不要使用单音节词,避免被系统忽略。例如使用 Play Video 替代 Play。也要注意不要音节过多,增加用户使用成本。
  • 不要使用系统预置语音,防止歧义,例如 Select、Remove等。
  • 避免押韵的语音,例如使用 Show Store 替代 Show More。

四, 语音的底层实现

 

官网语音底层代码:https://docs.microsoft.com/zh-cn/windows/mixed-reality/holograms-101#chapter-4---voice

博客说明:https://blog.csdn.net/yuanlaijike/article/details/85202286

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章