通过对音频信号提取梅尔频谱图并转换为对数梅尔频谱图得到的。它的形状主要由以下参数决定 转换成图片 64*64像素
转换成图片 64*64
在你的代码中,log_mel_spectrogram
是通过对音频信号提取梅尔频谱图并转换为对数梅尔频谱图得到的。它的形状主要由以下参数决定:
n_mels
:梅尔频带的数量,决定了频谱图的频率维度。hop_length
:帧移,决定了时间维度的分辨率。- 音频时长:音频的总时长,决定了频谱图的时间维度的长度。
1. 理论计算
假设音频时长为 ( T ) 秒,采样率为 ( sr ) Hz,帧移为 ( hop_length ) 样本。
-
时间维度:时间维度的长度可以通过以下公式计算:
[
\text{时间维度长度} = \left\lfloor \frac{T \times sr}{hop_length} \right\rfloor + 1
]
其中,(\lfloor x \rfloor) 表示向下取整。 -
频率维度:频率维度由
n_mels
决定,即为n_mels
。
因此,log_mel_spectrogram
的形状为 (n_mels, 时间维度长度)
。
2. 示例计算
假设音频时长为 2 秒,采样率为 16000 Hz,hop_length = int(sr * 0.025)
,n_mels = 64
。
-
时间维度长度:
[
\text{时间维度长度} = \left\lfloor \frac{2 \times 16000}{400} \right\rfloor + 1 = \left\lfloor \frac{32000}{400} \right\rfloor + 1 = 80 + 1 = 81
] -
频率维度:
n_mels = 64
因此,log_mel_spectrogram
的形状为 (64, 81)
。
3. 验证代码
你可以在代码中添加以下内容来验证计算结果:
import librosa
import numpy as np# 加载音频文件
audio_path = 'K:\\download\\青衫忆笙\\data\\yasuoji\\OK\\%7C05B6SP5UX-3.18R.wav'
y, sr = librosa.load(audio_path, sr=16000)# 提取梅尔频谱图
n_mels = 64
hop_length = int(sr * 0.025)
n_fft = 1024
mel_spectrogram = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=n_mels, hop_length=hop_length, n_fft=n_fft)# 转换为对数梅尔频谱图
log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max)# 打印形状
print("log_mel_spectrogram 的形状:", log_mel_spectrogram.shape)
运行这段代码后,你将看到 log_mel_spectrogram
的实际形状,与理论计算结果进行对比。
4. 注意事项
- 如果音频时长不是精确的 2 秒,实际计算的时间维度长度可能会略有不同。
- 如果音频文件有问题(例如文件损坏或格式不支持),可能会导致加载失败或形状异常。