当前位置:首页 > AI语音类

语音是怎么变成文字的?语音识别原理拆解(语音转文字技术解析)

1周前 (10-05)AI语音类19

发语音转文字、看视频自动字幕、开会时实时转写——这些东西背后都是同一门技术:自动语音识别(Automatic Speech Recognition,简称 ASR)。它干的活朴素又具体:把一段声音波形,变成对应的文字。

听上去无非是"听着写下来",但对机器来说,声音到文字之间隔着一层巨大的不对称:波形是连续、稠密、毫秒级的一长串数,文字却是稀疏、离散的一串字,两者长度对不上、节奏对不上,更别说还有同音字、口音、噪声这些麻烦。这篇顺着技术演进的线,拆这条链路是怎么被一步步修出来的。

声音进模型前,先被压成一张"声谱"

原始音频是一维波形,采样率高(常见 16kHz),信息密密麻麻但冗余很大,模型没法直接啃。业内统一的做法,是先把它转成更紧凑的声学特征,其中绕不开的一个就是 MFCC(梅尔频率倒谱系数)或其近亲 fbank。

这段预处理大体分几小步。先把长波形切成短帧(25 毫秒左右,帧间有重叠,往前滑动);每帧加个窗,避免两端突变带来的频谱泄漏;再做傅里叶变换,得到这一帧在频域上的能量分布。紧接着,把这些能量投到梅尔刻度的一组滤波器上——梅尔刻度模仿人耳对频率的感知,低频分得细、高频分得粗,更符合人耳听到的样子。取对数之后,fbank 特征就到手了,若是再做一步余弦变换去相关,就得到了 MFCC。

这么一来,一维波形被压成了一张二维的"声谱图":横轴是时间,纵轴是频率,每个格子的深浅代表那个时刻那个频段的能量。语音识别本质上,就是从这张图里读出"说了什么"。

传统 ASR:三段流水线,各管一段

yuyin-shibie-cover.jpg

早期的语音识别是一套三段式流水线,每一段解决一个问题。

声学模型这一段,负责"音频到发音"。它读进声学特征,输出一串音素(发音的基本单位)的概率分布。早期用 HMM(隐马尔可夫模型)建模音素的时序,后来把其中的概率估算换成了 GMM 和深度网络,成了 DNN-HMM 这种混合结构。

发音词典这一段,负责"发音到字"。它是一张查表,告诉你每个词由哪些音素按什么顺序组成。有了声学模型给的音素序列,再对照这张词典,就能把音素拼成候选词。

语言模型这一段,负责"从一堆候选里挑对的"。同音、近音的候选词可能一大堆,语言模型根据上下文的语言习惯,给更通顺、更可能的词串打高分,把"标志—标识""尤其—由其"这类同音歧义压下去。

这套流水线逻辑清晰、各段可控,但毛病也明显:三段各自优化,误差会一段段累积;而且每段都要单独训练、拼装,工程重。正因如此,才有了后来的端到端。

端到端 ASR 的头号难题:长度对不上

想把"音频直接映射成文字"用神经网络一步到位,迎面撞上一个大坑——长度不对齐。

输入是上百帧声学特征,输出可能只有十几个字。训练时我们只知道"这段音频对应这句话",却不知道具体哪一帧对应哪个字,而且一个人说话,同一个字的发音时长会拖长或缩短。网络输出的长度和标签的长度对不齐,损失函数都没法直接算。

这个问题,被一个叫 CTC(Connectionist Temporal Classification,连接主义时序分类)的算法给解了。

CTC:用一个「空」符号,让路径可枚举

CTC 的巧思,是往输出字母表里塞一个特殊的"空"符号——通常记作 blank,一会儿细说。有了它,长度问题就有了转机。

做法是:对每一帧特征,网络都输出一个在"所有字符 + blank"上的概率分布。于是每一帧可以"发"一个字符,也可以"发"空。一整个序列的每一帧各发一个,就串成了一条对齐路径。

例:音频对应 "你好" 两字,其中一条路径可能是:

  你 你 - 好 - - 你 好
  (其中 "-" 表示 blank,这里只是示意,真实路径由网络逐帧输出决定)

关键在"合并规则":把路径里相邻重复的字符合并成一个,再把 blank 去掉。于是上面这条路径,合并之后就是"你好"。反过来,一个"你好"对应着成千上万条合法路径——有的把"你"拖成好几帧,有的中间夹几个空。

CTC 训练时,不要求指定哪一条路径,而是把所有能合并成目标文字的路径概率全部加起来,作为这个样本的似然,再去优化它。长度不对齐的问题,就这样被"枚举所有路径求和"化解了。推理时,取概率高的路径、按合并规则还原,或配合集束搜索,得到识别文字。

CTC 让端到端识别真正跑通了起来,直到今天很多流式 ASR 还在用它或其变体。

注意力路线:让模型自己"找对齐"

除了 CTC,还有一条路线是注意力机制(seq2seq / 注意力)。它不靠逐帧硬对齐,而是让解码器一边生成字,一边去"看"编码器产出的哪些帧更相关,自己学会对齐。

这一派的优势是建模灵活,不要求"一帧一字"那种单调假设,对长句、语序变化的适应更好。代价是它天然偏向"看完整个输入再输出",流式、低延迟场景里要额外做限制。

再往后,还有把 CTC 和注意力揉在一起的混合方案,以及用 Conformer(卷积加自注意力的编码器)把声学建模做得更扎实的思路。路线很多,但都围着同一件事打转:怎么让声音的连续节奏,稳稳对到文字的离散顺序上。

中文语音识别,还多几层麻烦

上面的框架对任何语言通用,但中文 ASR 有自己独有的坎。

一是同音字多。"shì shì"能对应"是事、世事、试试、逝世"一大串,全靠上下文语言模型来救,这对语言建模的要求更高。

二是声调。普通话四声直接改意思,而声调在声学特征里偏细,容易被噪声抹掉,识别时得额外把声调信息保下来。

三是方言和口音。训练数据通常以标准普通话为主,一遇上方言腔、口音,声学模型就容易漂。热词和领域词也是个头疼点:人名、专业术语、新词层出不穷,纯数据驱动的模型很难面面俱到,于是有了"热词激励"这类补充机制。

小结

把语音识别这条线串起来:声音先被预处理成 MFCC 或 fbank 这类声学特征;早期方案用"声学模型—发音词典—语言模型"三段流水线分工合作;端到端路线则撞上了音频与文字长度不对齐这堵墙,被 CTC 用"blank 符号 + 路径枚举求和"给拆掉,注意力路线则让模型自己学会对齐。

从三段式到端到端,变的是一体化的程度,不变的是那道本质问题——在连续的声音和离散的文字之间架一座稳得住的桥。搞懂了这道桥怎么架,再看手机上的语音转文字、会议转写,就都知道它们背后在忙什么了。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。