TTS 架构的六代演进(一):三段式链路与评测框架

本篇是「TTS 架构的六代演进」系列第 1 篇。

TTS(Text-to-Speech) 就是"文字转语音"------给一段文字,让机器读出来。这件事看似只是"倒着做一次语音识别",实际上比语音识别难得多:识别只要输出唯一正确的文字序列;合成却要在无数种合理发音之间选一种,还要让它听起来像"一个具体的人"。

任务定义 :给一段文字 T = t_1 t_2 ... t_L,生成一段能被听懂、听起来自然、音色符合期望的波形 W = w_1 w_2 ... w_NL 是几十到几百个字符,N 是几万到几十万个采样点(22.05 kHz 采样率下 10 秒音频就是 22 万个采样点)。

从信息量看,输入约 100 bit(字符 × 编码位数),输出约 3.5 Mbit(采样点 × 16 位)------TTS 是一个把 100 bit 撑成 3.5 Mbit 的信息扩张 任务,扩张近 5 个数量级(log₁₀ 35000 ≈ 4.5)。扩张的部分来自训练数据里的三样先验:发音信息 (音素、连读、儿化)、韵律信息 (停顿、重音、语调)、音色 / 情感信息(谁在说、什么心情)。

对应的问题分解自然是两块:

  • 说什么(内容对齐):把文本对齐到发音单元(音素、音节或 token)。这一步决定"读没读错、有没有漏字、有没有多字"
  • 怎么说(韵律与音色):决定语速、节奏、情感、音色。这一步决定"听起来像谁、有没有感情、自不自然"

早期 TTS 系统对这两件事采取分离建模 ,把整个链路切成三段:前端 → 声学模型 → 声码器。往后六代范式,这三段边界会被逐步吃掉------第 4 代 VITS 合并声学与声码器,第 5 代大模型进一步把前端也吸收进去。

从 1980 年代把录音切碎再拼起来,到 2025 年 3 秒钟录音就能把陌生人的声音克隆过来,这四十年 TTS 走过六代范式。每一代都在解决上一代做不到的事,又留下自己的短板给下一代。

在深入六代范式之前,先看看今天的 TTS 便宜到什么程度------Kokoro-82M(2024 年底开源, 82M 参数, 不到 100 MB), 纯 CPU 可跑:

python 复制代码
# Kokoro 模型 + voices 下载: https://github.com/thewh1teagle/kokoro-onnx/releases
from kokoro_onnx import Kokoro
import soundfile as sf

kokoro = Kokoro("models/kokoro/kokoro-v1.0.onnx",
                "models/kokoro/voices-v1.0.bin")
samples, sr = kokoro.create(
    "Please call Stella. Ask her to bring these things with her from the store, six spoons of fresh snow peas, five thick slabs of blue cheese, and maybe a snack for her brother Bob.",
    voice="af_bella", speed=1.0, lang="en-us")
sf.write("wav/gen6_kokoro_en.wav", samples, sr)
# hardware: Intel Core i9-14900KF (24C/32T, 单核 ONNX Runtime)
# load: 0.44s
# infer: 1.61s → 10.97s audio, RTF=0.147
# saved: wav/gen6_kokoro_en.wav (514 KB, 24 kHz, mono)

合成结果的波形和 mel 谱:

一次前向 1.6 秒合成 11 秒音频,实时因子 0.147------CPU 上比实时快 7 倍 。放到 2016 年这是不可想象的:原始自回归 WaveNet 完全串行采样,在 GPU 上生成 1 秒 16 kHz 音频以分钟计(不同实现差异巨大, 从几十秒到几十分钟不等);直到 2017 年 Parallel WaveNet 用知识蒸馏改成非自回归,才首次做到实时以上。

从 3 分钟到 0.14 秒,就是这十年 TTS 走过的路。

一、三段式接力:前端、声学模型、声码器

三段式对应文本 → 音素序列 → 声学特征 → 波形这条链上三个接力棒式的分工。每一段的输入输出都有明确的物理含义,每一段各有各的"经典 bug":

  • 前端崩 → 念错字(多音字、专名、日期读法)
  • 声学模型崩 → 跳字 / 重复 / 语调怪(对齐 attention 出问题)
  • 声码器崩 → 底噪 / 金属声 / 高频糊(相位或谐波没重建好)

三段独立带来的好处是可控性------每段都可以独立训练、独立调试、独立替换;但误差也会累积。这就是为什么第 4 代 VITS 要把声学 + 声码器合并、第 5 代要把前端也吞掉------每少一段,就少一种误差累积的可能,代价是单段模型变复杂、可控性变差。

1.1 前端:把"人写的字"翻译成"机器知道怎么念"

输入是原始文本 ,输出是带韵律标签的音素序列 。前端在整个 TTS 链路里代码量往往比声学模型还大,因为它要干三件事:文本正则化 → 字素到音素 → 韵律预测

① 文本正则化(Text Normalization, TN)

把书写形式转成"该怎么念"的形式。中文相对简单(阿拉伯数字转中文读法 + 专有名词保护),英文坑最多:

原文 该念成 坑点
1G "一 G" 不能念 "one G"
2024/12/05 "二零二四年十二月五日" 日期格式多样
$19.99 "十九美元九十九美分" 货币 + 小数
Dr. Smith "Doctor Smith" 缩写展开
iPhone 15 Pro "爱Phone 十五 Pro" 中英混排
3/4 cup "three-fourths cup" 分数

工业界一般用 WFST 规则 + 少量 NN 回退------Google 的 TN 系统光这一块就有几万行 C++。

② 字素转音素(G2P, Grapheme-to-Phoneme)

把字符序列转成发音单元序列。这里的发音单元 ------phone / phoneme------是能被声学模型直接吃的最小发音符号:中文体系写作"声母 + 韵母 + 声调",如 你好 → n i3 h ao3;英文体系用 ARPABET,如 hello → HH AH0 L OW1;多语种统一用国际音标 IPA,如 /nǐ həˈloʊ/。粒度上一个汉字对应 2-3 个音素、一个英文单词 3-8 个音素,这条粒度决定了后续声学模型的序列长度。

