语音频谱语音信号处理之(四)梅尔频率倒谱系数(MFCC)
今天一直在查找语音频谱之类的问题,今天正好有机会和大家共享一下.
语音信号处置之(四)梅尔频率倒谱系数(MFCC)
这学期有《语音信号处置》这门课,快考试了,所以也要了解了解相干的知识点。呵呵,平常没怎么听课,现在只能抱佛脚了。顺便也总结总结,好让自己的知识架构清晰点,也和大家分享下。上面总结的是第四个知识点:MFCC。因为花的时间不多,所以可能会有不少说的不妥的地方,还望大家指正。谢谢。
在任意一个Automatic speech recognition 系统中,第一步就是提取特征。换句话说,我们需要把音频信号中拥有辨识性的成份提掏出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声啊,情感啊等等。
搞清语音是怎么发生的对于我们理解语音有很大帮助。人通过声道发生声音,声道的shape(形状?)决议了收回怎样的声音。声道的shape包括舌头,牙齿等。如果我们可以准确的知道这个形状,那么我们就能够对发生的音素phoneme进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCCs就是一种准确描述这个包络的一种特征。
MFCCs(Mel Frequency Cepstral Coefficents)是一种在主动语音和谈话人识别中广泛使用的特征。它是在1980年由Davis和Mermelstein搞出来的。从那时起。在语音识别领域,MFCCs在人工特征方面可谓是出类拔萃,桂林一枝,从未被超越啊(至于说Deep Learning的特征学习那是后话了)。
好,到这里,我们提到了一个很重要的关键词:声道的形状,然后知道它很重要,还知道它可以在语音短时功率谱的包络中显示出来。哎,那什么是功率谱?什么是包络?什么是MFCCs?它为什么有效?如何失掉?上面咱们渐渐道来。
一、声谱图(Spectrogram)
我们处置的是语音信号,那么如何去描述它很重要。因为不同的描述方式放映它不同的信息。那怎样的描述方式才利于我们视察,利于我们理解呢?这里我们先来了解一个叫声谱图的东西。
这里,这段语音被分为很多帧,每帧语音都对应于一个频谱(通过短时FFT盘算),频谱表现频率与能量的关系。在现实使用中,频谱图有三种,即线性振幅谱、对数振幅谱、自功率谱(对数振幅谱中各谱线的振幅都作了对数盘算,所以其纵坐标的单位是dB(分贝)。这个变换的目的是使那些振幅较低的成份相对高振幅成份得以拉高,以便视察掩饰在低幅噪声中的周期信号)。
我们先将其中一帧语音的频谱通过坐标表现出来,如上图左。现在我们将左边的频谱旋转90度。失掉中间的图。然后把这些幅度映射到一个灰度级表现(也可以理解为将连续的幅度量化为256个量化值?),0表现黑,255表现白色。幅度值越大,相应的区域越黑。这样就失掉了最右侧的图。那为什么要这样呢?为的是增加时间这个维度,这样就能够显示一段语音而不是一帧语音的频谱,而且可以直观的看到静态和动态的信息。长处稍后呈上。
这样我们会失掉一个随着时间变化的频谱图,这个就是描述语音信号的spectrogram声谱图。
下图是一段语音的声谱图,很黑的地方就是频谱图中的峰值(共振峰formants)。
那我们为什么要在声谱图中表现语音呢?
首先,音素(Phones)的属性可以更好的在这里头视察出来。另外,通过视察共振峰和它们的改变可以更好的识别声音。隐马尔科夫模型(Hidden Markov Models)就是隐含地对声谱图进行建模以达到好的识别性能。还有一个作用就是它可以直观的评估TTS系统(text to speech)的好坏,直接比较合成的语音和自然的语音声谱图的匹配度便可。
二、倒谱分析(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)坐标轴上面描述信号。
由上面这个图我们可以看到,包络是主要是低频成份(这时候需要改变思维,这时候的横轴就不要看成是频率了,咱们可以看成时间),我们把它看成是一个每秒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-Frequency Analysis)
好了,到这里,我们先看看我们刚才做了什么?给我们一段语音,我们可以失掉了它的频谱包络(连接所有共振峰值点的平滑曲线)了。但是,对于人类听觉感知的试验表明,人类听觉的感知只聚焦在某些特定的区域,而不是全部频谱包络。
而Mel频率分析就是基于人类听觉感知试验的。试验视察发明人耳就像一个滤波器组一样,它只存眷某些特定的频率分量(人的听觉对频率是有选择性的)。也就说,它只让某些频率的信号通过,而压根就直接疏忽它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上却不是同一分布的,在低频区域有很多的滤波器,他们分布比较麋集,但在高频区域,滤波器的数目就变得比较少,分布很稀少。
人的听觉系统是一个特别的非线性系统,它响应不同频率信号的灵敏度是不同的。在语音特征的提取上,人类听觉系统做得非常好,它不仅能提掏出语义信息, 而且能提掏出谈话人的个人特征,这些都是现有的语音识别系统所望尘莫及的。如果在语音识别系统中能模拟人类听觉感知处置特色,就有可能进步语音的识别率。
梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)斟酌到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。
将一般频率转化到Mel频率的公式是:
由下图可以看到,它可以将不同一的频率转化为同一的频率,也就是同一的滤波器组。
在Mel频域内,人对音调的感知度为线性关系。举例来说,如果两段语音的Mel频率相差两倍,则人耳听起来两者的音调也相差两倍。
四、Mel频率倒谱系数(Mel-Frequency 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频谱;
4)在Mel频谱上面进行倒谱分析(取对数,做逆变换,现实逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),取得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;
这时候,语音就能够通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。
这样就能够通过这些倒谱向量对语音分类器进行训练和识别了。
五、参考文献
[1]这里头还有一个比较好的教程:
[2]本文主要参考:cmu的教程:
http://www.speech.cs.cmu.edu/15-492/slides/03_mfcc.pdf
[3] C library for computing Mel Frequency Cepstral Coefficients (MFCC)
http://code.google.com/p/libmfcc/
文章结束给大家分享下程序员的一些笑话语录:
自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
---------------------------------
原创文章 By
语音和频谱
---------------------------------
语音频谱语音信号处理之(四)梅尔频率倒谱系数(MFCC)的更多相关文章
- 语音信号的梅尔频率倒谱系数(MFCC)的原理讲解及python实现
梅尔倒谱系数(MFCC) 梅尔倒谱系数(Mel-scale FrequencyCepstral Coefficients,简称MFCC).依据人的听觉实验结果来分析语音的频谱, MFCC分析依据的听觉 ...
- 【VS开发】【智能语音处理】语音信号处理之(四)梅尔频率倒谱系数(MFCC)
语音信号处理之(四)梅尔频率倒谱系数(MFCC) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课,快考试了,所以也要 ...
- 梅尔频率倒谱系数(MFCC) 学习笔记
最近学习音乐自动标注的过程中,看到了有关使用MFCC提取音频特征的内容,特地在网上找到资料,学习了一下相关内容.此笔记大部分内容摘自博文 http://blog.csdn.net/zouxy09/ar ...
- Android讯飞语音云语音听写学习
讯飞语音云语音听写学习 这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...
- UI进阶 科大讯飞(1) 语音听写(语音转换成文字)
一.科大讯飞开放平台: http://www.xfyun.cn/ 注册.登录之后创建新应用. 因为本项目只实现了语音听写,所以在SDK下载中心勾选语音听写单项SDK就可以了 开发平台选择iOS,应用选 ...
- 客服小妹是如何泡到手的——C#定时提醒·语音录制·语音播放·文件转录Demo源码——倾情奉献!
一.需求提出 客服小妹跟我说,每天要统计新加好友数,得先记下昨天的数目,然后查看今天的数目,还要相减,打字,记录——好麻烦! 又说,客户多的时候,忙起这头忘了那头,文字记录备忘又太费劲! 我说,赐你一 ...
- C# 语音识别(文字to语音、语音to文字)
最近打算研究一下语音识别,但是发现网上很少有C#的完整代码,就把自己的学习心得放上来,和大家分享一下. 下载API: 1)SpeechSDK51.exe (67.0 ...
- c#文本转语音以及语音阅读小实例
c#实现语音阅读以及文本转语音文件是基于c#的一个类库(SpeechSynthesizer )实现的,使用该类必须要添加引用using System.Speech.Synthesis;直接是无法添加引 ...
- iOS文字转语音(语音朗读)
1.第一步导入framework 2.导入头文件 #import <AVFoundation/AVSpeechSynthesis.h> 3. 设置代理 并写下面方法 (注:代理方法用不到 ...
随机推荐
- 高速决心linux上oracle安装垃圾问题
问题:在linux安装oracle时间.因为oracle用户local LANG安装问题,原因安装oracle软件.该接口是非常多的安装位置是乱码. 解决方案:在oracle用户运行:export L ...
- Linux下使用Photorec恢复误格U盘
photorec包含在testdisk软件包中, 所以直接通过包管理器直接安装testdisk安装即可. 使用root权限来运行软件,在终端键入 [shell] photorec [/shell] 然 ...
- 安装Windows2003操作系统 - 初学者系列 - 学习者系列文章
Windows 2003是一款经典的服务器操作系统.以前笔者工作的时候就是用的这款操作系统来进行编程的.下面就对该操作系统的安装进行介绍(部分步骤参见XP的安装http://www.cnblogs.c ...
- javascript 正则介绍
1.正则直接量字符 \o NUL字符(\u000)\t 制表符\n 换行符(\u000A)\v 垂直制表符\f 换页符\xnn 由16进制nn指定的拉丁字符\uXXXX 由16进制XXXX指定的unc ...
- [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- Binder机制,从Java到C (5. IBinder对象传递形式)
1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...
- c语言算法题目求职用
1.栈的压入与压出/* 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.n<=100000 用一个栈作辅助,顺序描述压入序列和弹出序列,如果当前位置上压入序列 ...
- IIS日志分析的作用
站长都知道有ISS日志,可是有很少人去关注它,也许你觉得在一些站长工具里面我们就能找到我们想要的工具,哪你就错了,我们的网站被收入靠的是蜘蛛,想要真正了解蜘蛛,就一定要好好重视iss日志分析,为什么这 ...
- SOCKET网络编程细节问题(2)
SOCKET网络编程快速上手(二)——细节问题(2) 2.TCP数据包接收问题 对初学者来说,很多都会认为:客户端与服务器最终的打印数据接收或者发送条数都该是一致的,1000条发送打印,1000条接收 ...
- jQuery中bind与live的用法与区别
首先介绍这两个方法之前,我们常用的是click()方法 $("a").click(function() { alert("hello"); }); click( ...