确定AudioClip的音量


10

我有一些代码,可以使用GetSpectrumDataAudioSource播放的歌曲来创建供播放器播放的关卡布局。我想添加一个功能,让播放器可以上传自己的歌曲并播放使用这些歌曲中的数据创建的关卡。不幸的是,在比较不同的音频文件时,我遇到了以下问题:

在此处输入图片说明

如您所见,每个剪辑的幅度都大不相同,随后创建的电平很难完成或几乎不可能。我想找到一种确定这种“响度”的方法,以便在从歌曲中获取数据后将其调低或用倍增器放大。另外,有没有办法在不播放歌曲的情况下提取这些数据?

Answers:


9

手动执行此操作的方法是使用AudioClip.GetData获取数组中的样本数据。然后遍历数据并找到均方根,以找到音频剪辑的“响度”。

然后,您还可以缩放整个数组,使最大值为1.0f,然后使用AudioClip.SetData将其写回到audioclip 。这称为归一化音频,它使样本具有最大音量的最大音量。请注意,这没有考虑到音频片段的音量很低但峰值很高。有更高级的技术(在下面指出)。

默认情况下,Unity也会自动进行标准化。因此,如果您未触摸导入设置,则此操作会自动完成,您无需担心。如果即使确定音频已标准化也仍然存在问题,则可能需要使用动态范围压缩压缩音频(注意:与数据压缩完全不同,与文件大小或内存使用无关)借助外部软件满足您的需求。


很棒的答案,将更详细地研究所有这些。谢谢!
园丁

5
最大值并不总是最好的选择(如您所说)。非常非常短的尖峰尖峰(这些声音如喀哒声)似乎不如连续声音大。如果要获得感知的响度,则需要对所有值求平方,取平均值,然后取平方根。标准化就是这样做的方法,因此希望有一个内置的Unity。
Jezzamon's

2
响度与声能有关,正如@Jezzamon所暗示的那样,确定声响的方式是通过计算均方根(RMS)。dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.