1

我正在覆盖一堆音频片段,并希望能够以 (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 创建音频水平远低于我在浏览器中使用相同值可以观察到的水平。

需要注意的是,我的音频技术知识非常有限。这些仅仅是由不同的音频设备、音频实现细节等造成的技术误差吗?如果是这样的话,有人可以建议我做这个缩放的最“正确”的方法吗?

4

1 回答 1

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)
于 2015-02-07T22:37:19.170 回答