python - 有没有办法在 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')
解决方案
考虑一下,(如果我没记错的话),数学上的增益是:dBFS = 20 * log (level2 / level1) 所以我会将数组的所有元素乘以 10**(dBFS/20) 以应用增益
推荐阅读
- powerbi - 将包装的表数据转换为列
- python - 如何将此代码中的数据保存在单独的文件中以创建机器学习模型?
- angular - Angular:将请求结果转换为可观察的
- c++ - 无法理解这段代码的含义
- python - 为什么我的 python discord bot 突然重复对命令的响应
- java - Spring Boot RequestMapping 上的“Consumes”默认为“application/octet-stream”,设置时为 null
- python - 为什么在函数中修改列表会改变原始列表,但在函数中声明它们会创建一个新对象?
- reactjs - ./node_modules/leaflet/dist/leaflet.css 3:0 中的错误 > 您可能需要适当的加载程序来处理此文件类型
- sql-server - SQL Server:函数在一个视图中工作,在另一个视图中返回权限错误
- css - 子 SVGSVGElement 在转换过渡期间消失(Safari/Chrome)