潮科技行业入门指南 | 深度学习理论与实战:提高篇(3)——基于HMM的语音识别

石亚琼36氪@123·2019-03-25 06:19
TECH is the new sexy

编者按:本文节选自《深度学习理论与实战:提高篇 》一书,原文链接http://fancyerii.github.io/2019/03/14/dl-book/ 。作者李理,环信人工智能研发中心vp,有十多年自然语言处理和人工智能研发经验,主持研发过多款智能硬件的问答和对话系统,负责环信中文语义分析开放平台和环信智能机器人的设计与研发。

以下为正文。

HMM模型自从1980年代被用于语音识别以来,一直都是实际语音识别系统的主流方法。即使到了今天,End-to-End的语音识别系统不断出现,在工业界很多主流的系统仍然还是在使用基于HMM模型的方法,当然很多情况引入了深度神经网络用来替代传统的GMM模型。因此我们首先来了解一些经典的基于HMM模型的语音识别系统。

语音产生过程

语音的激励来自于肺呼出的气体,声门的不断开启和闭合会产生周期的信号,这个信号的频率就叫基音频率(fundamental frequency F0),如下图所示,这个信号的基频是150Hz。


图:基音频率 图片来自课程cs224

除了150HZ的基音频率,它也会产生300Hz、450Hz…的信号,这些叫做泛音(harmonics),最终得到的信号的频谱如下图所示。


图:Harmonics 图片来自课程cs224


每个人的基音频率都是不同的,同时一个人也要发出各种不同的声音,这是怎么实现的呢?原理人在发不同音的时候声道、口腔、舌头、牙齿和鼻腔等发音器官会处于不同的开合状态,比如发a的时候口长得比较开,发s的时候我们让舌头和上牙之间有一个很小的缝隙,从而产生摩擦的声音。从信号处理的角度来说,这些发音器官的不同状态就产生了不同的滤波器。

我们每个人的基频虽然不同,但是在发相同的音的时候产生的滤波器都是类似的,因此我们每个人说”你好”的最终信号虽然不同,但是我们的口腔等发音器官的状态是类似的。因此我们也可以把发声看做如下图所示的过程。


图:source-filter模型 图片来自课程cs224

我们的呼吸带动声门的开闭产生的信号叫源(source),我们的声道等发声器官是滤波器(filter),它们作用的结果就是最终的语音信号。

听觉感知过程

说话产生的声波在空气中的震动,然后会传到耳朵里。人的耳蜗在接收到声音信号时,不同的频率会引起耳蜗不同部位的震动。高频声波是使耳蜗底部基底膜振动;低频声波使耳蜗顶部基底膜振动;中频声波使基底膜中部发生振动。我们大致可以认为不同部位的纤毛会接收不同频率的声波,因此耳蜗就像一个频谱仪,虽然它没有学习过傅里叶变换,但是它知道怎么进行傅里叶分析。因此为了模拟人类的听觉,我们通常需要把时域的信号变换成频域的信号。关于傅里叶分析,这个教程非常直观,建议读者阅读。

信号处理

为了能让计算机处理,我们首先会使用麦克风把声压转换成电信号,如下图所示。工作的时候麦克风的膜片(membrane)会随着声波振动,从而把声波转换成不断变化强度的电信号。


图:麦克风把声音变成电信号

为了便于计算机处理,我们需要把模拟的电信号转换成数字信号。这就需要ADC(Analog-to-Digital Conversion)把模拟信号转换成数字信号,它包括采样和量化两个步骤。因为人类的语音来说,我们说话产生的声音的频率范围是小于8KHz的,根据奈奎斯特和香农采样定理,我们的采样频率只要达到16KHz(采样频率指的是每秒钟从模拟信号抽样的点的个数),那么就可以完全通过采样点恢复出原始信号。人类的听觉极限一般是20Hz-20KHz,因此CD一般使用44.1KHz的采样频率。采样过程如下图所示,因此采样把一个时间轴连续的信号变成离散的信号。


图:采样

采样之后,我们的信号点由无穷个变成了有限个,但是信号的值还是一个连续的实数,所以我们需要使用量化技术把它离散化。


图:量化

比如上图使用的3bit的量化,那么总共有8种可能的取值,我们把任意一个实数值”量化”到最接近的那个值。对于语音信号来说,我们通常使用16bit的量化,也就是有216=64𝐾216=64K种不同的取值。

