尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深度学习与传统语音识别算法对比:从GMM-HMM到端到端的技术演进与实践

深度学习与传统语音识别算法对比:从GMM-HMM到端到端的技术演进与实践 语音识别这个东西这几年被深度学习搅了个天翻地覆。如果你在搜“语音识别算法”想搞懂现在大家嘴里的端到端、注意力机制到底是什么同时又听说早年还有GMM-HMM这种听起来像老古董的东西那你大概率被各种资料绕晕过。我刚入行那几年正好赶在传统方法成熟、深度学习开始发力的节骨眼上两边的东西都写过、都训过、都上过线跑过业务。这篇文章我想用实际开发中的视角把深度学习语音识别算法和传统语音识别算法的区别、优劣、以及它们千丝万缕的联系掰开揉碎讲一遍帮你在概念层面建立一张干净的地图。1. 先弄明白传统语音识别到底是怎么“听”的很多人一上来就直接对比GMM-HMM和DNN-HMM结果发现连对比对象都没搞清楚。传统语音识别虽然现在被叫传统但在深度学习出现之前它是全世界语音团队花了几十年抠出来的最优解核心框架叫生成式建模。这个框架里最有名的就是GMM-HMM高斯混合模型-隐马尔可夫模型哪怕到今天你打开Kaldi这个开源工具包里面的经典chain模型依旧保留着它的身影。1.1 语音不是文字传统算法把它拆成了“状态”传统语音识别的起点是一个很扎心的现实语音是连续的声音振动文字是离散的符号序列。中间隔着几百倍的信息鸿沟。GMM-HMM的做法是先做一个假设一句话可以拆成一连串小单元这些单元的发音过程由**隐马尔可夫模型HMM**来刻画。HMM不直接认识文字它认识的是比音素更细的“状态”——通常一个音素比如“ba”里的b会被切成三个状态起始段、稳定段、过渡段。这样做的原因是发音动作本身有动态过程嘴巴从闭合到张开声学特征是在连续变化的一个静态的快照描述不了它。所以传统识别里一条语音传入系统后先被切成一帧一帧的短时窗口常见25ms一帧帧移10ms每一帧提取一组声学特征。最经典的特征是MFCC梅尔频率倒谱系数它是模拟人耳对不同频率敏感度设计出来的通常取39维13维静态13维一阶差分13维二阶差分。1.2 GMM负责“打分”HMM负责“串路”每个HMM状态对应一个GMM。GMM干的事是拟合这个状态下声学特征的概率分布——训练阶段把大量标注好的语音数据塞进去让GMM学会“这个状态的声音长得像什么样子”识别阶段当来了一个新特征向量时GMM给出一个似然概率这帧声音像不像某个状态。HMM则负责把这些状态串成路径维护状态之间的跳转概率同时记录每个状态从哪里来、到哪里去的时间结构。它还有一个很关键的问题要解决一句话里每个状态该持续多少帧HMM用自跳转概率来描述“这个状态能不能再待一会儿”。整个识别过程本质上就是一个搜索问题——在极大的状态网络中找一条概率最高的路径。最终输出的是这条路径上对应的音素序列再靠发音词典映射成词最后用语言模型最常见的是n-gram统计模型从多个候选词序列里挑出最像人话的那一个。1.3 传统算法的三座大山特征、模型、词典把传统系统拆开看典型的语音识别管线包含三个独立的模块这也是“传统”最标志性的特征——模块化。特征工程模块MFCC、PLP、fbank以及各种归一化、降维手段靠人的经验去提取“机器看起来最有区分度”的信息。声学模型模块GMM-HMM负责把声学特征对应到发音状态。语言模型模块独立训练的n-gram统计模型。它和声学模型完全是两套东西只回答一句话“像不像人话”的问题。这三座大山各管一摊好处是分工明确坏处是误差在模块间传递。声学模型识别错了语言模型只能事后补救特征提取丢掉了信息后面再努力也补不回来。传统算法想提升性能大多时候是“打补丁式”的——调特征、调模型结构、调语言模型插值权重每个细节都要求工程师有极深的专业积累。2. 深度学习是从哪里“切”进来的以及为什么切得动深度学习进入语音识别不是一夜之间推翻重来它经历了两个明显阶段先是替换部件后来才整体端到端。搞清楚这个演进路径你才能真正理解为什么现在市面上讲“语音识别算法”时默认指代的是深度学习那一套东西。2.1 第一次革命DNN-HMM把GMM换掉2011到2012年前后学术界发现一件很直接的事与其用GMM去拟合特征分布不如用深度神经网络DNN直接做分类。GMM是一个生成模型它要辛辛苦苦描述“每个状态长什么样”而DNN是一个判别模型它直接回答“这帧特征属于哪个状态的概率最大”。于是出现了DNN-HMM混合系统HMM的状态结构原封不动但GMM被换成了DNN。DNN的输入可以是一大段拼接起来的相邻帧比如左右各5帧一共11帧输出是各个状态的后验概率。这个替换带来的提升是巨大的——在同等数据量下DNN-HMM比GMM-HMM的错误率下降20%到30%是常态。这里面有个非常关键的操作细节DNN训练需要帧级别的标注即“每一帧属于哪个状态”这种标注不是人工标出来的而是先用训练好的GMM-HMM系统对数据做强制对齐forced alignment拿对齐结果当DNN的“标准答案”。所以你看第一代深度学习语音识别其实站在了传统系统的肩膀上没有传统系统帮忙打标签DNN连训练数据都无从谈起。2.2 第二次革命端到端把中间过程全干掉DNN-HMM虽然强但管线依然复杂训练时要先训GMM-HMM然后对齐再训DNN还要单独训语言模型最后在解码时把它们拼起来。每一步都有自己的一套工具和调参经验跑通一套系统需要不少力气。端到端学习End-to-End想法刺激得多不要中间状态了直接把声学特征序列映射到文字序列。怎么实现这个映射主要有三条技术路线CTCConnectionist Temporal Classification允许模型在输出时预测一个空符号“blank”让输入和输出长度可以不对齐。它解决的核心问题是“语音帧数远多于文字个数”通过在时间轴上做动态规划来搜索最优路径。Attention注意力机制Seq2Seq结构编码器把整段语音编码成一组向量解码器每生成一个字符时通过注意力权重去“回看”编码器输出的相关部分天然适合变长序列的映射。TransducerRNN-T综合了CTC和Attention的特点在流式识别场景特别吃香。它能一边输入音频一边输出文字延迟可控现在手机输入法里的语音输入基本都跑的是这一支。端到端模型的厉害之处在于它把原来声学模型、发音词典、语言模型的界限打碎了。模型内部自己学会了一套“从声音到文字”的隐式映射不需要人为规定音素怎么建模、词典里有多少词。训练数据直接是“音频-文本”对这在数据准备上极大解放了生产力。2.3 深度学习为什么切得动“语音识别”这块骨头语音识别其实是个非常适合深度学习的任务因为它有几大优势数据量大语音本身就是天然的监督数据只要有人工转写文本就能做成训练样本。互联网时代积累了海量音频库。序列结构深度学习里的RNN、Transformer天生擅长处理序列依赖语音的上下文信息能被模型更充分地利用。算力驱动GPU大规模并行让深层网络训练变得可行而传统GMM的训练本质上是串行迭代的很难吃下大规模数据红利。换句话说深度学习不是“更聪明”地解决了老问题而是换了一套能“吃数据、吃算力”的新方法直接把识别精度拉到了可用水平以上。3. 两类算法在同一张桌上硬碰硬从建模逻辑到工程体验前面讲了各自的技术路径下面进入正题——区别、对比。我把GMM-HMM时代称为“传统系”把DNN-HMM和端到端统称“深度学习系”从实际使用体验出发分维度细说。3.1 核心区别生成模型和判别模型的哲学分歧最深层的区别在数学思想上。传统GMM是生成模型它要学习的是联合概率分布P(特征, 状态)也就是既要描述“状态是什么”又要描述“特征怎么生成”。在贝叶斯框架下它计算的是P(状态|特征) ∝ P(特征|状态) × P(状态)这个最大似然估计的思路是“先假设数据服从某种分布再去拟合分布的参数”。问题在于真实的语音特征分布往往不是简单的高斯混合能完美刻画的于是模型的基础假设就有偏差。深度学习走的是判别模型路线直接建模P(状态|特征)它不关心“特征怎么生成”这种复杂问题只需要找到特征和状态之间的分类边界。神经网络有极强的非线性拟合能力能把高维空间中复杂交错的分类边界扯出来。这就像一个经验丰富的猎人直接学习“看到什么脚印对应什么动物”而不需要先学会“动物是怎么长出脚印的”。这也解释了为什么DNN替换GMM会有那么大的提升模型从“猜数据的生成过程”变成“直接猜结果的边界”后者在充足数据下明显更准。3.2 特征上的态度差异手工雕花 vs 让模型自己学传统算法里特征工程是整个系统最核心的竞争力之一。MFCC的每个设计环节都有讲究为什么要用梅尔刻度因为它模仿人耳低频分辨率高、高频分辨率低为什么要取对数因为人耳对声音响度的感知是对数的为什么要做倒谱分析因为可以把声道激励和声道滤波分开。这些知识写在教科书里做出来的特征是人耳听觉机制的“手工复刻”。深度学习对待特征的态度截然不同——简单粗暴。现在的端到端系统尤其是Transformer家族输入通常直接是80维fbank特征甚至有一些研究直接把原始波形塞进网络让模型自己学滤音器。因为网络有足够的能力从原始信号里提炼有效信息人工特征有时反而限制了信息的保留。但这里我要说一句公道话不能说深度学习完全不需要特征工程。在工程实践里特征归一化、语速扰动、多麦克风阵列的信号处理这些预处理步骤依然是决定上线效果的关键。我在实际跑实验时发现同样的端到端模型IPA发音词典特征比直接塞原始波形更容易收敛、更稳尤其是当你的训练数据量不够大的时候。所以特征这块更像是一条光谱传统在手工端深度学习在自动学端但工程实际中两者是配合关系不是替代关系。3.3 数据需求和政治学吃数据的方式完全不同这一条在业界体会最深。传统GMM-HMM系统想要在某个垂直领域比如医疗、法律用起来你需要这个领域的带转写音频几百小时一个发音词典要覆盖领域词汇一份好的语言模型训练文本领域内文本越多越好。而且这些模块的训练是串行依赖的声学模型训不好对齐就不准对齐不准语言模型用词网络就建不牢。迭代一次要好几轮。端到端系统对数据的态度宽松很多。你只要有“音频-文本”对就行模型自己学映射。训练流程也扁平GPU上跑一轮就能出结果。甚至现在有半监督学习和自监督预训练的路子用大量无标注音频先学一个通用的表征模型再拿少量标注数据精调这在低资源场景下效果提升立竿见影。从项目推进角度说深度学习带来的不仅是精度提升更是试错成本的下降——你可以更快地验证一个新想法、新数据集到底行不行而不是把时间耗在繁琐的模块对齐上。3.4 解码策略对比动态规划 vs 束搜索谁更高效这个话题比较硬核但对理解区别很有价值。传统GMM-HMM解码是在一个加权有限状态转换器WFST组成的网络上做维特比解码。整个网络把HMM状态、发音词典、语言模型全部编译在一起形成一个巨大的状态图。解码过程就是在这个图上做动态规划维护每个时刻每个状态的最大概率路径。这套系统的优点是可解释性强、搜索空间可控缺点是灵活性差——你想加一个新词需要重新编译整个FST网络更新一次要跑很久。深度学习端到端解码就轻便多了主流方法是束搜索beam search。解码器每生成一个字符会保留概率最高的前若干个候选序列beam然后继续扩展直到遇到结束符。全程不需要预编译网络加新词只要改训练数据或做热词干预。而且因为建模单元通常是子词BPE字节对编码对生词、低频词的处理能力远强于传统方法——传统方法遇到词典外的词直接歇菜深度学习系统至少能试着拼出来。再补充一个参数对比传统解码需要对声学模型得分和语言模型得分之间做权重调节常见lm-weight在5到15之间实践经验差一点就可能导致识别结果和人话差很远。端到端系统省掉了这个调节环节模型内部已经在训练中平衡好了两者的关系这为使用方省下了一大笔调参成本。3.5 表格速览一图看清两者差异对比维度传统语音识别GMM-HMM深度学习语音识别DNN-HMM/端到端模型类型生成式概率模型判别式神经网络模型特征工程MFCC为主人工设计占主导简单fbank网络自动学高层特征建模单元音素/三音素状态字/子词/BPE或音素因方案而异语言模型独立训练需要单独调权端到端内隐式学习可外加热词干预训练流程多模块串联依赖强制对齐数据进、结果出可端到端训练解码方式WFST 维特比动态规划束搜索灵活度高数据需求需要词典、对齐标注等额外资源只需要音频-文本对理想化情况迭代速度慢模块耦合强快GPU友好鲁棒性对噪声、口音敏感领域迁移弱强预训练微调模式能迁移这张表基本把两类算法在技术栈上的差异说透了。但要强调一点“传统”不代表“没用”。在特定领域、低资源场景下传统方法仍有存在价值这也是下一节要展开的“联系”部分。4. 连接比切割更重要深度学习与传统方法之间的血脉关系很多人一听“深度学习取代传统”就以为两者是彻底决裂的。实际上从技术演进角度看两者的关系远超想象地紧密。深度学习语音识别“消灭”的是传统系统的繁琐流程但没有消灭它的思想和工具价值。4.1 DNN-HMM本身就是传统和深度学习的杂交体前面提到过DNN-HMM的第一代方案骨架是HMM肉是DNN。那个时代的系统里音素集怎么定、状态怎么切、三音素怎么绑定决策树状态聚类全是传统语音识别里积累的经验。更妙的是即使到了端到端时代很多工程系统的实现里依然保留着HMM的变体。比如HMM/DNN hybrid transducer这类方案就是把HMM的时间建模能力状态持续时间分布和神经网络的声学分类能力结合起来。因为HMM本质上是个时序状态机它对“一段语音该持续多少帧”的建模在低延迟场景下依然有价值。4.2 强制对齐被忽视的“传统遗产”现在做语音识别的年轻人可能不清楚训练第一代DNN-HMM必须依赖GMM-HMM做对齐而做语音数据清洗、给其他任务比如语音合成TTS打标签时业界现在依然大量使用对齐工具——这些工具的传统根基就是HMM状态序列。我做过一个TTS项目发现要对文本和语音做逐字对齐最稳定的方案就是跑一个GMM-HMM模型来强制对齐。深度学习的端到端系统反而不适合干这种精确到帧的活。所以传统算法在工具链层面以另一种方式活在深度学习时代只是它从“主角”退居为了“基座”。4.3 语言模型传统思想和深度学习的双向奔赴语言模型的发展是两类算法联系最生动的地方。传统识别需要独立训练的n-gram语言模型现在端到端系统虽然内嵌了隐式语言模型但单纯靠模型内部学到的语言知识在面对专业领域、专有名词、实时热词时依然不够。于是业界发展出了外部语言模型融合和热词干预技术——这本质上是把传统语言模型的建模思路用深度学习时代的方式重新引入系统。我自己的经验是一个端到端中文语音识别系统在没有热词干预时识别准确率可能95%加了热词列表准确率能提到97%以上。这种提升不是靠换模型结构而是靠重新引入“外部文本先验”。你说这是深度学习还是传统的延续我觉得这是两边优点合起来用。4.4 解码网络的智慧传统系统留下的工程资产传统语音识别里WEST编译、解码图优化这套工程体系非常成熟它对GPU/CPU内存的管理、对大规模状态网络的剪枝策略、对实时率RTF的控制经验在全行业都是宝贵资产。即便工程上主流解码已经转向束搜索很多在线系统的实现里依然能看到从传统解码器框架演化而来的调度逻辑。我做流式识别时踩过一个坑直接拿离线端到端模型上线结果延迟高到没法用。后来发现业界流式方案里有一种做法是在解码器里使用“前缀束搜索延迟控制”这个思路其实就脱胎于传统解码器的分段处理。所以你在研究深度学习语音识别时不要觉得传统算法是老古董——它的工程设计里藏着很多解决真实问题的智慧。5. 从“选型”角度聊聊什么场景下你该用哪一边这部分是给正在做技术选型的读者一些实际建议。很多人加我微信问“我现在要做语音识别应该学深度学习还是传统方法”我的回答往往让他们意外先想清楚自己的场景而不是追着热门标签跑。5.1 适合用深度学习方案打底的场景这几种情况我建议直接上开源深度学习框架比如WeNet、ESPnet、Whisper精调有较大规模的标注数据几百小时以上领域通用不需要极低延迟需要快速迭代实验验证想法目标语言/方言数据相对丰富。现在开源社区非常成熟WeNet支持流式和非流式统一建模ESPnet对各种端到端结构支持全面Whisper在多语种、鲁棒性上表现强大。自己从零搭一套传统GMM-HMM除非你是为了教学理解原理否则性价比太低。5.2 传统方法仍然能打的角落下面这些场景传统方法未必过时甚至在某些维度更好极致低资源场景只有几十小时数据而且资源匮乏那时基于HMM的框架配合良好的先验知识会比裸端到端更快见效更容易控制过拟合。需要精确帧级控制的任务语音合成对齐、歌唱音素标注、语音事件检测等需要对时间戳精确控制的任务HMM类模型仍然是首选因为它们天然输出时间边界。嵌入式设备极简推理老一代嵌入式芯片对DNN推理优化不足传统GMM模型体量小、计算简单在某些存量设备上仍然有一席之地。教学和科研入门如果你想真正理解语音识别不是“黑盒”从GMM-HMM的EM算法、维特比解码开始推导一遍对后续理解深度模型有不可替代的帮助。5.3 工程中的常见误区与避坑建议这部分是我多年实践下来最想分享的踩过不少坑写出来给你少走弯路别盲目上端到端。很多人看论文里端到端效果惊艳直接上一个端到端系统然后发现数据量不够、领域词汇频出、实时率不达标回头又折腾一套。我的建议是先跑通一个传统或混合开源系统做基线确认数据质量和规模是否齐备再切端到端。基线是一切实验的锚点。热词干预不是万能解。端到端模型的热词干预在某些实现里效果有限尤其当热词和模型内隐语言模型冲突明显时可能引发误识别。要提高热词命中率建议在训练阶段就把领域语料掺进去而不是只依赖解码时加偏置。别忽视数据质量。深度学习系统对数据噪声的容忍度高但对“标注错误”的容忍度其实很低一个错误转写会让模型学到错误映射。我见过不少项目模型结构换了好几个精度上不去最后发现训练数据里有5%以上标注矛盾。清洗数据所用的人力永远比调模型结构更值钱。实时率和准确率要一起看。端到端离线模型精度高但流式场景下实时率可能崩盘。选型时先定场景需求——离线听写、实时字幕、电话客服各有各的最优解不存在一个模型打天下。用公开基线校准自己的实验。无论你用什么框架先跑通官方提供的公开数据集比如AISHELL-1、LibriSpeech基线再换自己的数据。如果公开基线都跑不到论文水平先找环境问题再谈算法改进。6. 亲自跑一遍两种方案后我的几点真实体会最后聊聊我个人实操两种方案后的感受不会长篇大论做总结因为我更相信具体的体验胜过抽象归纳。我第一次完整跑通GMM-HMM的Kaldi脚本时最震撼的不是识别效果而是那个系统的复杂度——每一步都有专门的工具和中间产物理解了每一步才能端到端地调试。等后来切到端到端速度是快了、行数少了但我反而觉得黑盒感更强了。踩错数据、显存溢出、loss不下降每一样问题排查起来都比传统方法更依赖实验直觉。有个细节印象很深有一回我用端到端模型识别一段带严重口音的音频效果很差。后来试着把它放进一个混合系统里让HMM的时序结构和DNN的声学分类协作效果立刻改观。所以千万别把两类算法当成对立面好的工程师是懂得在工具箱里拿不同工具解决不同问题的。如果你正在学这块内容我建议你哪怕不真正去用传统方法做生产也至少抽出时间把Kaldi里一个经典recipe读懂一遍。当你理解了HMM怎么把时序信息建模、GMM怎么为状态打分、WFST怎么搜索路径再去读端到端的CTC和RNN-T论文你会明显感觉地基稳得多。另外如果你想从开源项目入手实操我的建议是先用WeNet跑AISHELL-1的中文识别再试Whisper精调十几小时英文数据做对比最后再往流式切。公有云的免费GPU别浪费拿来跑小实验足够。语音识别这个领域还在快速演进但传统和深度学习的相互滋养比我们大多数人以为的更深。希望这篇文章能帮你在“区别”中看到联系在“联系”中学会取舍而不是简单记住几个模型名字。
返回列表