首页 > 解决方案 > 有没有办法在 python 中使用 Librosa 为音频信号增加增益?

问题描述

我目前正在用 Python 增强音频。由于 Librosa 的速度和简单性,我一直在使用它,但需要使用 PyDub 以获取其他一些实用程序,例如应用增益。

有没有一种数学方法可以为 librosa.load 提供的 Numpy 数组增加增益?在 PyDub 中这很容易,但我必须不断地在 Pydub 的 get_array_of_samples() 到 np.array 之间转换回来,然后转换为 [-1,1) 尺度上的正确 32 位浮点表示(Librosa 默认使用)。为简单起见,我宁愿将它们全部保存在一个库中。

此外,预先将音频信号标准化为 0 db 增益也很有用。我对音频信号处理中使用的许多术语有点陌生。

这就是我目前正在做的事情。在路上,我想让它成为一个类方法,从使用 librosa 的 numpy 数组开始,所以如果有一种方法可以在数学上将特定单元中的指定增益添加到 librosa 的 numpy 数组中,那将是理想的。

谢谢

import librosa
import numpy as np

from pydub import AudioSegment, effects

pydub_audio = AudioSegment.from_file(audio_file_path)
pydub_audio = pydub_audio.set_frame_rate(16000) # make file 16k khz frame rate

print("Original dBFS is {}".format(pydub_audio.dBFS))
pydub_audio = pydub_audio.apply_gain(20) # apply 20db of gain to introduce clipping
#pydub_audio = effects.normalize(pydub_audio)
print("New dBFS is {}".format(pydub_audio.dBFS))

pydub_array = pydub_audio.get_array_of_samples()
pydub_array = np.array(pydub_array)
print("PyDub audio type is {}".format(pydub_array.dtype))

pydub_array_32bitfloat = pydub_array.astype(np.float32, order = 'C') / 32768 # rescaling to between [-1, 1] like librosa
print("Rescaled Pydub type is {}".format(pydub_array_32bitfloat.dtype))

import soundfile as sf
sf.write(r"test_pydub_gain.wav", pydub_array_32bitfloat, samplerate = 16000, format = 'wav')

标签: pythonpython-3.xaudio-processinglibrosapydub

解决方案


考虑一下,(如果我没记错的话),数学上的增益是:dBFS = 20 * log (level2 / level1) 所以我会将数组的所有元素乘以 10**(dBFS/20) 以应用增益


推荐阅读