中英文难点完全不同------中文难在多音字消歧,英文难在不规则拼写 + OOV。这是前端里最容易被低估、但出错后果最直接的模块,G2P 错了下游再强也救不回来。看几个典型例子:

类型 例词 该念 容易念错成
中文多音字 银行行长 yin2 háng háng zhǎng yin2 xíng xíng cháng
中文轻声 我的东西 的(de0)、西(xi0)都读轻 全读重音
中文儿化 小孩儿 一个音节 /xar/ 拆成两音节 "小孩 er"
中文变调 一起 yì qǐ ("一" 二声变四声) yī qǐ (默认调)
英文不规则 colonel /ˈkɜːrnəl/ = K ER1 N AH0 L /ˈkɒlənel/ 硬念
英文重音位移 record 动词 rɪ-KORD / 名词 REK-erd 动名词都念一种
英文 OOV iPhone /ˈaɪfoʊn/ = AY1 F OW2 N i-Phone 拆两词读

③ 韵律预测(Prosody Prediction)

给音素序列打上停顿、重音、语调标签,决定合成出来"像不像人说话":

  • 短语边界:哪里停、停多久。"我昨天 | 买的苹果 | 坏了" 与 "我 | 昨天买的苹果 | 坏了",断点位置不同,意思不同
  • 重音 :" 昨天买的" 与 "我昨天买的",重音落点决定强调对象
  • 语调:句末升调(疑问)还是降调(陈述)

传统做法用决策树 + ToBI 标注体系 (标 ^ % 这些边界调);神经时代用 BERT 直接预测每个 token 前后的 pause duration 和 pitch shift。

1.2 声学模型:把"音素序列"翻译成"声学特征轨迹"

输入是带韵律标签的音素序列 ,输出是帧级声学表征------传统上是 HMM 参数(F0 + MCC + BAP),深度学习时代是 mel-spectrogram(通常 80 维 / 帧、每帧对应 12.5 ms)。

声学模型的核心难题从始至终只有一个词:对齐(alignment)------文本序列几十个 token,音频序列几万帧,谁对应谁?这也是历代 TTS 论文里改动最频繁的一块:

  • HMM 时代 (第 2 代):强制对齐 + Viterbi------每个音素拆成 3-5 个 state,state 输出建模成 GMM,用 EM 学参数。state 数固定导致长程依赖建模差,GMM 表达能力有限带来"过度平滑"
  • Tacotron 系 (第 3 代早期):attention 隐式学对齐------decoder 自回归吐 mel 帧,每步靠 attention 找当前该关注哪个音素。问题是 attention 容易崩(跳字 / 重复),长句子尤其明显
  • FastSpeech 系 (第 3 代后期):显式加一个 duration predictor------先预测每个音素发多少帧,再用 length regulator 撑成 mel 帧序列并行解码。稳定,但要预先用 MFA 等对齐器标好每个音素的 duration 当 ground truth
  • VITS (第 4 代):monotonic alignment search(MAS) 在训练时动态搜索最优对齐------不再依赖外部对齐器,把对齐、声学建模、声码器合成塞进同一个 loss 里联合优化
  • 语音大模型 (第 5 代):对齐范式分裂成 AR / NAR 两派------AR 派(VALL-E / XTTS)把音频离散化成 codec token,在 token 序列上用 attention 隐式对齐,本质是 Tacotron attention 的 language-model 版;NAR 派(F5-TTS / Voicebox)靠 duration predictor 或 text padding token 撑长度,思路继承自 FastSpeech。老范式在离散音频空间里被"复用"
  • 端侧 (第 6 代):沿用第 4/5 代对齐方案,不再发明新的------Kokoro 骨架是 StyleTTS 2 走外部对齐器,Piper 是 VITS 蒸馏,MeloTTS 从大模型蒸馏。端侧的关注点是压缩和延迟,对齐范式已收敛

每一代对齐方案的更新,都在解决前一代对齐失败的老 bug。

"对齐"到底是什么? 文本是几十个音素的短序列,音频是几万帧的长时间轴------对齐就是给这两条序列建立"哪个音素占哪几帧"的映射 。这个映射有三种等价的表达方式:

  • 矩阵视角(Tacotron):一张 T × N 的软 attention 矩阵,第 t 行第 n 列的权重表示"第 t 帧 mel 应该看第 n 个音素的比重"。图 (a) 里白色虚线是最高权重路径------一条从左下到右上的单调阶梯,每个音素占一段连续的帧
  • duration 视角(FastSpeech):把矩阵压成一个直方图,每个音素占几帧变成一个可预测的整数。图 (b) 里"你好世界"8 个音素合计 72 帧、900 ms
  • 时间边界视角(MFA / HMM):把 duration 展开到时间轴上,每个音素对应一段时间区间。图 © 里波形被红色边界切成 8 段,每段的 envelope 就是那个音素被念出来的样子

三种视角描述的是同一件事------只是不同 TTS 架构选择了不同的表达形式去建模:Tacotron 系用矩阵学 soft attention,FastSpeech 系用 duration predictor 显式预测长度,MFA / HMM 用外部对齐器把时间边界标出来当 ground truth。对齐做错的下游后果都是一样的:跳字、重复、语速失控、韵律紊乱。

1.3 声码器:把"声学特征"还原成波形

输入是mel 谱 (或 F0 + 频谱包络 + 非周期分量),输出是raw waveform (22.05 / 24 / 48 kHz 采样)。这一段的本质是从"压缩表征"反投影回高维波形------mel 谱 80 维 / 帧,波形 22050 样点 / 秒,信息密度差两个数量级,声码器就是干这个"解压"的。

