如何将梅尔频谱图转换为对数刻度的梅尔频谱图

数据挖掘 Python 语音转文本
2021-10-15 10:59:25

我正在阅读这篇关于使用卷积神经网络进行环境噪声识别的论文,并希望重现他们的结果。他们将 WAV 文件转换为对数刻度的 mel 频谱图。你怎么做到这一点?我能够将 WAV 文件转换为 mel 频谱图

y, sr = librosa.load('audio/100263-2-0-117.wav',duration=3)
ps = librosa.feature.melspectrogram(y=y, sr=sr)
librosa.display.specshow(ps, y_axis='mel', x_axis='time')

梅尔谱图

我还可以将其显示为对数比例的频谱图:

librosa.display.specshow(ps, y_axis='log', x_axis='time')

对数缩放图像

显然,它们看起来不同,但实际的频谱图ps是相同的。使用 librosa,如何将此 melspectrogram 转换为 log 比例的 melspectrogram?此外,对数比例的频谱图比原始频谱图有什么用?是只是为了降低频域的方差,使其与时间轴具有可比性,还是别的什么?

2个回答

我认为您错误地解释了作者所说的对数刻度的含义。当作者提到对数标度时,他们指的不是频率 (y) 轴,​​尽管频谱图通常在这里是对数标度的。相反,它们指的是频谱图中第三维的比例。在您的情况下,原始频谱图以颜色显示功率你想要的是比例的分贝。

在您的情况下,代码如下所示:

y, sr = librosa.load('audio/100263-2-0-117.wav',duration=3)
ps = librosa.feature.melspectrogram(y=y, sr=sr)
ps_db= librosa.power_to_db(ps, ref=np.max)

lr.display.specshow(ps_db, x_axis='time', y_axis='mel')

注意:每个频谱图都将根据 librosa.power_to_db 中的 ref 进行缩放。如果您不提供任何东西,librosa 只会在其中插入一个 1,这可能是您要查找的内容,也可能不是。你也可以试试 np.median。

这是使用 python scipy 将音频特征提取为日志频谱图的示例代码:

from scipy.io import wavfile
from scipy import signal

sample_rate=16000
window_size=20
step_size=10
eps=1e-10
rate, data = wavfile.read('filename.wav')
if data.ndim > 1 : # ignore  channels 2+
    data = data[:, 0]
nperseg = int(round(window_size * sample_rate / 1e3))
noverlap = int(round(step_size * sample_rate / 1e3))
freqs, times, spec = signal.spectrogram(data,fs=sample_rate,window='hann',nperseg=nperseg,noverlap=noverlap)
log_specgram = np.log(spec.T.astype(np.float32) + eps)