音频项目中,比如识别,重建或者生成任务之前通常都需要将音频从时域转换到频域,提取特征后再进行后续工作。MFCC(Mel-Frequency Cepstral Coefficients),梅尔倒谱系数,就是比较常用的音频特征提取方式。本文主要介绍mfcc提取流程。
介绍之前还是先介绍一些基本概念
时域频域
时域(Time domain)是描述数学函数或物理信号对时间的关系。例如一个信号的时域波形可以表达信号随着时间的变化。
频域(frequency domain)是描述信号在频率方面特性时用到的一种坐标系。正弦波是频域中唯一存在的波形,这是频域中最重要的规则,即正弦波是对频域的描述,因为频域中的任何波形都可用正弦波合成。
时域和频域可以用下图表示,上篇文章的一些变换也是在时频域的转换。
波形图和声谱图
常说的波形图是指时域分析,横轴是时间,纵轴是信号的变化。其动态信号x(t)是描述信号在不同时刻取值的函数。
常说的声谱图或者频谱图是指频域分析,横轴是频率,纵轴是该频率信号的幅度。
通常使用的librosa.display.specshow得到的如下声谱图横坐标是时间。因为经过了stft变换,记录的短时窗口的不同频率的振幅,y轴(频率)转换为对数刻度,颜色尺寸(幅度)转换为分贝,形成频谱图。
具体过程如下图,后面介绍mfcc时会详细介绍。
频谱倒谱
倒频谱(信号)是信号频谱取对数的傅里叶变换后的新频谱(信号),有时候会称频谱的倒频谱。
同态处理是一种设法将非线性问题转化为线性问题来进行处理的方法,它能将两个通过乘法或卷积合成的信号分开。
语音信号x(n)就可以看作是声门激励信号x1(n)和声道冲激响应x2(n)的卷积。频谱倒谱分析就是同态处理算法,目的就是将原始信号中很难分离的声门激励信号和声道冲击信号分离开,得到包络和频谱的细节更好的做后续的分析。包络部分对应的是频谱的低频信息,而细节部分对应的是频谱的高频信息。
算法过程:信号 -> 傅立叶变换 -> 取绝对值 -> 取对数 -> 相位展开 -> 逆傅立叶变换 -> 倒频谱。
MFCCs(Mel-Frequency Cepstral Coefficients)
梅尔频率倒谱系数就是组成梅尔频率倒谱的系数。倒谱和梅尔频率倒谱的区别在于,梅尔频率倒谱的频带划分是在梅尔刻度上等距划分的,它比用于正常的对数倒频谱中的线性间隔的频带更能近似人类的听觉系统。
由于能量频谱中还存在大量的无用讯息,尤其人耳无法分辨高频的频率变化,因此让频谱通过梅尔滤波器。 梅尔滤波器,也就是一组20个非线性分布的三角带通滤波器,能求得每一个滤波器输出的对数能量。必须注意的是:这 20 个三角带通滤波器在'梅尔刻度'的频率上是平均分布的。 梅尔频率代表一般人耳对于频率的感受度,由此也可以看出人耳对于频率 f 的感受是呈对数变化的。
MFCCs获取的一般流程:
预加重
通常高频能量比低频能量小,预加重滤波器主要为了放大高频,消除发声过程中声带和嘴唇的效应,来补偿语音信号受到发音系统所抑制的高频部分,也为了突出高频的共振峰。
使用一个高通滤波器实现,alpha通常去0.97
分帧
语音信号是短时平稳信号,所以我们通常是对短时帧窗口内进行特征提取操作。同时为了避免连续帧差别太大,我们取相邻两帧之间会有重叠部分。
加窗
分帧后,我们一般会对每帧乘以一个窗函数来平滑信号,如Hamming窗口。目的是增加帧两端的连续性,减少后续操作对频谱泄漏。
实现:
频域转换
频域转换就是上文中提到对傅立叶变换了。这里称为短时傅立叶变换(STFT),本文就不做更多介绍。目的就是将信号从时域转换倒频域。
功率谱
对语音信号的频谱取模平方,得到语音信号的谱线能量
提取mel刻度
计算Mel滤波器组,将功率谱通过一组Mel刻度(通常取40个滤波器,nfilt=40)的三角滤波器(triangular filters)来提取频带。
Mel刻度的目的是模拟人耳对声音的非线性感知,在较低的频率下更具辨别力,在较高的频率下则不具辨别力。
计算方法:对于FFT得到的幅度谱,分别跟每一个滤波器进行频率相乘累加,得到的值即为该帧数据在该滤波器对应频段的能量值。
得到MFCCs
以上步骤中计算的滤波器组系数是高度相关的,我们可以应用离散余弦变换(DCT)对滤波器组系数去相关处理,并产生滤波器组的压缩表示。将上一步得到的能量对数带入到离散余弦变换公式得到MFCCs:
其中L阶指MFCC系数阶数,通常取13。m就是上一步周mel滤波器对个数。
下一篇上代码,通过代码再详细理解~