在实际的电话系统中,为了减少传输的数据量,通常会使用A律(A-Law)或者μ律(μ-Law)把16bit的信号压缩成8bit,中国和欧洲采用的是A律,美国和日本采用的是μ律。

上面描述的采样和量化过程通常也叫脉冲编码调制(Pulse Code Modulation, PCM),这是个通信的术语,我们知道就行了。

特征提取

前面我们分析了人耳的听觉其实是频谱的分析,因此计算机也要模拟这个过程。上述得到的是时域的信号(信号岁时间的变化),但是语音信号是个时变信号,直接对很长时间的语音做傅里叶变换并无意义,因此我们通常先需要把语音信号切分成很短的窗口(通常是25ms的时长),然后通过特征提取从这个窗口提取一个特征向量。因此一个时域信号在特征提取之后就变成了特征向量的序列,如下图所示。


图:特征提取

对于语音识别来说,最常见特征提取方法是MFCC。因为细节比较多,所以MFCC特征提取放到单独的一篇文章,请阅读MFCC特征提取教程

HMM模型简介

通过特征提取之后,输入的一段语音信号就变成了特征向量的序列。语音识别系统需要根据特征向量序列来识别对应的词序列,这是一个序列标注的问题。Hidden Markov Mode(HMM)是一种解决序列标注问题的模型,在语音识别领域得到广泛应用。它一直是语音识别的主流框架,即使到了深度学习时代,不断的出现End-to-end的模型,但到目前为止还是有很多系统使用HMM(不过也加入了很多深度学习的模型)。

为了便于理解,我们首先通过一个假想的例子来说明什么是HMM。假设我们是来自2799年的气候学家,我们想知道2007年夏天的气温。我们找不到气象局的数据,但是发现了Jason的日志,他每天会记录吃了几个雪糕。一般来说天气越热,他吃的雪糕数量就越多,因此我们可能根据这个信息猜测某天的气温。为了简化问题,我们假设气温只分为热(Hot)和冷(Cold)两个取值。因此我们的问题为:给定观察序列O(每天吃雪糕的个数),猜测出最“可能”的状态序列(每天到底是冷是热)。

我们这里有两个重要信息:不同天气吃雪糕的概率是不同的;连续两天的天气的变化是有规律的。我们可以使用Hidden Markov Mode(HMM)来建模这个问题,HMM是一个生成模型,我们假设模型有一个隐状态的序列(天气序列),但是看不到;我们看到的是一个观察序列(吃雪糕数的序列)。HMM会有两个概率来利用前面说的两个重要信息:隐状态的跳转概率和发射概率。状态的跳转概率指的是从一个隐状态跳转到另一个隐状态的概率,比如今天是H,那么明天是H还是C的概率是不同的。而发射概率指的是如果天气是H(或者C),Jason吃雪糕数量的概率分布。

HMM模型的目的就是根据观察的序列,估计“最可能”的模型(就是这两个概率)。那什么叫最可能的模型呢?这两个概率都有无穷(或者只是很多)种可能,假设Jason吃雪糕的数量只能是𝑂=1,2,3O=1,2,3,𝑝(𝑂=1|𝐻),𝑝(𝑂=2|𝐻),𝑝(𝑂=3|𝐻)p(O=1|H),p(O=2|H),p(O=3|H)表示热天吃一、二和三支雪糕的概率,那么可能的一种概率分布是(0.1,0.2,0.7),也可能是(0.1,0.3,0.6),…,理论上有无穷种可能。但是模型一旦确定,我们可以计算在这个模型下看到某个序列的概率(计算方法后面会介绍)。存在一个(或者多个)模型使得这个概率最大,那么我们就可以认为这个模型是“最优”的。理论上我们可以“遍历”所有可能的模型,然后找到“最优”的模型,但实际上可能的模型参数是无穷的,因此我们需要更聪明的办法来找到这个最优的模型。


+1
0

好文章,需要你的鼓励

参与评论
评论千万条,友善第一条
后参与讨论
提交评论0/1000

提及的项目

查看项目库
36氪APP让一部分人先看到未来
36氪
鲸准
氪空间

推送和解读前沿、有料的科技创投资讯

一级市场金融信息和系统服务提供商

聚焦全球优秀创业者,项目融资率接近97%,领跑行业