声码器演化的两个坐标是音质推理速度

流派 代表 思路 速度
STFT 逆变换 Griffin-Lim 迭代猜相位 快,但金属嗡嗡声
参数式 WORLD F0 + 频谱包络 + 非周期分量分开建模 快,但人工痕迹
自回归 WaveNet CNN 逐样点预测 极慢,早期 GPU 分钟级 / 秒
蒸馏并行 Parallel WaveNet WaveNet 蒸馏到 flow 首次达到实时
Flow WaveGlow 可逆变换 + 高斯先验 较快,占显存
GAN HiFi-GAN、BigVGAN Generator 从 mel 吐波形 + 多尺度判别器 实时,CPU 可跑
Diffusion DiffWave、WaveGrad 从噪声逐步去噪 慢,需 50+ 步推理

工业界现在HiFi-GAN / BigVGAN 是主流------GAN 系推理快(RTF < 0.1)、CPU 可跑、音质够用。BigVGAN 引入 periodic activation 专门解决"高频谐波缺失"问题,2023 年后新模型基本都换成 BigVGAN 作为声码器 backbone。Diffusion 系音质上限更高但推理慢,一般只用在离线场景。

1.4 三段的输入输出对照

一个完整的三段式链路,每一步的 Python 表示、dtype、shape、大致内存占用一次看清:

python 复制代码
文本: "Please call Stella"
      → str (UTF-8), 18 byte
  ↓ 前端 (TN + G2P + 韵律)
音素 + 韵律 token: P L IY1 Z <sp> K AO1 L <sp> S T EH1 L AH0 <eos>
      → np.ndarray, dtype=int64, shape (15,), 120 byte
  ↓ 声学模型 (对齐 + 帧级预测)
mel 谱: 80 维 × 94 帧 (12.5 ms/帧, 共 1.17 秒)
      → torch.Tensor, dtype=float32, shape (80, 94), 约 30 KB
  ↓ 声码器 (mel → waveform)
波形: 24 kHz × 1.17 s = 28160 样点, 值域 [-1, 1]
      → np.ndarray, dtype=float32, shape (28160,), 约 110 KB
  ↓ sf.write(..., subtype='PCM_16')
WAV 文件: int16 PCM, 44 B header + 采样点
      → 约 55 KB (28160 × 2 byte + 44 byte header)

上图以 Kokoro-82M 合成的 "Please call Stella" 波形为素材,可视化三段式 pipeline 每一段的典型形态。四段数据的来源要说清楚:

  • 文本 (① 大字) 是 Kokoro 的输入、波形(④) 是 Kokoro 的输出------这两段真实
  • 音素 token (② 色块) 按 CMUdict / ARPABET 规则展开(P L IY1 Z <sp> K AO1 L <sp> S T EH1 L AH0 <eos>)------Kokoro 内部 tokenization 略有差异,但每段音素的形态一致
  • mel 谱 (③ heatmap) 是从波形反向做 STFT + mel filter bank 提取的(80 通道, hop=300)------Kokoro 本身是端到端模型(StyleTTS 2 骨架),内部并没有把 mel 作为分段接口,这里画出来只是展示"如果有一个三段式模型输出这个波形,它的中间 mel 会长这样"

也就是说,三段式是概念上的分工 ------第 4 代 VITS 起 mel 就被吸收进模型内部,第 6 代端侧(Kokoro / Piper)也是端到端;上图更像"从最终波形反推 pipeline 每一段的样子",而不是模型真的分成四步接力吐出这些。三段式的教学意义在于:不管模型内部怎么合并,从输入到输出这四段的形态和数量级都是固定的------文本几十 byte、token 十几到几百个 int64、mel 几十 KB 的 float32、波形几百 KB 的 float32------图和示意里的 shape 一一对得上。

采样率取现代 TTS 主流的 24 kHz + hop=300(→ 12.5 ms/帧);22.05 kHz 场景通常用 hop=256(→ 11.6 ms/帧)------12.5 ms 在 22.05 kHz 下 hop 不是整数,实际没人这么配。

信息从 18 byte 的文本一路"生成"到 110 KB 的波形------扩张 3-4 个数量级,随句子长度线性上升。生成的部分靠训练数据里学到的发音 / 韵律 / 音色 先验来填------TTS 本质是受控的幻觉:文本只定了"说什么",剩下的发音、韵律、音色全是模型从训练数据里 hallucinate 出来的。评测五域(自然度、可懂度、说话人、韵律、性能)量的,其实就是"这次幻觉的质量"。

"韵律标签"到底指什么? 上面示意里的音素序列同时携带三类韵律信息:

  • 调号 / 重音等级 ------藏在音素的数字后缀里。英文 IY11 是主重音(0=非重音,1=主重音,2=次重音);中文体系里 qing33 是第三声(共 5 级:1/2/3/4/0=轻声)。这类"标签"直接扩大音素 vocab------IYIY1 视作不同 token,模型在训练里自己学出它们的差异
  • 停顿 token ------独立插入到序列里。中文常见 sp1 / sp2 / sp3 / sp4 四档(词内粘连 / 词间短停 / 短语停顿 / 语调停顿),英文用 sp / pau / sil;BERT-based 前端可以进一步给每个停顿预测具体毫秒数,让语速更自然
  • 短语边界 / 语调 (可选、精细档)------ToBI 体系用 L- H- L% H% 标短语调 / 边界调、L+H* H* L* 标 pitch accent。工业界主流 TTS 一般不做这层细粒度标注,端到端模型直接从大规模数据里学韵律曲线;ToBI 只在学术评测和精细可控合成里还留着

三层信息合起来才是声学模型真正吃进去的输入------哪个字念第几声、哪里停多久、哪个词强调、句末升调还是降调,都通过这些 token 编码进序列。

