机器学习中的音频特征:理解Mel频谱图


机器学习中的音频特征:理解Mel频谱图

文章插图
 
如果你像我一样 , 试着理解mel的光谱图并不是一件容易的事 。你读了一篇文章 , 却被引出了另一篇 , 又一篇 , 又一篇 , 没完没了 。我希望这篇简短的文章能澄清一些困惑 , 并从头解释mel的光谱图 。
信号信号是一定量随时间的变化 。对于音频 , 变化的量是气压 。我们如何以数字方式捕获此信息? 我们可以随时间采集气压样本 。我们采样数据的速率可以变化 , 但是最常见的是44.1kHz , 即每秒44,100个采样 。我们捕获的是信号的波形 , 可以使用计算机软件对其进行解释 , 修改和分析 。
import librosaimport librosa.displayimport matplotlib.pyplot as plty, sr = librosa.load('./example_data/blues.00000.wav')plt.plot(y);plt.title('Signal');plt.xlabel('Time (samples)');plt.ylabel('Amplitude');
机器学习中的音频特征:理解Mel频谱图

文章插图
 
我们可以使用音频信号的数字表示形式 。欢迎来到信号处理领域! 您可能想知道 , 我们如何从中提取有用的信息? 看起来像是一团混乱 。这就引出我们的朋友傅里叶 , 这里是它最熟悉的领域 。
傅立叶变换音频信号由几个单频声波组成 。在一段时间内对信号进行采样时 , 我们仅捕获得到的幅度 。傅立叶变换是一个数学公式 , 它使我们可以将信号分解为单个频率和频率幅度 。换句话说 , 它将信号从时域转换到频域 。结果称为频谱 。
这是可能的 , 因为每个信号都可以分解为一组正弦波和余弦波 , 它们加起来等于原始信号 。这是一个著名的定理 , 称为傅立叶定理 。
快速傅立叶变换(FFT)是一种可以有效计算傅立叶变换的算法 。它广泛用于信号处理 。我将在示例音频的窗口片段中使用此算法 。
import numpy as npn_fft = 2048ft = np.abs(librosa.stft(y[:n_fft], hop_length = n_fft+1))plt.plot(ft);plt.title('Spectrum');plt.xlabel('Frequency Bin');plt.ylabel('Amplitude');
机器学习中的音频特征:理解Mel频谱图

文章插图
 
频谱图快速傅立叶变换是一种功能强大的工具 , 可让我们分析信号的频率成分 , 但是如果信号的频率成分随时间变化 , 该怎么办? 大多数音频信号(例如音乐和语音)就是这种情况 。这些信号称为非周期性信号 。我们需要一种表示这些信号随时间变化的频谱的方法 。您可能会想 , "嘿 , 我们不能通过对信号的多个窗口部分执行FFT来计算多个频谱吗?" 是! 这正是完成的工作 , 称为短时傅立叶变换 。FFT是在信号的重叠窗口部分上计算的 , 我们得到了所谓的频谱图 。哇! 需要接受很多东西 。这里有很多事情要做 。良好的视觉效果是必须的 。
机器学习中的音频特征:理解Mel频谱图

文章插图
 
您可以将频谱图视为一堆相互堆叠的FFT 。当信号在不同频率下随时间变化时 , 这是一种直观地表示信号响度或幅度的方法 。计算频谱图时 , 还有一些其他细节 。y轴转换为对数刻度 , 颜色尺寸转换为分贝(您可以将其视为振幅的对数刻度) 。这是因为人类只能感知到非常小的集中频率和幅度范围 。
spec = np.abs(librosa.stft(y, hop_length=512))spec = librosa.amplitude_to_db(spec, ref=np.max)librosa.display.specshow(spec, sr=sr, x_axis='time', y_axis='log');plt.colorbar(format='%+2.0f dB');plt.title('Spectrogram');
机器学习中的音频特征:理解Mel频谱图

文章插图
 
仅用几行代码 , 我们就创建了一个频谱图 。好 。我们对"频谱图"部分有扎实的了解 , 但对"MEL"则如何 。他是谁?
梅尔(Mel)量表研究表明 , 人类不会感知线性范围的频率 。我们在检测低频差异方面要胜于高频 。例如 , 我们可以轻松分辨出500 Hz和1000 Hz之间的差异 , 但是即使之间的距离相同 , 我们也很难分辨出10,000 Hz和10,500 Hz之间的差异 。
1937年 , Stevens , Volkmann和Newmann提出了一个音高单位 , 以使相等的音高距离听起来与听众相等 。这称为梅尔音阶 。我们对频率执行数学运算 , 以将其转换为mel标度 。


推荐阅读