音频特征Mel Frequency Cepstral Coefficient (MFCC)提取(语音识别)

音频特征Mel Frequency Cepstral Coefficient (MFCC)提取(语音识别)

在机器学习的的任务中,特征工程是非常重要的一个环节。同样对于语音识别来说,提取音频特征也是非常重要的一个环节。Mel Frequency Cepstral Coefficents (MFCCs)是由Davis 和 Mermelstein于1980年提出,之后在语音识别任务中扮演着重要的角色。

人通过声道产生声音,声道的shape(形状?)决定了发出怎样的声音。声道的shape包括舌头,牙齿等。如果我们可以准确的知道这个形状,那么我们就可以对产生的音素phoneme进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCCs就是一种准确描述这个包络的一种特征。所以MFCCs是语音识别系统的一个重要特征。下面开始进入正题。

MFCCs特征提取过程包括:

  • 对音频信号预加重、分帧和加窗
  • FFT(快速傅里叶变换)得到频谱
  • 频谱通过Mel滤波器组得到Mel频谱
  • 在Mel频谱上面进行倒谱分析得到MFCC特征

预加重

预加重的目的是提升高频部分,对语音的高频部分进行加重,去除口唇辐射的影响,增加语音的高频分辨率使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用同样的信噪比求频谱。原因是因为对于语音信号来说,语音的低频段能量较大,能量主要分布在低频段,语音的功率谱密度随频率的增高而下降,这样,鉴频器输出就会高频段的输出信噪比明显下降,从而导致高频传输衰弱,使高频传输困难,这对信号的质量会带来很大的影响。因此,在传输之前把信号的高频部分进行加重,然后接收端再去重,能够提高信号传输质量。

预加重处理其实是将语音信号通过一个高通滤波器:

xp(n)=x(n)k(n1)k01使0.90.97

分帧

语音信号的变化是非常迅速的,但是通常傅里叶变换适用于分析平稳的信号。我们假设在较短的时间跨度范围内,语音信号的变换是平坦的,一般取这个时间跨度为20ms-40ms。为什么取这个范围呢,因为能够保证一帧内既有足够多的周期,又不会变化太剧烈。

加窗

每帧信号通常要与一个平滑的窗函数相乘,让帧两端平滑地衰减到零,这样可以降低傅里叶变换后旁瓣的强度,取得更高质量的频谱。对每一帧,选择一个窗函数,窗函数的宽度就是帧长。常用的窗函数有矩形窗、汉明窗、汉宁窗、高斯窗等。

以汉明窗为例:

wham(n)=αβcos(2πnN1)α=0.53836,β=0.46164

FFT(快速傅里叶变换)

由于信号在时域上的变换通常很难看出信号的特性,所以通常将它转换为频域上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。所以在乘上汉明窗后,每帧还必须再经过快速傅里叶变换以得到在频谱上的能量分布(FFT不是这篇文章的重点,公式网上很多,这里就不在重复)。

在介绍下一个过程之前有必要知道一下需要知道以下几个概念:

声谱图(Spectrogram)

通过前面几步,我们把一段语音进行预加重,分帧,加窗后进行FFT后,每帧语音都对应于一个频谱(Spectrum)。

Spectrum

将其中一帧语音的频谱通过坐标表示出来,如下图左。现在我们将左边的频谱旋转90度。得到中间的图。然后把这些幅度映射到一个灰度级表示0~255(灰度图),0表示黑,255表示白色。幅度值越大,相应的区域越黑。这样就得到了最右边的图。那为什么要这样呢?为的是增加时间这个维度,这样就可以显示一段语音而不是一帧语音的频谱,而且可以直观的看到静态和动态的信息。
这里写图片描述

这样我们会得到一个随着时间变化的频谱图,这个就是描述语音信号的spectrogram声谱图

这里写图片描述

下图是一段语音的声谱图,很黑的地方就是频谱图中的峰值(共振峰formants)
这里写图片描述

声谱图(Spectrogram)能带给我们什么呢:
- 音素(Phones)以及它们的属性更易于观察
- 通过观察共振峰和它们的转变可以更好的识别声音
- 隐马尔科夫模型(Hidden Markov Models)就是隐含地对声谱图进行建模以达到好的识别性能
- 能够直观的评估TTS系统(text to speech)的好坏,直接对比合成的语音和自然的语音声谱图的匹配度即可

下面是一个语音的频谱图。峰值就表示语音的主要频率成分,我们把这些峰值称为共振峰(formants),而共振峰就是携带了声音的辨识属性(就是个人身份证一样)。所以它特别重要。用它就可以识别不同的声音,我们需要把它提取出来。