文本里的标点、引号、换行 在 G2P 阶段有三种处理方式:剔除 (句号 / 逗号消失,靠韵律 predictor 单独预测停顿长度)、保留成韵律标记 (。 → <pause_2>, → <pause_1>、换行 → <sil>)、保留成 phone(音素) 序列的一部分(极少数系统把引号 / 感叹号映射成一段小音素,因为影响语调;主流丢弃)。所以正文里的标点最终不是"以字符本体"进模型,而是被翻译成"停顿多长、语调怎么摆"这类连续的韵律信号。

二、G2P 深入:中英文的两条不同路

G2P 是前端里最重要也最"隐形"的模块。中英文的 G2P 路线几乎完全不同,值得单开一节。

2.1 中文 G2P:字 → 拼音 → 音素

中文的字到音看起来简单(每个字都有固定读音),真正的坑是多音字 + 轻声 + 儿化 + 变调。流程两步:先消歧到正确拼音,再拆成音素。

Step 1 字 → 拼音(多音字消歧)

三档方案,从轻到重:

  1. 规则 + 词典(轻量):建多音字词组库("行长 → háng"、"银行 → háng"、"道行 → héng"),按词切后查词库,覆盖率 85-90%
  2. 决策树 / WFST(中配):给每个多音字建一棵上下文决策树,特征是前后 N 个字、词性、是否成语------清华、科大讯飞早年方案
  3. BERT 消歧(重配,主流):句子丢进 BERT + 多音字分类头,每个多音字位置独立预测读音,准确率 95%+,字节、阿里、腾讯的中文 TTS 前端基本都上了这个

Step 2 拼音 → 音素

拼音还不是声学模型能吃的单位,得拆成音素(简化 IPA 或本土"声母 + 韵母"体系):

拼音 音素拆法 备注
b p 不送气清双唇塞音,实际是 p
j / q / x tɕ / tɕʰ / ɕ 舌面音,跟拼音字母无对应关系
zh / ch / sh ʈʂ / ʈʂʰ / ʂ 卷舌
ang / eng / ing aŋ / əŋ / iŋ 后鼻韵
er ər 儿化韵根

工业界常用两套音素集:中文本土集 约 65 个符号(声母 21 + 韵母 39 + 声调 5 + 轻声);IPA 精简集约 45 个(多语言统一,第 5 代大模型 TTS 喜欢用这个,中英文共用一套 phone 表)。

中文 G2P 的四个特色难点

① 多音字消歧------"银行行长要去银行"

前后两个"行"都是 háng,中间的"长"是 zhǎng(不是 cháng):

python 复制代码
输入: 银行行长要去银行办理业务。
输出: yin2 hang2  hang2 zhang3  yao4  qu4  yin2 hang2  ban4 li3  ye4 wu4 。

若在"行走"里,"行"就变 xíng。上下文一变,读音就变。

② 轻声------"我的东西在哪里"

"的"是助词轻声,"东西"的"西"读轻声(区别于"东方西方"的"西"):

python 复制代码
输入: 我的东西在哪里?
输出: wo3  de0  dong1 xi0  zai4 na3 li3 ?

声调 0 表示轻声------音高比普通调低 30%,时长短 40%。不标出来声学模型会读重,听感就出戏。

③ 儿化------"小孩儿喜欢吃冰棍儿"

"孩儿"合并成一个儿化音节 /xar/,"棍儿"合并成 /guər/:

python 复制代码
输入: 小孩儿喜欢吃冰棍儿。
输出: xiao3  xar  xi3 huan1  chi1  bing1  guər 。

儿化在音素层面表现为韵母末尾附加卷舌动作、韵腹央化。南方 TTS 常偷懒不处理儿化,听着像"小孩 er"两个音。

④ 变调("一 / 不"专属规则)------"一个、一半、不去"

  • "一" 在第四声前变第二声:一 gè → yí gè
  • "一" 在第一 / 二 / 三声前变第四声:一 bàn → yì bàn
  • "不" 在第四声前变第二声:不 qù → bú qù
python 复制代码
输入: 一个、一半、一起、不去、不好。
输出: yi2 ge4  yi4 ban4  yi4 qi3  bu2 qu4  bu2 hao3 。

不做变调处理,"一"和"不"都用默认调,中文就一股机器味。

2.2 英文 G2P:词 → CMUdict 查表 → 神经 fallback

英文的难点跟中文正好反过来:大多数词读音有规则可循(但例外极多),少数词根本不按拼写念。策略是"查表为主,猜为辅"。

Step 1 词 → CMUdict

CMU Pronouncing Dictionary 是卡内基梅隆大学维护的英文单词 → 音素 对照库,约 13.5 万词条,用 ARPABET 编码:

ARPABET IPA 例词
AA ɑ father
AE æ cat
AH ʌ cup
ER ɝ bird
EY say
IY i she
OW go
UW u blue

加辅音共约 40 个符号。示例------"Please call Stella":

python 复制代码
输入: Please call Stella.
输出:
  P L IY1 Z          # Please
  K AO1 L            # call
  S T EH1 L AH0      # Stella

数字表示重音等级:1 = 主重音,2 = 次重音,0 = 非重音。Stella 的重音落在 EH1,末尾元音是 AH0(弱化的 "uh")。

Step 2 OOV 用神经 G2P 兜底

OOV(Out-of-Vocabulary) 来源:新词("GPT"、"TikTok")、专名("Riemann"、"Nguyen")、俚语。这时用 sequence-to-sequence 模型从字母序列预测音素序列。经典方案是 g2p-seq2seq(LSTM encoder-decoder + attention)------推理时把新词字母喂 encoder,decoder 吐音素。示例------"iPhone":

python 复制代码
输入: The new iPhone is cool.
输出: DH AH0  N UW1  AY1 F OW2 N  IH1 Z  K UW1 L .

