VNSound2.0: 频谱设置指南 (Patreon)
Content
This document is the Chinese version of https://www.patreon.com/posts/vnsound2-0-setup-72140877
频谱设置是VNSound2.0中引入的新功能,基本内容都在上面的视频中演示了,本文更加具体的解释内部的设置方法。
首先是设置中的采样部分 sampling setting:
- Target audio 目标音源:
这里设置频谱绑定目标音源的方式。
PlayingAudio - MMDD/VNSound only: 这是默认的方式,将首先搜索MMDD,然后搜索VNSound,和第一个找到的正在播放的音源绑定。
PlayingAudio - Any audio found: 这个方式则是在工作室全体搜索AudioSource组件,并和第一个找到的音源绑定。这方式下可以找到工作室中的bgm,人物语音和一些声音mod,但找不到mp4面板播放的声音。
MMD Director: 指定一个MMDD的音源。MMDD可以载入多个音乐文件,所以要按照序号指定一个,0代表第一个,1代表第二个,以此类推。
VNSound: 指定一个VNSound音源。VNSound给每个载入的音乐文件都分配了id,可以用id来指定,也可以用序号指定。 - Sample Count 样本数量:
频谱算法的中心是快速傅里叶变换(FFT)。每一帧都会对音源进行一次FFT,得到样本。这里可以设置获得的样本数量。FFT的结果是频域的,所以样本越多的话频率解析度就越高,同时开销越大。注意FFT的采样频率是Unity固定的。 - Sample channel 采样通道:
选择是左声道,右声道还是立体声。如果选立体声就要采样两次,一般的话左声道就够了。 - Sample window 窗口函数:
FFT的窗口函数,这是数学的领域了,我也不懂。试下来Hanning、Blackman和BlackmanHarris都不错,也差不多。Rectangular和Triangle的结果就不行了。
然后是频段设置Spectrum band:
频段是样本的集合体。比如我们上面设置了512个样本,逐个处理的话太多了,所以需要归结到频段中来处理。而频段中的样本范围就决定了频段的频率范围。.
打开"Show band frequency range"选项可以看到每个频段对应的频率范围。默认的设定只是一个参考,你可以根据需要随意增加或者删减频段。每个频段的范围也可以任意设置,但至少要有一个样本。频段的范围可以重叠,不需要连续。换句话说,不是每个样本都必须用到,也不是每个样本只能用一次。
然后,频段也是频谱输出的单位。每个频段可以和一个clip相关联。在Action clip部分可以用<或>按钮选择一个clip,也可以用New按钮来新建一个。
接下来是算法设定Algorithm options:
- Band statistics 频段统计:
设置频段中样本的统计方式。
Sum: 求和,这是默认的方式,最简单,看起来也不错。
Avg: 求平均
RSS: 求平方和的根,据说是正确的统计方式。
RMS: 均方根 - Audio profile 音频预值:
每个频段的输出值最终都会被正规化到0-1之间,所以需要一个最大值来计算标准值。这个最大值会在播放声音的时候自动更新,但我们需要一个初始的最大值,就是预值。如果我们的最大值从0开始变化,那么音乐开始的时候每个采样值都可能超过最大值,导致最大值不断更新,动画会非常的剧烈。
预值的大小和选择的统计方式,以及播放的音乐都有关。比如你选择了平均化的统计方式的话,频段的结果肯定比采用求和的方式要小,那就需要适当减小预值。如果预值过小,动画开始的时候跳动会比较严重。反之如果过大,采样值始终不能达到预值的话,动画的幅度就会偏小。可以在后述的预览中看到采样到的最大值,以此为依据来设置预值。大概在采样得到的最大值的1/4-1/2左右为好吧。
注意,预值只是初始的最大值,一旦采样的结果大于预值,最大值会被更新,之后的表现就和预值没有关系了。 - Audio normalize 正规化计算:
Independent: 默认方式,每个频段根据自己的最大值来做正规化
Unified: 所有的频段使用统一的最大值来做正规化,这个模式下能够正确反映各个频段之间的音量差,但是我们又不是来做科学分析的,相比之下Independent模式中各个频段跳动的更加活跃。 - Audio drop down 衰减:
衰减默认为ON,这模式下如果采样值大于上次输出,那么就输出采样值,如果小于上次输出,那么输出根据自己的速度来衰减。也就是说跳上去一下子,掉下来是慢慢掉的,这样可以让动画更加平滑。这里Drop speed设置衰减的初始速度,Drop accelerate设置衰减的加速度。如果输出降得太慢,可以调大这两个数值。
如果关掉衰减,那么输出就始终是采样值,跳动会比较剧烈。 - Avg Amplitude平均音量:
打开这个选项会给你多一个输出,就是所有频段的平均音量。你可以将平均音量和某个clip绑定。(这个音量的算法可能有点问题) - Import/Export 导入导出:
完成设定后可以导出到json文件,便于导入给别的场景。
接下来看一下管理画面中的频谱预览 spectrum preview
在VNSound管理画面中,频谱设定显示如下:
第一行中显示它的采样数和频段数,以及和哪个音源进行了绑定。第二行就是操作按钮了:
- Enabled 有效无效: 频谱的开关
- Edit 编辑: 转到编辑画面
- Reset 重置: 将输出清0,重新开始采样和收集最大值
- Preview 预览: 打开预览
- X: 删除
点击Preview打开预览,可以看到频段输出的情况。
预览中每个频段都有一个条状图来表示其输出的正规值(0-1)。已经一个数字显示其采样中得到的最大值。这个最大值是设置预值(profile)的重要参考。
如果设定中使用了衰减,在最下方会显示drop speed和accelerate rate的设置区,在这里可以快速的调整衰减速度的加速度,并在预览中看到效果。
如果选上了More info 选项,还能看到频段的频率范围和正规化之前的采样值。
如果你选择了Unified的正规化模式,这里还会看到整体的最大值。
指定Clip的一些提示:
单纯的设定一个频谱并没有意义,你需要指定clip给频段才能和场景互动。
和频段绑定的Clip里面定义了场景中的东西如何随音乐变化。Clip的长度,FPS,速度和循环设置基本没有意义,因为这个Clip不是真的被播放,而是被频段的输出值驱动的,就像你用鼠标去滑动进度条一样。比如你的Clip是10帧长,那么频段输出0.5的时候就是第5帧的状态,如果你的Clip是100帧长,0.5就是第50帧的状态。
原则上,所有可以被clip控制的属性都可以和音乐联动。但鉴于这些clip每一帧都要更新,所以不要选那些非常慢的属性(比如换地图)。而且创建的关键帧越少越好!
最后是一些参考文档:
如果对原理和数学有兴趣的话……
https://www.nti-audio.com/en/support/know-how/fast-fourier-transform-fft
https://www.teachmeaudio.com/mixing/techniques/audio-spectrum