python - 重新创建 Web Audio API GainNode 行为

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

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

最佳答案

我的第一个问题是 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)

关于python - 重新创建 Web Audio API GainNode 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383625/

相关文章:

python - 在Python中绘制音频频谱图

Android 自动音频播放 - 看不到按钮

python - 使用 pyDub 生成静音

python - 如何将二进制数据恢复到音频文件中?

python - 将 Matplotlib 图另存为 TIFF

python - 可视化交锋记录的最佳方式是什么?

python - Pandas:标记另一列标志之间的值

python - python 中是否有任何方法或框架可以从 xml 创建对象模型?

matlab - 我可以使用什么MATLAB函数添加声音片段?

python-3.x - pydub.AudioSegment 在从 numpy.ndarray 加载时弄乱了音频数据