重新创建Web Audio API GainNode行为

时间:2015-02-07 14:59:35

标签: python audio pydub

我覆盖了一堆音频片段,并希望能够将(1,1,1,0.5,0 ...)形式的值元组传递给我的函数,每个数字都是一个比例段的音量应缩放到。 0应该是绝对无声的,而1应该是原始音量未经修改,而0.5应该是正确的一半。据我了解,这是the behavior of the GainNode "gain" property

到目前为止我尝试过这些:

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)的行为。使用第一个可以用我的音频播放器(foobar2000)听到声音,即使我传入一个仅包含0的元组,而第二个设法用正确的静音阈值静音整个片段,使用0.3例如创建一个音频水平低于我在浏览器中使用相同值观察到的水平。

应该注意的是,我的技术音频知识非常有限。这些只是由不同的音频设备,音频实现细节等产生的技术不准确吗?如果是这种情况,有人会建议我采用最“正确”的方式进行缩放吗?

1 个答案:

答案 0 :(得分:1)

我的第一个问题是0.5的确切含义。声音的响度是对数的(每当你将信号的振幅,高度加倍时,它的声音听起来等于更大声)

那说,0.5简单地将幅度减半吗?如果是这样,那将是大约6dB更安静(我想!我总是混淆振幅和功率计算哈哈)。或者是静音和最大响度之间的0.5?

无论如何,如果你想在pydub中保持沉默,那么将音量降低120dB就应该这样做。人类可以听到的最大动态范围是140dB,但CD音频(16位)大约是90dB。

pydub提供辅助函数,用于在两个卷之间淡入淡出以及仅应用增益:

from pydub import AudioSegment
from pydub.utils import ratio_to_db, db_to_float

sound = AudioSegment.from_file('/your/file.wav')

# this is roughly -6.0
half_amplitude_in_db = ratio_to_db(0.5)

# these are all roughly the same result
half_amplitude1 = sound.apply_gain(half_amplitude_in_db)
half_amplitude2 = sound.apply_gain(-6.0)
half_amplitude3 = sound - 6.0

# Assuming 16-bit sound, that’s ~90dB dynamic range.
# so -45dB is half way to silent.
# Note: that is A LOT quieter
half_way_to_silent = sound - 45.0

希望这有帮助。

注意:查看规范我认为你需要这样做:

web_API_gain_value = 0.5

gain_in_db = ratio_to_db(web_API_gain_value)

sound_after_gain = sound.apply_gain(gain_in_db)