我正在覆盖一堆音频片段,并希望能够以 (1, 1, 1, 0.5, 0...) 的形式将一组值传递给我的函数,每个数字都是音量的比率一个段应该被缩放到。0 应该是绝对无声的,而 1 应该是未修改的原始音量,而 0.5 正好是一半。据我了解,这是GainNode “增益”属性的行为。
到目前为止,我尝试了这些:
def adjust_volume(audio_segment, ratio):
decibel = pydub.utils.ratio_to_db(audio_segment.rms)
return audio_segment - decibel * (1 - ratio)
和
SILENCE_THRESHOLD = -120.00
def adjust_volume(audio_segment, ratio):
difference = SILENCE_THRESHOLD - audio_segment.dBFS
return audio_segment + (difference - (difference * ratio))
不幸的是,两者都不能完美地工作,这意味着它们不能完全复制浏览器(Mozilla Firefox)的行为。使用第一个,即使我传入一个仅包含 0 的元组,也可以使用我的音频播放器(foobar2000)听到声音,而第二个设法使用正确的静音阈值使整个片段静音,例如使用 0.3 创建音频水平远低于我在浏览器中使用相同值可以观察到的水平。
需要注意的是,我的音频技术知识非常有限。这些仅仅是由不同的音频设备、音频实现细节等造成的技术误差吗?如果是这样的话,有人可以建议我做这个缩放的最“正确”的方法吗?