一天理解傅里叶变换

https://lowsfish.com/?p=367

Mel Frequency Cepstral Coefficient (MFCC) tutorial

http://www.practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/

这篇英文文章讲的的挺好,还有对应的代码

https://github.com/jameslyons/python_speech_features

https://en.wikipedia.org/wiki/Periodogram

语音识别技术中提取的声音特征的参数具体指什么?

https://www.zhihu.com/question/27268668/answer/38253151

作者:王赟 Maigo
链接:https://www.zhihu.com/question/27268668/answer/38253151
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

上面有人给出了语音识别中最基础、最常用的MFCC特征的提取步骤。我来解释一下每一步为什么要这样做。

1. Take the Fourier transform of (a windowed excerpt of) a signal.
这一步其实说了两件事:一是把语音信号分帧,二是对每帧做傅里叶变换。
要分帧是因为语音信号是快速变化的,而傅里叶变换适用于分析平稳的信号。在语音识别中,一般把帧长取为20~50ms,这样一帧内既有足够多的周期,又不会变化太剧烈。每帧信号通常要与一个平滑的窗函数相乘,让帧两端平滑地衰减到零,这样可以降低傅里叶变换后旁瓣的强度,取得更高质量的频谱。帧和帧之间的时间差(称为“帧移”)常常取为10ms,这样帧与帧之间会有重叠,否则,由于帧与帧连接处的信号会因为加窗而被弱化,这部分的信息就丢失了。
傅里叶变换是逐帧进行的,为的是取得每一帧的频谱。一般只保留幅度谱,丢弃相位谱。

2. Map the powers of the spectrum obtained above onto the mel scale, using triangular overlapping windows.
这一步做的事情,是把频谱与下图中每个三角形相乘并积分,求出频谱在每一个三角形下的能量:

这一步有如下几个效果:
1) 傅里叶变换得到的序列很长(一般为几百到几千个点),把它变换成每个三角形下的能量,可以减少数据量(一般取40个三角形);
2) 频谱有包络和精细结构,分别对应音色与音高。对于语音识别来讲,音色是主要的有用信息,音高一般没有用。在每个三角形内积分,就可以消除精细结构,只保留音色的信息。当然,对于有声调的语言来说,音高也是有用的,所以在MFCC特征之外,还会使用其它特征刻画音高。
3) 三角形是低频密、高频疏的,这可以模仿人耳在低频处分辨率高的特性。

3. Take the logs of the powers at each of the mel frequencies.
这一步就是取上一步结果的对数。简单点理解,它是对纵轴的放缩,可以放大低能量处的能量差异;更深层次地,这是在模仿倒谱(cepstrum)的计算步骤。倒谱又是另一个话题,此处不展开讲了。

4. Take the discrete cosine transform of the list of mel log powers, as if it were a signal.
求倒谱时这一步仍然用的是傅里叶变换。计算MFCC时使用的离散余弦变换(discrete cosine transform,DCT)是傅里叶变换的一个变种,好处是结果是实数,没有虚部。DCT还有一个特点是,对于一般的语音信号,这一步的结果的前几个系数特别大,后面的系数比较小,可以忽略。上面说了一般取40个三角形,所以DCT的结果也是40个点;实际中,一般仅保留前12~20个,这就进一步压缩了数据。

上面整个过程的结果,就把一帧语音信号用一个12~20维向量简洁地表示了出来;一整段语音信号,就被表示为这种向量的一个序列。语音识别中下面要做的事情,就是对这些向量及它们的序列进行建模了。

MFCC的过程也是个降维的过程

480 -> 256 -> 26 -> 12

1秒的sample data, 根据window len, step and sample rate进行分帧 每帧约30ms (16000Hz 时每帧480个采样点);

对每帧时域采样数据,进行傅里叶变换(DFT) NFFT定义为512个分散点,得到 NFFT/2 + 1 个复数,求复数的模

然后求能量谱

根据最低频和最高频, Mel 量度等,一般取26个三角滤波器,也就是需要28个频率点,计算每个fliter 的能量(乘积), 也就是得到了fliterbanks

对filterbanks进行对数log运算

进行DCT 运算 取 2-13个系数,舍去第一个,这个得到12个参数,如果第一个参数赋值为每帧的能量,则是13维参数

为得到动态参数进行微分:delat1 得到13 个, 对delat1再进行微分得到delta2: 13维

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