iPhone 被 g2p-seq2seq 推测成 /ˈaɪfoʊn/(AY1 F OW2 N),跟真实读音一致。工业界常见组合是 CMUdict 查表 + espeak-ng 兜底------espeak-ng 是规则引擎,覆盖 100+ 语言,OOV 硬推也能出结果,音质粗糙但稳。

英文 G2P 的两个额外坑

① 不规则拼写------"Colonel Sanders"

"colonel" 拼写像 /ˈkɒlənel/,实际读 /ˈkɜːrnəl/:

python 复制代码
输入: Colonel Sanders is a colonel.
输出: K ER1 N AH0 L  S AE1 N D ER0 Z  IH1 Z  AH0  K ER1 N AH0 L .

不查表硬推就废了。

② 多音词消歧------read / record / live / produce

同拼写不同读音,靠时态 / 词性 / 上下文消歧:

python 复制代码
过去时: I read a book yesterday.
       AY1  R EH1 D  AH0  B UH1 K  Y EH1 S T ER0 D EY2 .

现在时: I read books every day.
       AY1  R IY1 D  B UH1 K S  EH1 V R IY0  D EY1 .

record 的重音位移是英文韵律的核心特征------动词 /rɪˈkɔːrd/ 重音在后音节(R IH0 K AO1 R D),名词 /ˈrɛkərd/ 重音在前音节(R EH1 K ER0 D):

python 复制代码
输入: She will record a new record.
输出: SH IY1  W IH1 L  R IH0 K AO1 R D  AH0  N UW1  R EH1 K ER0 D .

前后两个 record,重音位置完全反过来。

2.3 中英文 G2P 路线对比

维度 中文 英文
基本单元 字(~4000 常用) → 拼音 → 音素 词(~13 万 CMUdict) → ARPABET
核心难点 多音字消歧(行 / 重 / 乐) 不规则拼写 + OOV(colonel / read)
消歧手段 词典 + BERT CMUdict 查表 + g2p-seq2seq / espeak-ng
额外处理 轻声、儿化、变调("一 / 不") 重音标记、连读("did you" → /dɪdʒə/)
音素集大小 ~45-65 ~40 (ARPABET)
典型输出长度 每字 1-3 个音素 每词 2-8 个音素

一个正在发生的趋势:第 5 代 LLM-based TTS(VALL-E / CosyVoice / F5-TTS)开始跳过显式 G2P,直接把 grapheme(字 / 字母)当 tokenizer 输入,让模型自己在几十万小时训练数据里学"字 → 音"的映射。好处是链路简化、跨语种通用;代价是训练数据不够时多音字 / 专名照样翻车。现状:第 3/4 代还在认真做 G2P,第 5 代开始"偷懒"但没做好的也会自己吃亏。

三、六代链路演进

一张图看清楚三段式如何被并合:

图中从上到下依次展示第 1 至第 6 代的链路形态:色块是该代实际存在的模块(前端 / 声学 / 声码器 / 大模型),箭头是数据流向。第 1 代只有检索 + 拼接一步;第 2-3 代恢复三段式;第 4 代声学与声码器合并;第 5 代三段全部消失、统一成一个大模型;第 6 代在第 4/5 代基础上压缩下放到端侧。下面按每代拆开:

  • 第 1 代把前端和声学 / 声码器合并到 unit 库检索一步------没有真正的声学建模,直接靠"检索最像的原声碎片"
  • 第 2 代恢复三段式,用统计模型建声学分布 + 参数式声码器还原波形
  • 第 3 代把声学模型换成神经网络(Tacotron / FastSpeech),声码器换成神经声码器(WaveNet 系)------但两段仍独立训练
  • 第 4 代用 VITS 一次前向把声学和声码器合并------真正端到端
  • 第 5 代把前端也吸收进大模型,用 audio codec 把音频离散化后当"另一种语言"生成------三段式彻底消失
  • 第 6 代在第 4/5 代基础上做蒸馏和量化,追求端侧可部署

六代模型中间表征的差异------同样是"文本 → 音素 → 中间态 → 波形",中间那一段的选择是各代最大的分歧:

代际 前端输出 中间声学表征 落地为波形的方式
1 拼接 音素 + 上下文特征(检索键) 无独立表征 --- 波形碎片库里的 int16 PCM 片段(半音节 / 双音素) PSOLA 首尾平滑拼接
2 HMM-TTS 音素 + 韵律 → HMM state 序列 F0 + MCC + BAP(float32, 帧级) --- WORLD / STRAIGHT 的三通道输出 WORLD / STRAIGHT 参数式还原
3 Tacotron / FastSpeech 音素 ID 序列(char 或 phoneme) mel-spectrogram (float32, shape (80, T)) HiFi-GAN / WaveGlow → float32 wave
4 VITS 音素 ID 序列 VAE latent z(模型内部变量,不作为分段接口暴露) decoder 从 z 直接吐 wave
5 大模型 · AR 派 text token(音素 / BPE / char) audio codec token(int32, 75 Hz × 4-8 层, EnCodec / DAC) codec decoder → wave
5 大模型 · NAR 派 text / semantic token mel (flow matching / diffusion 生成) 或 codec token(NAR Transformer) mel → HiFi-GAN,或 codec decoder → wave
6 端侧 同第 4/5 代 偏好 VITS + ISTFTNet(Kokoro 系)或 flow matching + mel(Matcha / F5 系) 蒸馏 / 量化后的小声码器

一句话总结中间表征的演化:第 3 代之前是人工设计的声学参数 (F0 / MCC),第 3 代进入连续 mel 谱第 4 代 VITS 把中间表征收进模型内部 (VAE latent 不再作为分段接口),第 5 代分家------AR 派把 mel 换成学出来的离散 codec token 让生成像 LLM 序列建模,NAR 派内部又分 Flow Matching / Diffusion(生成 mel) 和 Codec-NAR Transformer(生成 codec token) 两支。第 6 代把这些方案压小放端侧,骨架继承 VITS 或 Matcha,不发明新范式。

