相同参数音频生成梅尔频谱图背景色不一致如何解决
你遇到的频谱图背景不一致问题,核心是单条音频独立计算动态范围、色阶自动适配导致的,按以下步骤修改即可:
- 第一步:固定分贝转换的全局参数
你当前调用librosa.power_to_db时没有指定参考值和动态范围上限,函数会默认使用单条音频的最大功率作为参考,每条音频的参考值不同自然会导致背景亮度差异。可以固定ref参数为全局统一值,同时指定top_db限制最大动态范围即可。 - 第二步:固定可视化的色阶范围
调用librosa.display.specshow时增加vmin和vmax参数,锁定颜色映射的上下阈值,避免matplotlib自动适配每条音频的数值范围拉伸色阶。 - 第三步:训练用特征做全局归一化
如果是为了提升模型训练效果,除了可视化层面的背景统一,更重要的是保证输入特征的分布一致。不要对单条音频做独立归一化,而是提前统计整个训练集所有log mel频谱的均值、方差、最大最小值,用全局统计量对所有样本做统一的min-max归一化或者z-score归一化,这样模型接收到的特征分布是稳定的,识别准确率会有明显提升。
修改后可直接运行的完整代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import librosa as lr import librosa.display import glob path = r'/content/drive/MyDrive/ESC-50/305 - Coughing/*.ogg' a = glob.glob(path) print(len(a)) # 固定全局分贝转换参数,也可提前统计所有样本的mel频谱最大值作为ref值 fixed_ref = 1.0 fixed_top_db = 80 for file in range(0,len(a),1): scale, sr = librosa.load(a[file]) mel_spectrogram = librosa.feature.melspectrogram(scale, sr=sr, n_fft=1024, hop_length=512, n_mels=228) # 用固定参数做分贝转换 log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=fixed_ref, top_db=fixed_top_db) plt.figure(figsize=(10, 5)) # 锁定色阶显示范围 librosa.display.specshow(log_mel_spectrogram, x_axis="time", y_axis="log", sr=sr, vmin=-fixed_top_db, vmax=0) plt.colorbar(format="%+2.f") plt.show()
内容的提问来源于stack exchange,提问作者Adil Asif
相关产品推荐
相关产品推荐

