AI 基建
0%
第二部分 · 生成式与多模态架构 · 第 14 章

语音与实时语音

作者Changkun Ou
阅读时长约 9 分钟

前几章把生成从左到右的文本顺序中分离出来;语音再加上一种不同的压力:时间。音频要被识别、表示、生成,有时还要在对方尚未说完时就开始回应。一个实时语音界面的预算只有几百毫秒,超过这个预算,回应就显得迟缓;而这个数字会塑造整条技术栈,从识别器怎样对齐,到编解码器的帧率,再到智能体到底是级联,还是一个全双工模型。同一份预算也贯穿其他选择:自监督与弱监督降低标注音频的成本,神经编解码器把靠前的语义词元和靠后的保真词元分开,几秒参考音频就足以克隆声音,而合成路线也正在自回归与流匹配之间分开。

2026-06-21T23:30:55.191585 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 文字聊天 语音回合 全双工 0.0 0.2 0.4 0.6 0.8 1.0 延迟预算 识别 推理 说话
图 14.1. 文本聊天、轮次式语音与全双工语音的延迟预算示意图。语音加入识别与合成,因此模型在交互显得迟缓之前可用于思考的空间更小。理想化预算,非实测。

识别语音

自动语音识别(ASR)把一段长而未分段的波形,往往有几百帧,映到一段短的转写上,而没有给出逐帧的标签。训练需要一个对齐,而这个领域的三种回答,区别在于如何提供它。连接主义时序分类(CTC)引入一个空白词元,把所有折叠到目标上的逐帧路径的概率求和,用一个前向后向的动态规划(一种在音频帧与输出符号的所有对齐上高效求和的算法)算出,但它假设输出在给定音频时条件独立,于是它不带内部语言模型,需要依赖一个外部模型 (Graves et al. 2006)。RNN 转录器加了一个预测网络,即一个自回归的标签模型,再加一个联合网络,这恢复了输出之间的依赖,同时保留单调、帧同步的对齐,于是它随帧到来而发射,天然就能流式,这正是一个全神经的转录器成为端侧识别标准的缘故 (Graves 2012; He et al. 2019)。基于注意力的编码器解码器经由注意力隐式地学到对齐,不假设任何独立性,但它的软注意力横跨整段话语,于是它并不天然流式 (Chan et al. 2016)。这些损失通常放在 Conformer 编码器之上,后者把面向全局上下文的自注意力与面向局部声学细节的卷积模块交错起来 (Gulati et al. 2020)。

标注音频一直是昂贵环节,后来有两条思路把成本压下来。自监督先出现,并逐渐形成自己的路线。wav2vec 2.0 会掩掉潜音频序列中的若干片段,再做对比学习(训练模型把真正的后续与干扰样本区分开,从而在没有标签的情况下逼它学到有用的结构):每个被掩位置的目标,是它自身潜表示的量化版本;在无标注预训练之后,只用十分钟标注就能达到有竞争力的识别效果 (Baevski et al. 2020)。HuBERT 把那个对比目标换成 BERT 式的、对离线 k-means 聚类目标(对音频特征聚类得到的离散标签,用作替代的训练目标)的掩码预测,而那些聚类标签靠在模型自己不断改进的特征上重新聚类来刷新,这把目标与模型解耦,并稳定了训练 (Hsu et al. 2021)。WavLM 保留那个目标,却掺进噪声与交叠的说话人,训练模型去还原清晰的主说话人,这让它的表示不仅适合转写,也适合说话人与多说话人任务 (Chen et al. 2022)。规模随后到来:Whisper 是一个在 68 万小时弱监督音频上训练的编码器解码器 Transformer,它通过给解码器加一段特殊词元前缀作为条件,把语种识别、转写、翻译与时间戳折进一个模型 (Radford et al. 2023)。它的贡献是零样本鲁棒性(在从未针对性微调过的口音、噪声与领域上依然稳定),而非任一单个基准上的最低数字,在那种基准上一个域内微调过的模型仍能胜过它。这条路径与本书文本那一侧相似:先自监督预训练,再大规模弱监督扩展。

音频作为词元

让音频进入本书其余技术栈的关键步骤,是不再把它当作一个连续信号,而开始把它当作离散词元。这件事由神经编解码器完成:一个编码器把波形以某个帧率下采样到一个潜表示,一个残差向量量化器把它映成一段短的码本索引,再由一个解码器重建它,全程端到端,以重建与对抗损失训练。SoundStream 在 3 kbps 上胜过传统的 Opus 编解码器在 12 kbps 上的表现,并通过丢弃部分量化器让同一个模型覆盖多个比特率 (Zeghidour et al. 2021),而 EnCodec 用一个流式编码器解码器与一个在码上的熵模型把保真推得更远 (Défossez et al. 2023)。残差量化是关键机制:每个量化器编码前面几级没有解释掉的残差,于是深度以比特率换重建误差。

