本篇是「TTS 架构的六代演进」系列第 1 篇。
TTS(Text-to-Speech) 就是"文字转语音"------给一段文字,让机器读出来。这件事看似只是"倒着做一次语音识别",实际上比语音识别难得多:识别只要输出唯一正确的文字序列;合成却要在无数种合理发音之间选一种,还要让它听起来像"一个具体的人"。
任务定义 :给一段文字 T = t_1 t_2 ... t_L,生成一段能被听懂、听起来自然、音色符合期望的波形 W = w_1 w_2 ... w_N。L 是几十到几百个字符,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 出来的。评测五域(自然度、可懂度、说话人、韵律、性能)量的,其实就是"这次幻觉的质量"。
"韵律标签"到底指什么? 上面示意里的音素序列同时携带三类韵律信息:
- 调号 / 重音等级 ------藏在音素的数字后缀里。英文
IY1的1是主重音(0=非重音,1=主重音,2=次重音);中文体系里qing3的3是第三声(共 5 级:1/2/3/4/0=轻声)。这类"标签"直接扩大音素 vocab------IY和IY1视作不同 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 字 → 拼音(多音字消歧)
三档方案,从轻到重:
- 规则 + 词典(轻量):建多音字词组库("行长 → háng"、"银行 → háng"、"道行 → héng"),按词切后查词库,覆盖率 85-90%
- 决策树 / WFST(中配):给每个多音字建一棵上下文决策树,特征是前后 N 个字、词性、是否成语------清华、科大讯飞早年方案
- 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 | eɪ | say |
| IY | i | she |
| OW | oʊ | 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 系列这种"太像真人"的输出反而会有意外的低分。