这里写图片描述

但是我们要提取的不仅仅是共振峰的位置,还得提取它们转变的过程。所以我们提取的是频谱的包络(Spectral Envelope)。这包络就是一条连接这些共振峰点的平滑曲线。

这里写图片描述

频谱有包络和精细结构,分别对应音色与音高。我们需要把它们分开,从而得到我们需要的包络。那怎么把他们分离开呢?也就是,怎么在给定log X[k]的基础上,求得log H[k] 和 log E[k]以满足log X[k] = log H[k] + log E[k]呢?
为了达到这个目标,我们对频谱做FFT。在频谱上做傅里叶变换就相当于逆傅里叶变换Inverse FFT (IFFT)。需要注意的一点是,我们是在频谱的对数域上面处理的,这时候,在对数频谱上面做IFFT就相当于在一个伪频率(pseudo-frequency)坐标轴上面描述信号。
这里写图片描述

由下面这个图我们可以看到,包络是主要是低频成分(这时候需要转变思维,这时候的横轴就不要看成是频率了,咱们可以看成时间),我们把它看成是一个每秒4个周期的正弦信号。这样我们在伪坐标轴上面的4Hz的地方给它一个峰值。而频谱的细节部分主要是高频。我们把它看成是一个每秒100个周期的正弦信号。这样我们在伪坐标轴上面的100Hz的地方给它一个峰值。把它俩叠加起来就是原来的频谱信号了。

这里写图片描述

在实际中咱们已经知道log X[k],所以我们可以得到了x[k]。那么由图可以知道,h[k]是x[k]的低频部分,那么我们将x[k]通过一个低通滤波器就可以得到h[k]了!没错,到这里咱们就可以将它们分离开了,得到了我们想要的h[k],也就是频谱的包络。
x[k]实际上就是倒谱Cepstrum(这个是一个新造出来的词,把频谱的单词spectrum的前面四个字母顺序倒过来就是倒谱的单词了)。而我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。
那现在总结下倒谱分析,它实际上是这样一个过程:
1)将原语音信号经过傅里叶变换得到频谱:X[k]=H[k]E[k];
只考虑幅度就是:|X[k] |=|H[k]||E[k] |;
2)我们在两边取对数:log||X[k] ||= log ||H[k] ||+ log ||E[k] ||。
3)再在两边取逆傅里叶变换得到:x[k]=h[k]+e[k]。
这里写图片描述
总结下,倒谱(cepstrum)就是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。

通过Mel滤波器组得到Mel频谱

好了,到这里,我们先看看我们刚才做了什么?给我们一段语音,我们可以得到了它的频谱包络(连接所有共振峰值点的平滑曲线)了。但是,对于人类听觉感知的实验表明,人类听觉的感知只聚焦在某些特定的区域,而不是整个频谱包络。
而Mel频率分析就是基于人类听觉感知实验的。实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的)。也就说,它只让某些频率的信号通过,而压根就直接无视它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上却不是统一分布的,在低频区域有很多的滤波器,他们分布比较密集,但在高频区域,滤波器的数目就变得比较少,分布很稀疏。
这里写图片描述

人的听觉系统是一个特殊的非线性系统,它响应不同频率信号的灵敏度是不同的。在语音特征的提取上,人类听觉系统做得非常好,它不仅能提取出语义信息, 而且能提取出说话人的个人特征,这些都是现有的语音识别系统所望尘莫及的。如果在语音识别系统中能模拟人类听觉感知处理特点,就有可能提高语音的识别率。

梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)考虑到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。

将普通频率转化到Mel频率的公式是:
mel(f)=2595log10(1+f/700)

由下图可以看到,它可以将不统一的频率转化为统一的频率,也就是统一的滤波器组。
这里写图片描述

在Mel频谱上面进行倒谱分析得到MFCC特征

我们将频谱通过一组Mel滤波器就得到Mel频谱。公式表述就是:log X[k] = log (Mel-Spectrum)。这时候我们在log X[k]上进行倒谱分析:
1)取对数:log X[k] = log H[k] + log E[k]。
2)进行逆变换:x[k] = h[k] + e[k]。
在Mel频谱上面获得的倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC。

整个过程如下图所示:
这里写图片描述

这里写图片描述

通过这个MFCC特征提取过程,语音就可以通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。语音识别系统就可以接着在MFCC特征的基础上进行训练和识别了。


参考文献

[1]: http://blog.csdn.net/zouxy09/article/details/9156785 拜读这篇博客后改的,加入了一些个人理解,有兴趣的可以去看看原文,原博主写的很好

  • 21
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值