import numpy as np
rng = np.random.default_rng(0)

d, K, Q = 16, 256, 6            # 帧维度、码本大小、RVQ 深度(量化器数)
codebooks = [0.5 * rng.normal(size=(K, d)) for _ in range(Q)]
x = rng.normal(size=d)          # 待压缩的一帧音频嵌入

residual = x.copy(); tokens = []
for cb in codebooks:
    j = int(np.argmin(((cb - residual) ** 2).sum(1)))   # 离残差最近的码本项
    tokens.append(j)
    residual = residual - cb[j]                          # 量化剩余残差
    print(f"{len(tokens)} 个量化器 -> {len(tokens)} 个词元,"
          f"重建误差 = {np.linalg.norm(residual):.3f}")
print("每增加一个量化器,就编码剩余残差:误差下降,比特率上升")

并非所有音频词元都承载同样的东西,而这个区分决定了本章的余下部分。语义词元来自一个像 HuBERT 或 w2v-BERT (Chung et al. 2021) 这样的自监督模型,承载语言内容与长程结构,却丢掉细的声学细节;声学词元来自一个编解码器,承载说话人身份、房间与保真,却缺长程结构。前沿把二者叠在一起,好让一个下游语言模型在最前面的词元里就拿到意义:SpeechTokenizer 把第一个残差量化器蒸馏得去匹配 HuBERT 的语义词元,而靠后的量化器承载声学 (Zhang et al. 2024),Descript 编解码器解决了码本坍缩,把通用的 44.1 kHz 音频推到约九十倍的压缩 (Kumar et al. 2023),而 Moshi 里的 Mimi 编解码器以 12.5 Hz 的帧率运行,用一个分离式残差量化器,其第一个词元是语义的,从 WavLM 蒸馏而来 (Défossez et al. 2024)。帧率是关键参数。对一个自回归模型,序列长度是帧率乘以时长乘以码本数,于是 EnCodec 的 75 Hz 是每秒数百个词元,而 Mimi 的 12.5 Hz 大约短六倍,这正是语音模型能否实时运行的差别。其张力在于更少的词元要牺牲重建保真,于是每个编解码器都把工程重点放在提高每个词元承载的信息量上。

生成语音

有了作为词元的音频,生成就成了语言建模,但直接建模原始编解码器词元的扁平模型会让语义漂移,因为编解码器词元是为保真,而非为内容优化的。AudioLM 用一个层级结构解决这一点:先建模语义词元,固定「在说什么」,再建模决定说话人与韵律的粗声学词元,最后建模承担高频细节的细声学词元,产出连贯的语音、乃至无转写的钢琴续奏 (Borsos et al. 2023)。文本到语音(TTS),也就是把文字合成为语音的任务,跟随了同一个从信号回归到词元预测的转向。VALL-E 把 TTS 当作条件编解码器语言建模,用一个如今已成标准的拆分:一个自回归模型逐词元地预测第一个、最粗的码本,时长与韵律主要由它决定,而一个非自回归模型并行地填其余的残差码本;给它一段三秒的、未见说话人的登记录音,它就零样本地克隆那个声音,把说话人的情绪与声学环境带过来,因为提示本身就是编解码器词元 (Wang et al. 2023)。SoundStorm 随后用基于置信度的并行解码加快声学这一阶段,半秒生成三十秒音频 (Borsos et al. 2023),而 VALL-E 2 靠稳定本会让自回归编解码器模型循环的采样,达到了所报告的人类同等水平 (Chen et al. 2024)。

一条平行的脉络放弃自回归的编解码器模型,转向非自回归的连续生成,也就是把 第 12 章流匹配(flow matching)用于语音。Voicebox 把合成构造成文本引导的音频填空,训练一个关注过去与未来两侧上下文的流匹配模型,报告出比 VALL-E 更低的词错误率(转写中出错词的占比,越低越好)与约二十倍的加速 (Le et al. 2023),NaturalSpeech 3 把语音分解成内容、韵律、音色与细节,再对每一项扩散 (Ju et al. 2024),而 F5-TTS 一脉把配方简化为一个纯粹的流匹配模型,不要时长预测器,也不要对齐搜索 (Chen et al. 2024)。这种分化在本章反复出现:自回归的编解码器模型能流式、能采出多样的韵律,却易于循环;流或扩散模型鲁棒、快、且双向,却要把整段先备好,这让它更难流式。让三秒克隆变得有用的机制,也使它成了一个滥用入口,这正是音频水印随之而来的缘故;AudioSeal 训练一个检测器,在一次快速的前向里定位一个片段的哪些采样是 AI 生成的 (San Roman et al. 2024)。

