有的时候制作一个科幻风格的项目的时候,加入一个语音输入可视化的界面。或许能够更高大上一些,所以在空余时间研究了一下音频的可视化。其实原因还是非常简单的。一起来看一下效果图:
1、搭建场景。这里面不需要有太多的步骤
新建一个AudioCube空物体,这下面存放上图中的所有的小长方体,我们可以将小长方体的参数设置如下(建好一个之后可以将其作为预置体方便以后使用,这里一共需要32个):
2、将上面建好的预置体摆放到场景中,一共需要32个(注意个数,因为脚本控制的时候需要计算,多了或少了会导致报错,个数也可在脚本中更改一下)。这里需要特别注意的就是相机需要设置为正交模式(Orthographic),相机的对应参数根据自己的需求设置一下就好。
3、场景基本上搭建完成了,下面直接上代码,都有注释,就不在啰嗦了
这里将脚本挂载到场景中之后,需要把所有的小长方体都拖拽到数组中
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 语音识别音频可视化
/// </summary>
public class UseMicrophone : MonoBehaviour
{
//音频可视化的小长方体
public GameObject[] obj;
private AudioClip micRecord;
string device;
void Start()
{
device = Microphone.devices[0];//获取设备麦克风
micRecord = Microphone.Start(device, true, 999, 44100);//44100音频采样率 固定格式
}
void Update()
{
//退出
if (Input.GetKey(KeyCode.Escape))
{
Application.Quit();
}
}
/// <summary>
/// 每一振处理那一帧接收的音频文件
/// </summary>
/// <returns></returns>
float GetMaxVolume()
{
float maxVolume = 0f;
//剪切音频
float[] volumeData = new float[128];
int offset = Microphone.GetPosition(device) - 128 + 1;
if (offset < 0)
{
return 0;
}
micRecord.GetData(volumeData, offset);
for (int i = 0; i < 128; i++)
{
float tempMax = volumeData[i];//修改音量的敏感值
//这个if是用来取记录的音频的一部分 和你所加的物体有关
//这块取余除以几,场景中长方体的个数就是这个数的倍数
if (i % 4 == 0)
{
int f = i / 4;
//将可视化的物体和音波相关联
obj[f].gameObject.transform.localScale = new Vector3(0.3f, volumeData[i] * 10 + 0.2f, 0.1f);//将可视化的物体和音波相关联
}
}
return maxVolume;
}
}
到这里基本上就结束了,将脚本挂载到物体上,把所有的小长方体都拖拽到数组中,电脑插上麦克风,运行一下就OK。
分享下工程文件:https://github.com/ShuxinWen/AudioVisualization