第 5 代内部的三组分类关系AR 派 / NAR 派 是 TTS 模型层,区别在生成范式 ------AR 派靠自回归 LM 一 token 一 token 吐出音频序列(VALL-E / MegaTTS / Seed-TTS),NAR 派一次前向出完整序列(Voicebox / F5-TTS / NaturalSpeech 3)。Codec 侧 (EnCodec / DAC / SoundStream)不是独立的 TTS 模型,而是共享的音频离散化基础设施 ------把连续音频压成离散 token 序列,供上层调用。AR 派必须依赖 codec(直接生成 codec token);NAR 派可选依赖(走 mel 的分支不用 codec, 走 codec-NAR Transformer 的分支才用)。表里单列一组,是把"生成范式"和"底层工具"两个正交维度分开呈现。

每代典型工作与时间线

代际 代表工作(机构 --- 模型名) 首发年月 引用 / 来源
1 拼接 Edinburgh --- Unit Selection concatenative(Hunt & Black) 1996 ICASSP 1996(IEEE 需付费)
UMons --- MBROLA(diphone 合成) 1996 https://github.com/numediart/MBROLA
Edinburgh CSTR --- Festival TTS 1996+ https://www.cstr.ed.ac.uk/projects/festival/
2 HMM-TTS Nagoya Tech --- HMM-based synthesis(JP) 1999 https://www.isca-archive.org/eurospeech_1999/yoshimura99_eurospeech.html
Nagoya Tech --- HTS toolkit 2007 http://hts.sp.nitech.ac.jp/
Yamanashi Univ --- WORLD 参数式声码器 2016 https://www.jstage.jst.go.jp/article/transinf/E99.D/7/E99.D_2015EDP7457/_article
3 Tacotron / FastSpeech + 神经声码器 DeepMind --- WaveNet 2016-09 https://arxiv.org/abs/1609.03499
Google --- Tacotron(Interspeech 2017) 2017-03 https://arxiv.org/abs/1703.10135
Baidu / 百度 --- Deep Voice 3(ICLR 2018) 2017-10 https://arxiv.org/abs/1710.07654
DeepMind --- Parallel WaveNet(首个实时神经声码器) 2017-11 https://arxiv.org/abs/1711.10433
Google --- Tacotron 2(ICASSP 2018) 2017-12 https://arxiv.org/abs/1712.05884
Google --- Tacotron GST(style tokens, ICML 2018) 2018-03 https://arxiv.org/abs/1803.09017
Microsoft --- FastSpeech(NeurIPS 2019) 2019-05 https://arxiv.org/abs/1905.09263
Microsoft --- FastSpeech 2(ICLR 2021) 2020-06 https://arxiv.org/abs/2006.04558
NVIDIA --- FastPitch 2020-06 https://arxiv.org/abs/2006.06873
Kakao --- HiFi-GAN(NeurIPS 2020) 2020-10 https://arxiv.org/abs/2010.05646
NVIDIA --- BigVGAN(ICLR 2023) 2022-06 https://arxiv.org/abs/2206.04658
4 端到端并行 VITS Kakao --- VITS(ICML 2021) 2021-06 https://arxiv.org/abs/2106.06103
Coqui --- YourTTS(多语言 VITS, ICML 2022) 2021-12 https://arxiv.org/abs/2112.02418
Cornell --- StyleTTS 2(NeurIPS 2023) 2023-06 https://arxiv.org/abs/2306.07691
5 语音大模型 · AR 派 Google --- AudioLM 2022-09 https://arxiv.org/abs/2209.03143
Microsoft --- VALL-E 2023-01 https://arxiv.org/abs/2301.02111
Google --- SPEAR-TTS 2023-02 https://arxiv.org/abs/2302.03540
Microsoft --- VALL-E X(多语言) 2023-03 https://arxiv.org/abs/2303.03926
Suno.ai --- Bark(开源, 无论文) 2023-04 https://github.com/suno-ai/bark
Google --- SoundStorm(并行 codec 生成) 2023-05 https://arxiv.org/abs/2305.09636
字节跳动 / ByteDance --- MegaTTS 2 2023-07 https://arxiv.org/abs/2307.07218
Coqui-AI --- XTTS v2(开源) 2023-11 https://github.com/coqui-ai/TTS
Amazon --- BASE-TTS 2024-02 https://arxiv.org/abs/2402.08093
字节跳动 Seed 团队 --- Seed-TTS 2024-06 https://arxiv.org/abs/2406.02430
阿里巴巴 --- CosyVoice 2024-07 https://arxiv.org/abs/2407.05407
阿里巴巴 --- CosyVoice 2 2024-12 https://arxiv.org/abs/2412.10117
5 语音大模型 · NAR / Flow / Diffusion 派 Microsoft --- NaturalSpeech 2 2023-04 https://arxiv.org/abs/2304.09116
Meta --- Voicebox(NeurIPS 2023) 2023-06 https://arxiv.org/abs/2306.15687
KTH --- Matcha-TTS(ICASSP 2024) 2023-09 https://arxiv.org/abs/2309.03199
Meta --- Audiobox(统一 speech / sound / music) 2023-12 https://arxiv.org/abs/2312.15821
MyShell.ai --- OpenVoice(零样本克隆) 2023-12 https://arxiv.org/abs/2312.01479
Stability AI / HF --- Parler-TTS(自然语言 style 控制) 2024-02 https://arxiv.org/abs/2402.01912
Microsoft --- NaturalSpeech 3(ICML 2024) 2024-03 https://arxiv.org/abs/2403.03100
Microsoft --- E2-TTS(SLT 2024) 2024-06 https://arxiv.org/abs/2406.18009
SJTU / 上海 AI Lab --- F5-TTS 2024-10 https://arxiv.org/abs/2410.06885
5 Codec 侧支撑 Google --- SoundStream(TASLP 2022) 2021-07 https://arxiv.org/abs/2107.03312
Meta --- EnCodec 2022-10 https://arxiv.org/abs/2210.13438
Descript --- DAC(NeurIPS 2023) 2023-06 https://arxiv.org/abs/2306.06546
6 端侧 / 轻量 / 对话式 rhasspy --- Piper(VITS 蒸馏) 2023 https://github.com/rhasspy/piper
MyShell --- MeloTTS(开源, 多语言 CPU) 2024-02 https://github.com/myshell-ai/MeloTTS
Kyutai --- Moshi(对话式 speech LLM) 2024-09 https://arxiv.org/abs/2410.00037
hexgrad(HF) --- Kokoro-82M(StyleTTS 2 骨架, 无正式论文) 2024-12 https://huggingface.co/hexgrad/Kokoro-82M
Bilibili --- IndexTTS 2025 https://github.com/index-tts/index-tts

