语音识别是怎么运作的
音频变成频谱图,频谱图变成 token,之后就只是一次序列到序列的翻译。
现代语音识别就是一个transformer在做翻译——从音频翻到文本。有意思的部分是:音频怎么变成 transformer 读得懂的东西。
从音频到频谱图
原始音频是一条波形:每秒几万个振幅采样点。直接把它喂给 transformer,会得到长得离谱的序列。
所以先把音频转成频谱图。把波形切成一段段有重叠的短窗口——通常是 25 毫秒——对每个窗口算出里面有哪些频率、各自多强。
结果是一个二维数组:一个轴是时间,另一个轴是频率,数值是强度。本质上就是这张声音的图像。
有两个改进是标配。频率分箱按人耳的敏感度来排布——低频更细、高频更粗——这样得到的是梅尔频谱图。强度取对数刻度,与人对响度的感知方式对齐。
现在这个表示既紧凑又有结构,处理图像时用的那套「切块变 token」的思路可以直接套用。频谱图的每一帧变成序列里的一个向量。
编码器-解码器
语音识别就是那种仍然该用完整的编码器-解码器 transformer、而不是 decoder-only 的场景之一。
编码器双向地读完整张频谱图。每一帧都可以关注其他任何一帧,这很关键,因为后面的音频能消解前面音频的歧义——很多时候你要听到句尾才知道中间某个词是什么。
解码器自回归地生成文本 token,通过交叉注意力关注编码器的输出。就是标准的下一 token 预测,只不过以音频为条件。
这就是语音模型处理同音词还过得去的原因:「their」和「there」的取舍由语言模型那一半根据上下文决定,而不是由声学决定。
多任务训练换来了什么
近几年的系统里一个有影响力的设计选择是:让一个模型同时训练多个任务,用解码器 prompt 里的特殊 token 来区分:同语言转写、翻译成英文、识别语种、预测时间戳,以及判断这段音频里到底有没有人说话。
一个模型,几项能力,而且它们互相加强——语种识别让转写更准,时间戳预测让切分更好。
这也意味着解码器是一个真正的语言模型。于是就有了一种典型故障:遇到静音或噪声时,它会幻觉出通顺的文本,凭空生成像模像样的句子。这和文本幻觉是同一套机制——一个被训练来产出合理续写的模型,不管有没有信号都会照做。转写之前先做语音活动检测,是标准的防线。
流式与批处理
双向编码器需要拿到完整的音频片段,这对录音来说没问题,对实时字幕来说不可接受。
流式系统做了取舍:分块处理,只允许有限的向前看,用更低的准确率换低延迟。有些会先输出临时文本,随着后续音频到达再修改——这就是实时字幕里那种肉眼可见的跳动。
如果你不需要实时输出,批处理既更准也更简单。要有意识地做这个选择。
什么在影响准确率
音频质量的影响压倒一切。采样率、背景噪声、麦克风距离、压缩失真。
多人同时说话处理得很差。区分谁说了哪句话——说话人分离(diarization)——是一个独立的问题,通常由另一个模型来解决。
**领域词汇。**产品名、医学术语和专有名词如果在训练中很罕见,转写效果就很差。很多系统接受一个提示词列表或初始 prompt,用来向预期出现的词倾斜——便宜且有效。
口音和方言的表现随训练数据的覆盖程度而不同,这种差距是真实存在的,不是偶然。
**语言。**资源丰富的语言转写效果好得多,这和文本里的tokenizer 化石问题是同一回事。
实操要点
**先修音频,再调模型。**改善麦克风位置、降噪,比任何参数调整都管用。
先跑语音活动检测,既省成本,也能防住静音段被幻觉出一段转写。
用语言模型做后处理,补标点、排格式、纠正领域用词。转写和清理是可分离的两个问题,分开处理效果更好。
**永远不要精确信任时间戳。**它们是预测出来的,不是测出来的,在长音频上会漂移。
要点回顾
- 音频先变成梅尔频谱图——一张频率随时间的图像——再变成 token 序列。
- 编码器-解码器架构:双向编码音频,自回归生成文本。
- 多任务训练让一个模型同时会转写、翻译、识别语种——也让解码器具备了在静音上产生幻觉的能力。
- 流式用准确率换延迟;能批处理就批处理。
- 对准确率影响最大的,是音频质量、多人同时说话和领域词汇,而不是你选了哪个模型。
下一篇: 文本转语音是怎么工作的