首先我们要知道语音的产生过程
由肺产生向外的气流,完全放松时声带张开,就是平时的呼吸。如果声带一张一合(振动)形成周期性的脉冲气流。这个脉冲气流的周期称之为——基音周期(题主所言因音色不同导致的频率不同,事实上音色的大多是泛频上的差异,建立在基频之上,这个基频就是基音周期了,泛频可以忽略)。当然啦,这只是在发浊音(b,d,v...)时才会有,当发出清音(p,t,f...)时声带不振动,但是会处于紧绷状态,当气流涌出时会在声带产生湍流。清音和浊音是音素的两大类。接下来脉冲气流/湍流到达声道,由声道对气流进行调制,形成不同的音素。多个音素组成一个音节(就汉语而言是[声母]+韵母)。如果没学过信号系统那就想像一下平舌音和翘舌音,z和zh发声时肺和喉的状态都一样,只是舌头动作不一样,发出的声音也就不一样了,这就算是简单的调制。从而声音的波形会发生一些变化。这个波形,就是以后分析所需要的数据。
频谱包络 Spectral envelope
频谱包络是将不同频率的振幅最高点连结起来形成的曲线,就叫频谱包络线。频谱是许多不同频率的集合,形成一个很宽的频率范围,不同的频率其振幅可能不同。计算频谱包络的方法也有很多,包括频谱帧的低通滤波法,或计算时域包络使用的RMS时窗分析法。
只有周期信号的频谱有包络线,这是因为周期信号的频谱是离散的,而非周期信号没有包络线,这是因为非周期信号的频谱是连续的。
包络
在数学上,“包络”(envelope)是指一系列的直线(或曲线)包围出一个形状的情形。例如直线组成一个圈,然而实际上我们并没有“画”这个圆,这时就把这个圆称作是包络线。
语音频谱包络
语音频谱包络,即spectrum-envelope of voice。语音是一个复杂的多频信号,各个频率成分具有不同的幅度。将它们按频率的大小加以排列时,其顶端所练成的曲线,成为语音频谱包络。包络线的形状是随所发的声音而变化的。声带振动产生的声波通过由口腔、鼻腔等构成的声道时将产生共振。共振的结果会使频谱的某些区域得到加强。因此,频谱包络线的形状因人而异。但一般说来,它具有若干个峰和谷。其中,前三个共振峰包含语言的大部分信息,它们的频率和幅度随所发的声音而变化。
语音频谱包络与语音信号的语义信息和个性信息都密切相关。提取语音频谱包络即是从语音频谱中分离出谐振包络曲线,即声道系统传递函数。该声道系统传递函数可通过通过倒谱系数、共振峰频率或者LPC系数等参数进行表示,这些参数在语音编码、语音识别、语音转换和语音合成等领域都有重要的作用。
提取方法
- 时域提取方法
- 频域提取方法
- 子带划分提取方法
声波的时域曲线
时域曲线是有正有负的曲线,就像声带的震动、像弹簧的震动,y轴表示的是相对于0位置的偏移量,所以有负值很正常。
一般来说,每一个音节会对应着一个三角形,因为一般地每个音节含有一个元音,而元音比辅音听起来响亮。但例外也是有的,比如:1) 像/s/这样的音,持续时间比较长,也会形成一个三角形;2) 爆破音(尤其是送气爆破音,如/p/)可能会在瞬时聚集大量能量,在波形的包络上就体现为一个脉冲。
音不是一个单独的频率,而是由许多频率的简谐振动叠加而成的。第一个峰叫基音,其余的峰叫泛音。第一个峰的频率(也是相邻峰的间隔)叫作基频(fundamental frequency),也叫音高(pitch),常记作。有时说“一个音的频率”,就是特指基频。基频的倒数叫基音周期。你再看看上面元音/æ/的波形的周期,大约是0.009 s,跟基频108 Hz吻合。频谱上每个峰的高度是不一样的,这些峰的高度之比决定了音色(timbre)。不过对于语音来说,一般没有必要精确地描写每个峰的高度,而是用“共振峰”(formant)来描述音色。共振峰指的是包络的峰。在我这个图中,忽略精细结构,可以看到0~1000 Hz形成一个比较宽的峰,1800 Hz附近形成一个比较窄的峰。共振峰的频率一般用、等等来表示。
作者:王赟 Maigo
表示声音的三种图象
- 频谱图
- 时谱图
- 语谱图
语谱图是一个三维图,第三维数值可以用颜色的深浅来表示,横轴表示时间,纵轴表示频率,Z轴表示当前时间当前频率上的能量。语谱图又叫时频域图,因为它综合了时谱图和频谱图。
与其它方向的联系
语音是一维时域信号,图像是二维空域信号。
语音处理一维序列,图像处理二维序列。
语音识别之后得到的是拼音,这就跟输入法有点像了。
语音识别与图像识别的区别:1)语音识别分很多种:命令识别,离散/连续语音识别,特定人/非特定人+离散/连续+语音识别2)命令、离散识别,有些方法 跟 图像识别 还有些像,连续语音识别差得就很多了连续语音识别常用识别方法:GMM/DNN/CNN+HMM,HMM用来处理时间维度上的关系,GMM/DNN/CNN用来做声学建模,解码还需要用到语言模型(Language Model);非特定人,跟transfer learning还有点关系。总之:语音识别要比图像识别复杂得多,图像识别的基本套路就是“特征提取+训练分类器(神经网络把这俩统一了)”,语音识别还需要处理时间维度上信息的变化。写了这么多,才发现你是做语音的。。。那我再说点图像吧:图像的特征提取有SIFT、HOG、Fisher kernel等基本是手动设置提取方式,,然后输入到分类器来训练分类器参数;神经网络一类的算法(Deep learning)把特征提取与分类器放在一个模型里统一特征提取+分类器,特征提取不再是手动设定,而是学习得到(可以一想象下,CNN的卷积操作)。如果做个类比的话:语音识别≈图像标注(image labeling≈detection+classification).
最基本的语音模型(acoustic model)
是高斯混合模型(Gaussian mixture models,GMM)。对于每一个元音或辅音,用一个高斯混合分布来描述它对应的MFCC向量的分布。当分布的component数足够多时,GMM可以逼近任意分布。
MFCC原理
作者:王赟 Maigo
链接:https://www.zhihu.com/question/27268668/answer/38253151
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Take the Fourier transform of (a windowed excerpt of) a signal.这一步其实说了两件事:一是把语音信号分帧,二是对每帧做傅里叶变换。要分帧是因为语音信号是快速变化的,而傅里叶变换适用于分析平稳的信号。在语音识别中,一般把帧长取为20~50ms,这样一帧内既有足够多的周期,又不会变化太剧烈。每帧信号通常要与一个平滑的窗函数相乘,让帧两端平滑地衰减到零,这样可以降低傅里叶变换后旁瓣的强度,取得更高质量的频谱。帧和帧之间的时间差(称为“帧移”)常常取为10ms,这样帧与帧之间会有重叠,否则,由于帧与帧连接处的信号会因为加窗而被弱化,这部分的信息就丢失了。傅里叶变换是逐帧进行的,为的是取得每一帧的频谱。一般只保留幅度谱,丢弃相位谱。
- Map the powers of the spectrum obtained above onto the mel scale, using triangular overlapping windows.这一步做的事情,是把频谱与下图中每个三角形相乘并积分,求出频谱在每一个三角形下的能量。
这一步有如下几个效果:这一步有如下几个效果:1) 傅里叶变换得到的序列很长(一般为几百到几千个点),把它变换成每个三角形下的能量,可以减少数据量(一般取40个三角形);2) 频谱有包络和精细结构,分别对应音色与音高。对于语音识别来讲,音色是主要的有用信息,音高一般没有用。在每个三角形内积分,就可以消除精细结构,只保留音色的信息。当然,对于有声调的语言来说,音高也是有用的,所以在MFCC特征之外,还会使用其它特征刻画音高。3) 三角形是低频密、高频疏的,这可以模仿人耳在低频处分辨率高的特性。 - Take the logs of the powers at each of the mel frequencies.这一步就是取上一步结果的对数。简单点理解,它是对纵轴的放缩,可以放大低能量处的能量差异;更深层次地,这是在模仿倒谱(cepstrum)的计算步骤。倒谱又是另一个话题,此处不展开讲了。
- 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维向量简洁地表示了出来;一整段语音信号,就被表示为这种向量的一个序列。语音识别中下面要做的事情,就是对这些向量及它们的序列进行建模了。