tensorflow语音识别之搞清楚梅尔频率倒谱系数(MFCC)的来龙去脉

对于声音识别,我们首先是提取特征。换句话说,我们需要把音频信号中具有辨识性的成分提取出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声啊,情绪啊等等。

语音是怎么产生的呢?

人通过声道产生声音,声道的形状(包括舌头,牙齿等)决定了发出怎样的声音。如果我们可以准确的知道这个形状,那么我们就可以对产生的音素进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCC就是一种准确描述这个包络的一种特征。

       既然声道的形状十分重要,那什么是功率谱?什么是包络?什么是MFCC?它为什么有效?如何得到?

      先往下看.....

一、声谱图

         我们处理的是语音信号,那么如何去描述它很重要。这里我们先来了解一个叫声谱图的东西。

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

疑惑、不应该是把振幅较低的成分拉低么?

解惑、振幅较低的成分如果拉低的话,就和低幅噪声掺杂在一起,周期性也看不出来了,低频成分是包络,后面会讲到;

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

疑惑、幅度值越大难道不是越白么,0才是黑啊

解惑、幅度值越大对应的灰度值越小

疑惑、最后竖立的灰度格就是功率谱么?

解惑、不是,功率谱是以下红色箭头的这个,那么竖格只是先人没有写出mfcc()函数的时候分析音素属性的

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

      下图是一段语音的声谱图,很黑的地方就是频谱图中的峰值(共振峰)
 

      那我们为什么要在声谱图中表示语音呢?

      首先,音素的属性可以更好的在这里面观察出来。其次,通过观察共振峰和它们的转变可以更好的识别声音

二、倒谱分析

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

疑惑、这里的频谱图是原信号的频谱还是分帧傅里叶变换的频谱?

解惑、分帧、加窗以后进行傅里叶变换的对数频谱,不是原始信号,因为横轴是hz

疑惑、声谱图有什么用,虽可人眼观察音素属性,但倒频分析都没用的到啊?

解惑、这个是供那些写mfcc函数的架构师看的!

 疑惑、共振峰是什么?

解惑、指在声音的频谱中能量相对集中的一些区域,共振峰不但是音质的决定因素,而且反映了声道(共振腔)的物理特征。

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

我们可以这么理解,将原始的频谱由两部分组成:包络和频谱的细节。

这里用到的是对数频谱,所以单位是dB。那现在我们需要把这两部分分离开,这样我们就可以得到包络了。

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

      为达目的,我们需要对频谱的对数域上做FFT(在频谱上做傅里叶变换就相当于),在对数频谱上面做IFFT就相当于在一个伪频率坐标轴上面描述信号。

疑惑、做傅里叶变换就相当于逆傅里叶变换IFFT是什么意思?

解惑、 我们现在想把频谱变成两个部分(包络与频谱的细节),傅里叶变换就是把一个变成多个的,功能上是傅里叶变换,实际上我们是做逆傅里叶变换;

疑惑、伪频率坐标轴是什么意思?

解惑、坐标轴实则是频率,但是我们可以看做是时间轴的;假装是频率坐标轴

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

疑惑、为什么每秒4个周期?

解惑、之前图中,标注了4个共振峰值,我们把这一段看做1s,那么就是每秒4个周期;

疑惑、我们在伪坐标轴上面的4Hz的地方给它一个峰值?应该是1/4HZ啊?

解惑、每秒4个周期,那个一个周期所用的时间是T=1/4=0.25s,那么f=1/T=1/0.25=4Hz;要搞清楚周期与频率与时间的关系。

疑惑、为什么包络是低频?为什么频谱的细节是高频?

解惑、我半年回家一次,她每个星期回家一次,那么按年为单位,我一年只回家2次,她一年52次,相对来说我是低频,她是高频;包络我们从图上看出,峰值的周期长,所以包络是低频,频谱的细节是高频

         把它俩叠加起来就是原来的频谱信号了


在实际中咱们已经知道log X[k],所以我们可以得到了x[k]。由图可知,h[k]是x[k]的低频部分,那么我们将x[k]通过一个低通滤波器就可以得到h[k]了!到这里咱们就可以将它们分离开了,得到了我们想要的h[k],也就是频谱的包络。

       x[k]实际上就是倒谱。而我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。