闭源商业系统只提供 API、没有公开论文或权重、内部架构从公开材料看不出,本表暂不收录------包括:

  • 国外OpenAI TTS API (2023-11) / Voice Engine 预览; ElevenLabs (英文情感 TTS 标杆); Cartesia Sonic; Play.ht Play 3.0; Hume Octave; Rime Mist; Deepgram Aura; LMNT
  • 国内MiniMax Speech-01; iFlytek 讯飞星火语音; 腾讯云 TTS; 火山引擎 语音合成(字节的商业化产品线,与 Seed-TTS 研究团队独立)

它们在产品端 影响不小(尤其 ElevenLabs / MiniMax 在英文和多语言零样本合成上定义了行业标准),但技术追溯只能靠社区拆解和 API 行为观察。

2026 年目前的进展(截至 7 月, arXiv 检索到的 TTS 主题工作,按发表顺序):

  • VoCodec --- https://arxiv.org/abs/2601.13055 (2026-01)------面向实时通信的轻量低比特率语音 codec。以 Vocos 为 backbone, 349M MAC/s + 30 ms 延迟;在 2025 LRAC Challenge Track 1 排第四,干净语音 MUSHRA 拿第一;可选加前端子网做语音增强
  • ReStyle-TTS --- https://arxiv.org/abs/2601.03632 (2026-01, ACL 2026)------零样本合成的相对连续 style 控制。传统方法是"绝对 style 目标 + 离散文本 prompt";ReStyle 用 Decoupled Classifier-Free Guidance 分离文本 / 参考控制、style-specific LoRA + Orthogonal LoRA Fusion 做多属性解耦、加 Timbre Consistency Optimization 防音色漂移。可在 pitch / energy / 情感维度做平滑相对调整
  • WavTTS --- https://arxiv.org/abs/2606.03455 (2026-06)------首个直接在原始波形空间生成的零样本 TTS。老思路都是先出 VAE latent 或 mel 再解码,信息损失明显;WavTTS 用 flow matching + Diffusion Transformer + patchification 直接处理波形序列,配 mel 谱多尺度监督做知觉引导。声称在开源 benchmark 上接近 latent-space SOTA
  • DELTA-TTS --- https://arxiv.org/abs/2607.04140 (2026-07, ICML 2026 SPIGM Workshop)------把预训练 AR TTS 通过 LoRA 轻量适配 改造成离散 diffusion language model,用 confidence-ordered decoding + time-shifted inference schedule 加速。LibriTTS 585 小时训练,Seed-TTS test-en WER 1.75%,生成速度比 AR backbone 快 3.3×
  • WordVoice --- https://arxiv.org/abs/2607.06461 (2026-07)------LLM-TTS 的词级细粒度控制。放出 4.7k 小时中英双语数据集 WordVoice-5A(每词标 5 维:duration / 边界 / energy / pitch / tone);模型侧用 bound-token 机制在 LLM 里显式做韵律规划,token→waveform 阶段再加声学 modulation module。可对多个韵律维度做解耦控制且不损失零样本稳定性

总体判断:2026 上半年没有明确的"第 7 代"范式突破 ------主线在第 5 / 6 代基础上做四件事:精细化控制 (WordVoice / ReStyle-TTS)、采样方式改造 (DELTA-TTS AR → Diffusion)、中间表征探索 (WavTTS 跳过 latent 直接建模波形)、轻量优化(VoCodec)。真正的下一代范式还在孕育。

四、TTS 评测的五域框架与现状

TTS 的落地场景已经渗透到车载导航(首包延迟硬要求 300 ms 以内)、中文听书(头部平台新增内容里 AI 合成占比快速攀升, 业界估算已接近半数)、数字人 / 虚拟主播、无障碍阅读、客服 IVR、游戏 NPC 配音替身、实时会议翻译等。每个场景对 TTS 的要求都不一样------车载要低延迟、有声书要韵律、克隆要相似度、端侧要小------"哪一代最好"没有单一答案,选型只能看目标场景。

4.1 TTS 的评测维度:五域拆解

给合成音频打分,业界成熟的评价框架分成五个维度域(各域内部指标独立,域之间可能存在耦合):

  • 语音质量:自然度(MOS / UTMOS / DNSMOS / NISQA)、纯净度(底噪、金属音、尾爆------用 DNSMOS 子分 Noise / Coloration / Discontinuity 或 SNR 衡量)、静音异常(词间 > 300 ms 或句尾 > 800 ms 记为异常)
  • 内容保真 :可懂度(Whisper / Paraformer 打字错率 CER)、发音准确性(强制对齐 + pypinyin 比对得到 phone 错误率 PER)。CER 管"字面对不对"、PER 管"字音对不对" ------前者关心 ASR 能否还原文字, 后者关心每个字音是否念对; PER 内部再分音错 (多音字 / 轻声 / 儿化 / 变调读错)、漏读 (phone 级消失)、多读 / 幻觉(多余 phone 段 + ASR 回看)三个子问题
  • 说话人特性:音色相似度(用 ASV 模型如 ECAPA-TDNN / WavLM-ECAPA 提 speaker embedding 算余弦相似度------论文里常叫 SIM、SECS、ASV score,本质是同一件事;SMOS 是对应的主观打分)、音色一致性(跨句 speaker embedding 余弦方差)、风格 / 情感相似度(emotion classifier 置信度 / prosody embedding 距离)
  • 韵律:重音节奏(F0 峰值相对位置、duration 模式对比 reference)、停顿(词间 pause duration 分布 vs 人工标注)、语调(F0 contour DTW 距离)
  • 性能:首包延迟 TTFB、实时因子 RTF、尾包延迟 TTLB、并发退化、资源占用(内存 / 显存 / 模型大小)

