文本转语音
从Tacotron到F5和Kokoro,理解现代TTS的三段式架构
文本转语音 (TTS) — 从Tacotron到F5和Kokoro
ASR将语音反转成文本;TTS将文本反转为语音。2026年技术栈分三部分:文本→token,token→mel,mel→波形。每部分都有一个适合笔记本的默认模型。
类型: 构建 语言: Python 前置条件: Phase 6 · 02(频谱图与Mel),Phase 5 · 09(Seq2Seq),Phase 7 · 05(完整Transformer) 时间: ~75 分钟
问题
你有一个字符串:“Please remind me to water the plants at 6 pm.” 你需要一段3秒的音频,听起来自然,韵律正确(停顿、重音),“plants”的元音发音正确,并且在CPU上300 ms内完成以用于实时语音助手。你还需要切换声音,处理语码混合输入(“remind me at 6 pm, daijoubu?”),不要在人名上出丑。
现代TTS流水线如下:
- 文本前端。 归一化文本(日期、数字、邮箱),转换为音素或子词token,预测韵律特征。
- 声学模型。 文本 → mel频谱图。Tacotron 2 (2017)、FastSpeech 2 (2020)、VITS (2021)、F5-TTS (2024)、Kokoro (2024)。
- 声码器。 Mel → 波形。WaveNet (2016)、WaveRNN、HiFi-GAN (2020)、BigVGAN (2022)、2024+的神经编解码声码器。
2026年,声学模型+声码器的分割在端到端扩散和流匹配模型中变得模糊。但三部分的心智模型对调试仍然有效。
概念
Tacotron 2 (2017)。 Seq2seq:字符嵌入 → BiLSTM编码器 → 位置敏感注意力 → 自回归LSTM解码器输出mel帧。慢(AR),长文本不稳定。仍被引用为基线。
FastSpeech 2 (2020)。 非自回归。时长预测器输出每个音素对应多少mel帧。单次前向,比Tacotron快10倍。损失一些自然度(单调对齐)但到处在用。
VITS (2021)。 联合训练编码器 + 基流的时长 + HiFi-GAN声码器端到端,使用变分推断。高质量,单模型。2022-2024主导开源TTS。变体:YourTTS(多说话人零样本)、XTTS v2 (2024, Coqui)。
F5-TTS (2024)。 基于流匹配的扩散Transformer。自然韵律,5秒参考音频即可零样本语音克隆。2026年开源TTS排行榜榜首。335M参数。
Kokoro (2024)。 小型(82M),CPU可运行,最佳英语TTS实时性能。封闭词表仅英语,Apache-2.0。
OpenAI TTS-1-HD、ElevenLabs v2.5、Google Chirp-3。 商业SOTA。ElevenLabs v2.5的情感标签(“[whispered]”、“[laughing]“)和角色声音主导2026年有声书制作。
声码器演进
| 时代 | 声码器 | 延迟 | 质量 |
|---|---|---|---|
| 2016 | WaveNet | 仅离线 | 发布时SOTA |
| 2018 | WaveRNN | ~实时 | 良好 |
| 2020 | HiFi-GAN | 100倍实时 | 接近人类 |
| 2022 | BigVGAN | 50倍实时 | 跨说话人/语言泛化 |
| 2024 | SNAC, DAC (神经编解码) | 与AR模型集成 | 离散token,比特高效 |
到2026年,大多数”TTS”模型是从文本到波形的端到端模型;mel频谱图是内部表示。
评估
- MOS(平均意见分)。 1-5分,众包。仍是黄金标准;但速度慢得痛苦。
- CMOS(比较MOS)。 A-vs-B偏好。每个标注的置信区间更窄。
- UTMOS、DNSMOS。 无参考神经MOS预测器。用于排行榜。
- CER(字符错误率)通过ASR。 将TTS输出通过Whisper,对输入文本计算CER。可懂度的代理指标。
- SECS(说话人嵌入余弦相似度)。 语音克隆质量。
2026年LibriTTS test-clean数字:
| 模型 | UTMOS | CER (via Whisper) | 大小 |
|---|---|---|---|
| 真实语音 | 4.08 | 1.2% | — |
| F5-TTS | 3.95 | 2.1% | 335M |
| XTTS v2 | 3.81 | 3.5% | 470M |
| VITS | 3.62 | 3.1% | 25M |
| Kokoro v0.19 | 3.87 | 1.8% | 82M |
| Parler-TTS Large | 3.76 | 2.8% | 2.3B |
构建它
步骤 1:音素化输入
from phonemizer import phonemize
ph = phonemize("Hello world", language="en-us", backend="espeak")
# 'həloʊ wɜːld'
音素是通用桥梁。避免将原始文本输入VITS级别以下的任何模型。
步骤 2:运行Kokoro(2026年CPU默认)
from kokoro import KPipeline
tts = KPipeline(lang_code="a") # "a" = 美式英语
audio, sr = tts("Please remind me to water the plants at 6 pm.", voice="af_bella")
# audio: float32张量, sr=24000
离线运行,单文件,82M参数。
步骤 3:使用F5-TTS进行语音克隆
from f5_tts.api import F5TTS
tts = F5TTS()
wav = tts.infer(
ref_file="my_voice_5s.wav",
ref_text="The quick brown fox jumps over the lazy dog.",
gen_text="Please remind me to water the plants.",
)
传入5秒参考片段 + 其转录;F5克隆韵律和音色。
步骤 4:从零构建HiFi-GAN声码器
太大无法放入教程脚本,但形状如下:
class HiFiGAN(nn.Module):
def __init__(self, mel_channels=80, upsample_rates=[8, 8, 2, 2]):
super().__init__()
# 4个上采样块,总共256倍从mel速率到音频速率
...
def forward(self, mel):
return self.blocks(mel) # -> 波形
训练:对抗性(短窗口上的判别器)+ mel频谱图重建损失 + 特征匹配损失。已商品化 — 使用 hifi-gan 仓库或nvidia-NeMo的预训练检查点。
步骤 5:完整流水线(伪代码)
text = "Please remind me at 6 pm."
phones = phonemize(text)
mel = acoustic_model(phones, speaker=alice) # [T, 80]
wav = vocoder(mel) # [T * 256]
soundfile.write("out.wav", wav, 24000)
使用它
2026年技术栈:
| 场景 | 选择 |
|---|---|
| 实时英语语音助手 | Kokoro (CPU) 或 XTTS v2 (GPU) |
| 5秒参考语音克隆 | F5-TTS |
| 商业角色声音 | ElevenLabs v2.5 |
| 有声书旁白 | ElevenLabs v2.5 或 XTTS v2 + 微调 |
| 低资源语言 | 在5-20小时目标语言数据上训练VITS |
| 表达性/情感标签 | ElevenLabs v2.5 或 StyleTTS 2微调 |
截至2026年开源领先者:F5-TTS用于质量,Kokoro用于效率。除非你是历史学家,否则不要用Tacotron。
陷阱
- 没有文本归一器。 “Dr. Smith”读作”Doctor”还是”Drive”?“2026”读作”twenty twenty six”还是”two zero two six”?在音素化器之前归一化。
- OOV专有名词。 “Ghumare” → “ghyu-mair”?为未知token提供后备的字素到音素模型。
- 削波。 声码器输出很少削波,但推理时的mel缩放不匹配可能超出±1.0。始终
np.clip(wav, -1, 1)。 - 采样率不匹配。 Kokoro输出24 kHz;你的下游流水线期望16 kHz → 重采样或产生混叠。
交付它
将结果保存为 outputs/skill-tts-designer.md。为给定声音、延迟和语言目标设计TTS流水线。
练习
- 简单。 运行
code/main.py。从玩具词表构建音素字典,估算每个音素的时长,并打印假的”mel”调度。 - 中等。 安装Kokoro,用
af_bella和am_adam声音合成同一句话。比较音频时长和主观质量。 - 困难。 录制5秒自己的参考片段。使用F5-TTS克隆。报告参考和克隆输出之间的SECS。
关键术语
| 术语 | 通俗说法 | 实际含义 |
|---|---|---|
| 音素 | 声音单位 | 抽象声音类别;英语39个(ARPABet)。 |
| 时长预测器 | 每个音素持续多久 | 非AR模型输出;每个音素的整数帧数。 |
| 声码器 | Mel→波形 | 将mel频谱映射为原始样本的神经网络。 |
| HiFi-GAN | 标准声码器 | 基于GAN;2020-2024主导。 |
| MOS | 主观质量 | 人类评分者的1-5平均意见分。 |
| SECS | 语音克隆指标 | 目标和克隆说话人嵌入之间的余弦相似度。 |
| F5-TTS | 2024开源SOTA | 流匹配扩散;零样本克隆。 |
| Kokoro | CPU英语领先者 | 82M参数模型,Apache 2.0。 |
延伸阅读
- Shen et al. (2017). Tacotron 2 — seq2seq基线。
- Kim, Kong, Son (2021). VITS — 端到端基于流。
- Chen et al. (2024). F5-TTS — 当前开源SOTA。
- Kong, Kim, Bae (2020). HiFi-GAN — 2026年仍在使用的声码器。
- Kokoro-82M on HuggingFace — 2024 CPU友好的英语TTS。