语音识别学习记录 [语音信号的一种处理方式(MFCCs特征提取)]

写这一篇博客主要是因为在看一些语音识别方面的论文时,论文中对语音信号的处理过程都是一概而过,感觉一直很模糊,所以今天特意找了一些相关的博客看了看。而对语音信号的处理我找到的相关的文章大部分都是在说MFCC,正好之前MFCC我也没详细看,所以一起仔细理解一下MFCC特征提取的原理和过程。通过下文可以了解语音信号处理的一般过程、FFT在语音信号处理过程中的使用,傅里叶变换的作用等基础知识。

傅里叶变换

首先说一下傅里叶变换对信号的处理,傅里叶变换可以将时域信号变换为频域信号,在语音信号处理过程中,可以将原始的声音信号根据频率分离出来,在频域中展示(频谱图)。由于原始的声音信号一般是连续无周期的,所以对声音信号进行傅里叶变换是要对原始信号惊醒分段,即短时傅里叶变换。关于FT的理解本文不再赘述,可以参考傅里叶分析之掐死教程(完整版)更新于2014.06.06。该文章从应用的角度说明了傅里叶变换到底是什么东西,浅显易懂,对于我这种之前只会做题的人帮助很大。

Melscale

梅尔刻度(melscale),它是基于彼此等距的听众对音高(pitch)的感性判断的刻度。因为人对不同频率的声音的感知度不同,所以人耳对不同音调的声音的感知度关系比较复杂。在Mel频域内,人对音调的感知度与Melscale为线性关系。举例来说,如果两段语音的Mel频率相差两倍,则人耳听起来两者的音调也相差两倍。普通频率fmel频率之间的关系为:

                                                                  mel(f)=2595*lg(1+f/700.0)

由下图可以看到melscale和频率之间的关系。

下面是MFCC特征提取的简单过程,部分内容转自梅尔频率倒谱系数(MFCC) 学习笔记

一、声谱图(Spectrogram)

语音处理过程中,如何去描述语音信号很重要。因为不同的描述方式反应不同的信息,对信息处理的难易性也会造成影响。什么样的描述方式才利于语音信号的观测和理解呢?先来了解一个叫声谱图的东西。

上图中的语音被分为很多帧,每帧语音都对应于一个频谱(通过短时FFT计算),频谱表示频率与能量的关系。在实际使用中,频谱图有三种,即线性振幅谱、对数振幅谱、自功率谱(对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB(分贝)。这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号)。

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

以上方式的过程:

下图是一段语音的声谱图,颜色深度取到极值的地方就是频谱图中的峰值(共振峰formants)。

使用声谱图去描述语音信号有很多优点,首先,音素(Phones)的属性可以更好的在这里面观察出来。另外,通过观察共振峰和它们的转变可以更好的识别声音。隐马尔科夫模型(Hidden Markov Models)就是隐含地对声谱图进行建模以达到好的识别性能。

所以通过对语音进行分帧进行时频变换,得到每一帧的FFT频谱再将各帧频谱按照时间顺序排列起来,得到时间-频率-能量分布图。很直观的表现出语音信号随时间的频率中心的变化。

二、倒谱分析(Cepstrum Analysis)

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

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

我们可以这么理解,将原始的频谱由两部分组成:包络和频谱的细节。这里用到的是对数频谱,所以单位是dB。那现在我们需要把这两部分分离开,这样我们就可以得到包络了。

那怎么把他们分离开呢?也就是,怎么在给定log(X[k])的基础上,求得log(H[k])log(E[k])以满足log(X[k]) = log(H[k]) + log(E[k])呢?

为了达到这个目标,我们需要Play a Mathematical Trick。这个Trick是什么呢?就是对频谱做FFT。在频谱上做傅里叶变换就相当于逆傅里叶变换Inverse FFT (IFFT)。需要注意的一点是,我们是在频谱的对数域上面处理的,这也属于Trick的一部分。这时候,在对数频谱上面做IFFT就相当于在一个伪频率(pseudo-frequency)坐标轴上面描述信号。

此时将上图的横轴看作时间轴,显然包络就是上图波形的低频部分。所以将上面的波形通过一个低通滤波器就可以得到频谱包络。

 在实际中已经知道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]。

       这实际上有个专业的名字叫做同态信号处理。它的目的是将非线性问题转化为线性问题的处理方法。对应上面,原来的语音信号实际上是一个卷性信号(声道相当于一个线性时不变系统,声音的产生可以理解为一个激励通过这个系统),第一步通过卷积将其变成了乘性信号(时域的卷积相当于频域的乘积)。第二步通过取对数将乘性信号转化为加性信号,第三步进行逆变换,使其恢复为卷性信号。这时候,虽然前后均是时域序列,但它们所处的离散时域显然不同,所以后者称为倒谱频域

三、Mel滤波器

通过前文,给我们一段语音,我们可以得到了它的频谱包络了。但是,对于人类听觉感知的实验表明,人类听觉的感知只聚焦在某些特定的区域,而不是整个频谱包络。

Mel滤波就是基于人类听觉感知实验的。实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的)。也就说,它只让某些频率的信号通过,而压根就直接无视它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上却不是统一分布的,在低频区域有很多的滤波器,他们分布比较密集,但在高频区域,滤波器的数目就变得比较少,分布很稀疏。

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

四、Mel频率倒谱系数(Mel-Frequency Cepstral Coefficients)

有些论文上写Melscale Fliterbanks Cepstral Coefficients,应该是一个意思吧。。。

我们将频谱通过一组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特征提取过程的总结:

1)先对语音进行预加重、分帧和加窗;(加强语音信号性能(信噪比,处理精度等)的一些预处理)

2)对每一个短时分析窗,通过FFT得到对应的频谱;(获得分布在时间轴上不同时间窗内的频谱)

3)将上面的频谱通过Mel滤波器组得到Mel频谱;(通过Mel频谱,将线形的自然频谱转换为体现人类听觉特性的Mel频谱)

4)在Mel频谱上面进行倒谱分析(取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;(倒谱分析,获得MFCC作为语音特征)

该过程如下图所示:

至此每一帧的语音都由一个MFCC特征向量表示。之后便是使用这些特征对系统进行训练了。

上文中用红色标注出来的部分是连我也没看太懂的部分,打算买一本语音信号处理的书看看,老是看博客感觉不太系统,欠缺的太多。关于上面说的语音信号各个状态(卷性、乘性、加性)的变换、倒谱的获取等我有了比较明白的理解再来解释一下。

MFCC特征参数提取中是MFCC特征提取的详细操作,可以看一下帮助理解。

关于MFCC的维度

MFCC的计算首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。一般我们用到的MFCC有12维、13维(加入F0能量)、39维(13维的MFCC加上13维的一阶导和13维的二阶导)。维数越大,对应的频率也越高。至于为什么要使用13维,我的理解是维度大于13对应的频率人已经无法区分了。而为什么使用MFCC的一阶导数和二阶导数,现在还没有什么理解。

猜你喜欢

转载自blog.csdn.net/u013569304/article/details/81479390