还有一个跨域概念------鲁棒性 :长难句、数字英文混排、生僻字、特殊符号的处理是否稳定。它同时影响可懂度(内容保真)、发音准确性(内容保真)、韵律甚至静音异常(语音质量),不归任何一域独占------作为跨域诊断维度不列入五域主框架,在专项评测里单独计分。

中文 TTS 特别看重"内容保真"域下的发音准确性、漏读、多读三项------多音字("银行 / 行走"、"重庆 / 沉重")、轻声、儿化、变调错一个字整句就废;漏读和幻觉是 LLM-based TTS(VALL-E / XTTS / F5 系列)的典型 bug,只看 CER 抓不住,得加强制对齐 + phone 级差分才看得清。

一份最小评测配置至少要覆盖:自然度 + 可懂度 + 发音准确性 + 音色相似度 + RTF 五项;诊断阶段再加漏读 / 多读 / 静音异常 / 鲁棒性;情感 TTS 和生产环境按需补上情感相似度和纯净度。

关于"语音质量"域下打分器怎么选、每个打分器在什么场景会失效,之前专门有一篇《音频 MOS 演进:从 PESQ 到 SpeechQualityLLM》 讲过。

4.2 有参打分器为什么不适用 TTS

13 个打分器里,PESQ / STOI / SI-SDR 三兄弟属于有参客观指标------都要求 degraded wav 跟一段 time-aligned、内容一致的 clean reference 逐帧比较。ANS / AEC / 去混响这类"同一段内容的修复任务"天然满足这个前提;但在标准 TTS 评测中(不同 speaker、不同韵律)没有对应的 clean truth 版本------同一段文本让人和机器各读一遍,波形长度不同、韵律不同、发音人不同,硬拿人声原版对齐算 PESQ 得到的分数没有物理意义。

有两个例外场景仍可以借用有参指标:语音转换(VC) 里 source 和 target 内容一致,可以算 PESQ;声码器 ablation study 保持 acoustic model 不变、只换 vocoder,也能拿同 speaker 的自然录音做 reference。除此之外,正常的多 speaker / 多韵律 TTS 场景,PESQ 系一律不适用。

所以后面横评实际用得上的是剩下 10 个:

  • 纯无参 MOS 打分器:DNSMOS SIG/BAK/OVRL、DNSMOS Pro、NISQA、UTMOS、UTMOSv2、SQUIM-Sub(用非匹配 ref 也能打)、Audiobox AE 四维(CE / CU / PC / PQ)
  • SQUIM-Obj 的取巧:通过 DNN 学习从 degraded wav 直接到 PESQ / STOI / SI-SDR 分数的映射------训练阶段仍依赖配对数据(clean + degraded),但推理阶段只喂单条 wav 就能出分
  • TTS 场景特有的两个指标 :SIM(等价于 SECS / ASV score------用 ASV 模型如 ECAPA-TDNN 或 WavLM-ECAPA 提 speaker embedding 算余弦相似度,需要 speaker prompt;跨 encoder 的绝对值不可比, 同一个 backbone 打的分数才可对齐)、CER(Whisper 转文字后跟 ground-truth 算字错率)

即使这些"能用"的打分器也不是每个都好用:

  • UTMOS / UTMOSv2 换域偏移明显:UTMOS 主要在 LJSpeech 等英文合成语音上训练,迁移到中文 TTS 时与人工 MOS 的皮尔逊相关系数会从 0.9+ 降到 0.7 附近(依数据集而异)------换域时打出的绝对分不能直接跟英文场景对齐
  • DNSMOS Pro 的 SIG 维度在高信噪比区饱和:SIG 更关心底噪水平,几乎所有现代 TTS 输出都很干净,SIG 分挤在 4.2-4.5 之间几乎没有区分度;诊断 TTS 应该主要看 OVRL 维度而不是 SIG
  • NISQA 对新一代大模型合成的判断有偏:训练数据以 pre-LLM 时代的 TTS + noisy speech 为主,对 VALL-E / F5 系列这种"太像真人"的输出反而会有意外的低分。
相关推荐
武子康2 小时前
调查研究-224 Prefill 与 Decode 分离:高并发 LLM Serving 的下一层架构
人工智能·ai·架构·llm·gpu·vllm·sglang
ting94520002 小时前
技术解析:Owl Alpha 底层架构与 OpenRouter 模型网关全链路实现(无营销、纯技术向)
人工智能·架构
Liora_Yvonne2 小时前
为什么你写了3年前端还是搭不好一个项目
前端·架构
郝学胜_神的一滴2 小时前
系统设计 019:分片拆分与副本容灾深度解析
后端·架构
禅思院3 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【三】
前端·架构·前端框架
DianSan_ERP12 小时前
电商架构演进:如何在高并发场景下实现多平台API的标准化履约?
运维·前端·网络·安全·架构·自动化
喜欢的名字被抢了12 小时前
FastAPI 取代 Flask 的底层逻辑:一场类型驱动的 API 架构革命
架构·flask·fastapi
zhanghaofaowhrql15 小时前
vLLM 与 SGLang 推理框架性能横评:架构、吞吐与延迟的深度解析
架构·vllm·sglang
珠海西格电力15 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源