# 语音识别的技术原理是什么？

By [flat](https://paragraph.com/@flat-2) · 2022-10-11

---

简要给大家介绍一下语音怎么变文字的吧。

首先说一下作为输入的时域波形。我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式，必须转成非压缩的纯波形文件，比如Windows PCM文件，即wav文件来处理。wav文件里存储的除了一个文件头以外，就是声音波形的一个个点了。采样率越大，每毫秒语音中包含的点的个数就越多。另外声音有单通道双通道之分，还有四通道的等等。对语音识别任务来说，单通道就足够了，多了浪费，因此一般要把声音转成单通道的来处理。下图是一个波形的示例。

另外还需要做个VAD处理，也就是把首尾端的静音切除，降低对后续步骤造成的干扰。这需要用到信号处理的一些技术。

时域的波形必须要分帧，也就是把波形切开成一小段一小段，每小段称为一帧。注意通常不是简单的切开，而要使帧与帧之间有重叠，就像下图这样：

图中，每帧的长度为25毫秒，每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

分帧后，语音就变成了很多小段。但波形在时域上几乎没有描述能力，因此必须将波形作变换。常见的一种变换方法是提取MFCC特征，把每一帧波形变成一个12维向量。这12个点是根据人耳的生理特性提取的，可以理解为这12个点包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中，这一步有很多细节，比如差分、均值方差规整、高斯化、降维去冗余等，声学特征也不止有MFCC这一种，具体就不详述了。

至此，声音就成了一个12行（假设声学特征是12维）、N列的一个矩阵，称之为观察序列，这里N为总帧数。观察序列如下图所示，图中，每一帧都用一个12维的向量表示，色块的颜色深浅表示向量值的大小。

接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍三个概念：

音节：英语中就是单词，汉语中是汉字。

音素：音节的发音由音素构成。对英语，通常使用39个音素的音素集。

状态：比音素更细致的语音单位。通常一个音素由3个状态构成。

语音识别是怎么工作的呢？实际上一点都不神秘，无非是：

第一步，把帧识别成状态（难点）。

第二步，把状态组合成音素。

第三步，把音素组合成单词。

如下图所示：

图中，每个小竖条代表一帧，若干帧语音对应一个状态，每三个状态组合成一个音素，若干个音素组合成一个单词。也就是说，只要知道每帧语音对应哪个状态了，语音识别的结果也就出来了。

那每帧音素对应哪个状态呢？有个容易想到的办法，看某帧对应哪个状态的概率最大，那这帧就属于哪个状态，这叫做“最大似然”。比如下面的示意图，这帧对应S3状态的概率最大，因此就让这帧属于S3状态。

那这些用到的概率从哪里读取呢？有个叫“声学模型”的东西，里面存了一大堆参数，通过这些参数，就可以知道帧和状态对应的概率。声学模型是使用巨大数量的语音数据训练出来的，训练的方法比较繁琐，这里不讲。

但这样做有一个问题：每一帧都会得到一个状态号，最后整个语音就会得到一堆乱七八糟的状态号，相邻两帧间的状态号基本都不相同。假设语音有1000帧，每帧对应1个状态，每3个状态组合成一个音素，那么大概会组合成300个音素，但这段语音其实根本没有这么多音素。实际上如果真这么做，得到的状态号可能根本无法组合成音素。实际上，相邻帧的状态应该大多数都是相同的，因为每帧很短。

解决这个问题的常用方法就是使用隐马尔可夫模型（Hidden Markov Model，HMM）。这东西听起来很复杂，实际上没什么神秘的。基于HMM的语音识别，其基本原理无非是：

第一步，构建一个状态网络。

第二步，从状态网络中寻找与声音最匹配的路径。

这样就把结果限制在预先设定的网络中，避免了刚才说到的问题，当然也带来一个局限，比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径，那么不管说些什么，识别出的结果必然是这两个句子中的一句。

具体是这样的，首先构造音节级网络，然后展开成音素网络，然后展开成状态网络。然后在状态网络中搜索一条最佳路径，这条路径和语音之间总的概率，称之为累积概率最大。搜索的算法是一种动态规划剪枝的算法，称之为Viterbi算法，寻找全局最优路径。感兴趣的同学可以到Wikipedia上搜一下。

这里所说的累积概率，分为三部分，分别是：

观察概率：每帧和每个状态对应的概率

转移概率：每个状态转移到自身或转移到下个状态的概率

语言概率：根据语言统计规律得到的概率

其中，前两种概率从声学模型中获取，最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的，存储的是任意单词、任意两个单词、任意三个单词（通常也就到三个单词）在大量文本中的出现机率。

这样基本上语音识别过程就完成了。

---

*Originally published on [flat](https://paragraph.com/@flat-2/jLi2eDCrNiWlqiVXqBMe)*
