【发布时间】:2020-10-14 22:37:12
【问题描述】:
我目前正致力于在 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')
【问题讨论】:
-
应用增益只是放大信号,它只是乘以一个比例因子。比例因子可以从分贝值计算出来。
-
归一化到 -0dB 意味着缩放数据使得最大值为 1.0/-1.0
-
@jonnor 谢谢。现在我学到了更多,增益很简单。还要感谢关于规范化点的观点。我想这更像是“缩放”而不是标准化,对吗?归一化会更复杂,比如使用峰值幅度、RMS 等?
-
我上面提出的是使用峰值幅度
-
@jonnor 我将如何在数学上这样做?没有使用 PyDub,就是这样。我想了解数学上发生了什么。
标签: python python-3.x audio-processing librosa pydub