疑惑:为什么x[k]是倒频?

解惑、因为x[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]

我们现在正处于取对数、逆傅里叶变换这里..........

疑惑、为什么取逆傅里叶变换是x[k]=h[k]+e[k]?

解惑、我们从原语音信号经过傅里叶变换到对数频谱log||X[k] ||= log ||H[k] ||+ log ||E[k] ||,现在从对数频谱到原语音信号是逆傅里叶变换。

疑惑、从傅里叶变换再到逆傅里叶变换的目的是为了什么?

解惑、为了使得原始频谱变成包络+频谱的细节

       这有个专业的名字叫做同态信号处理。它的目的是将非线性问题转化为线性问题的处理方法。

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

疑惑、卷积信号是什么?

解惑、关键在于卷积两字

简单吧?无非是平移(没有反褶!)、叠加。
从这里,可以看到卷积的重要的物理意义是:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加。

这就是卷积的意义:加权叠加。

对于线性时不变系统,如果知道该系统的单位响应,那么将单位响应和输入信号求卷积,就相当于把输入信号的各个时间点的单位响应 加权叠加,就直接得到了输出信号。

通俗的说:
在输入信号的每个位置,叠加一个单位响应,就得到了输出信号。这正是单位响应是如此重要的原因。

以上是知乎上排名最高的回答。比较简单易懂。
 

疑惑、乘性信号什么意思?

解惑、就是把两个信号进行相乘,卷积与相乘是不一样的;

      倒谱是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。它的计算过程如下:

三、Mel频率分析

       到这里,我们先看看我们刚才做了什么?给我们一段语音,我们可以得到了它的频谱包络了。但是,对于人类听觉感知的实验表明,人类听觉的感知只聚焦在某些特定的区域,而不是整个频谱包络。

       而Mel频率分析就是基于人类听觉感知实验的。实验观测发现人耳就像一个滤波器组一样,人的听觉对频率是有选择性的。它只让某些频率的信号通过,而无视它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上不是均匀分布的,在低频区域多滤波器而且分布密集,但高频区域的滤波器的数目少且分布稀疏。

疑惑、这个Mel频率分析用在提取mfcc的哪个环节?

解惑、一段原始音频,分帧、加窗、傅里叶变换得到频谱,把这个频谱进行Mel频率分析.......我们现在在处于这个阶段,然后在对Mel频谱进行倒频分析

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

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

        将普通频率转化到Mel频率的公式是:

疑惑、 线性频谱是什么意思?

解惑、线性指的是x轴与y轴存在y=kx+b的关系


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

疑惑、这个图是什么意思?看不懂?

解惑、x轴是普通频率,y轴是mel的频率;这个是模仿人耳听觉系统的滤波设计;

当频率从0-500,有两个滤波组,频率变大听觉感觉明显声调变大;

当频率从4000-4500频率增大感受不出变换,升到5000以上才会有变换了;

mel频率就是模仿人耳实际听觉效果!

    

在Mel频域内,人对音调的感知度为线性关系。举例来说,如果两段语音的Mel频率相差两倍,则人耳听起来两者的音调也相差两倍。

 

四、Mel频率倒谱系数

       我们将频谱通过一组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滤波器-取对数-逆变换-提取Mfcc特征;与上面的取对数、逆变换是一个,一开始将大概的流程,然后再逐步串联;

      在Mel频谱上面获得的倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC


现在咱们来总结下提取MFCC特征的过程:

1)先对语音进行预加重、分帧和加窗;

2)对每一个短时分析窗,通过FFT得到对应的频谱;

3)将上面的频谱通过Mel滤波器组得到Mel频谱;

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

这时候,语音就可以通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。

这样就可以通过这些倒谱向量对语音分类器进行训练和识别了

疑惑、是不是每帧都有mfcc系数?

解惑、是

发布了1185 篇原创文章 · 获赞 310 · 访问量 117万+

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/103677584
今日推荐