实时、全双工语音

一个语音智能体的难处不在识别或合成,而在对话回路:轮流、打断与延迟。人类轮流的间隔跨语言平均约两百毫秒,而那个上限,而非任何准确率目标,才是那条支配性约束。最直接的设计是一个级联,自动语音识别进一个文本模型再进文本到语音。它模块化、可调试,且继承文本模型的进步,但它把每一阶段的延迟串行地叠起来,并让全部信息经过一个会丢掉时序、交叠与韵律的文本瓶颈。另一条路直接把语音建模到语音。

cluster_C 级联(串行延迟) cluster_E 全双工语音到语音 a1 用户音频 asr ASR a1->asr llm 文本模型 asr->llm tts TTS llm->tts a2 回应音频 tts->a2 u 用户流 m 一个模型 用户 + 系统音频 + 内在文本独白 u->m m->m 一直在听 s 系统流 m->s
图 14.2. 两种语音智能体设计。级联把自动语音识别、一个文本模型与文本到语音串起来,于是延迟是三段之和、且一切都过一个丢掉时序与韵律的文本瓶颈。一个全双工的语音到语音模型把用户与系统的音频作为并行的词元流来携带、外加一段内在的文本独白,边说边一直在听,于是它在用户说完之前就发出音频。取材自 Defossez 等(2024)。

Moshi 是一个去掉了显式说话人轮次的全双工语音文本模型。它跑在低帧率的 Mimi 编解码器上,把它自己的音频与用户的作为两条并行流来建模,于是它边说边一直在听,并在每一步的音频词元之前预测一段文本「内在独白」,这改进了语言质量,也自然给出了流式识别与合成;它报告约 160 ms 的理论延迟与 200 ms 的实际延迟 (Défossez et al. 2024)。这种并行流的设计,正是让打断与附和成为原生能力,而不像半双工、靠检测静默的智能体那样必须特殊处理。首个商业实例是 2024 年 GPT-4o 的语音模式,一个跨文本、视觉与音频端到端训练的单一模型,它取代了旧的三模型语音流水线,报告出平均 320 ms 的回应 (OpenAI 2024)。随后,专门的实时语音到语音模型让这种能力成为标准的产品形态:OpenAI 的 gpt-realtime 随 Realtime API 的正式发布于 2025 年 8 月上线 (OpenAI 2025),Google 的 Gemini Live 加入了原生音频对话,两者的架构同样未披露。一条平行的脉络统一的是任务,而非双工回路:SeamlessM4T 是一个跨大约一百种语言、做语音到语音、语音到文本、文本到语音与文本到文本翻译外加识别的单一模型 (Seamless Communication 2023),而它的流式后继则加上了保留嗓音风格的低延迟同声传译 (Seamless Communication 2023)。

争议所在

一个语音智能体该是一个级联,还是一个端到端的语音到语音模型,尚无定论。级联可调试,且继承每一项文本模型的改进,却要承担串行延迟,并丢掉副语言信息,即让语音多于其转写的那些情绪、交叠与时序。端到端这条路保留这些信息,并削减延迟,却更难训练、操控与评估,也无法像级联那样换上一个更好的文本模型。同一种分化也贯穿合成本身:自回归的编解码器模型与非自回归的流和扩散相对,以流式与韵律多样换鲁棒与速度。两者都不由一个一般性的裁断决定;这个选择取决于产品在多大程度上看重表现力与亚秒响应,以及愿意为此牺牲多少可控性。

下层约束

一段对话的延迟预算会反过来塑造架构。人们期待在大约几百毫秒内有一个回应,而那个上限,而非任何准确率目标,才是在最苛刻的情形下排除掉串行的「先识别再思考再说话」级联,并要求系统在用户说完之前就发出音频的原因。这会带来流式的、词元交错的、全双工设计,也会一路影响编解码器:一个实时的语音模型需要一个低到让它的词元序列保持短的帧率,这正是 Mimi 跑在 12.5 Hz,并把意义蒸馏进第一个词元,而非把内容留给一条更长的流的缘故。交互的延迟决定了模型,正如 第 5 章 里一个词元的服务成本决定了模型大小。

延伸阅读

评论

登录后评论