语音识别把声音变文字,语音合成(TTS)是它的逆过程:把文字变声音。智能客服的应答、有声书的旁白、导航的”前方右转”,背后都是 TTS。这一篇和 ASR 篇配对,构成完整的语音技术线。
前置阅读:语音识别入门(采样率、梅尔频谱等音频基础本篇直接复用)。
两段式架构:先谱后声
现代 TTS 几乎都拆成两步:
第一步:声学模型——文本 → 梅尔频谱图。这一步决定”说什么、什么语调、什么节奏”。代表模型是 Tacotron 2(自回归,稳但慢)和 FastSpeech 2(非自回归,快且可控——时长、音高、能量可以显式调节)。
第二步:声码器(Vocoder)——梅尔频谱 → 波形。这一步决定”声音有多真”。代表是 HiFi-GAN(生成对抗思路,快且质量高)。两步解耦的好处:声码器训练好后可以服务多个声学模型。
文本进声学模型前还有一道文本前端:分词、多音字消歧(“行长”读 háng 还是 zhǎng)、数字归一化(“2026 年”读”二零二六年”)、韵律预测(哪里停顿)。中文 TTS 的半壁江山在这道工序——前端错了,后面模型再好也是字正腔圆地念错。
演进:拼接 → 参数 → 端到端
- 拼接合成(上古):录大量真人语音切片,按文本拼起来。自然度可以很高,但死板、无法改音色、拼接处有毛刺。
- 参数合成:统计模型直接生成声学参数。灵活但声音发”机器味”。
- 端到端神经合成:Tacotron 2 + WaveNet 开启了新时代,VITS 这类模型进一步把声学模型和声码器合成一个端到端网络,文本直接到波形。
今天的实用格局:开源侧 VITS 系(含 Bert-VITS2 等中文社区改进版)质量最好;零样本声音克隆(给几秒钟参考音频就模仿其音色)以 GPT-SoVITS、XTTS 为代表。
实战:中文 TTS 的最短路径
个人项目不建议从头训练(数据要几十小时录音 + 训练成本高),直接用预训练模型:
# 方案一:edge-tts(微软在线引擎,零部署,质量高)
# pip install edge-tts
import edge_tts
import asyncio
async def synth():
tts = edge_tts.Communicate(
"今天我们来讨论模型的训练稳定性问题。",
voice="zh-CN-YunxiNeural", # 中文男声;云希/晓晓/云野各有性格
rate="+0%", pitch="+0Hz")
await tts.save("output.mp3")
asyncio.run(synth())
# 方案二:本地 VITS(离线、可定制音色)
# 用开源 VITS 中文预训练模型加载推理即可
选型的实用建议:在线服务(edge-tts / 云厂商)质量稳定零维护,优先;需要离线、定制音色、或大量生成控制成本时上本地 VITS 系。
评估:MOS 与工程指标
MOS 来自听众对特定样本的主观评分,不能只给一个均值而省略听众数量、文本选择和播放条件。语速自然、数字读法正确与音色相似也不是同一个目标,最好分开记录,避免一个综合分掩盖明显读错。
TTS 的评估比 ASR 主观:
- MOS 分:人工打分 1-5(自然度),4.0 以上接近真人。小项目可以 3-5 人小组盲听打分。
- 可懂度:合成的语音拿去做 ASR,识别错误率低说明发音清晰——这是便宜的客观代理指标。
- 工程指标:RTF(实时率,合成 1 秒音频耗时多少秒)、首包延迟(流式场景)。
坏案例要分类记录:多音字错、数字读法错、韵律平淡、长句断气——每一类对应不同的修复路径(前端词典、文本规范化、模型/参数)。
与 ASR 的对照记忆
| 维度 | ASR | TTS |
|---|---|---|
| 方向 | 声音 → 文字 | 文字 → 声音 |
| 核心模型 | Whisper / Conformer | Tacotron/FastSpeech + HiFi-GAN |
| 评估 | WER(客观) | MOS(主观)+ ASR 回测 |
| 工程难点 | 噪声、长音频切分 | 文本前端、韵律自然度 |
踩坑排查
| 症状 | 原因 | 处理 |
|---|---|---|
| 多音字读错 | 前端词典缺失 | 自定义词典/拼音标注强制指定 |
| 数字/英文读法怪 | 文本规范化没做 | 预处理:数字转汉字、英文转音译 |
| 长句后半段跑调 | 模型长文本不稳 | 按标点切句合成再拼接 |
| 合成速度跟不上 | 自回归模型慢 | 换 FastSpeech 类非自回归 |
| 音色不像参考音 | 克隆模型需微调 | 用几分钟目标音色数据微调 |
| 背景有电流声 | 采样率/格式转换错 | 统一 16bit PCM 处理链 |
练习
- 用 edge-tts 合成一段含多音字(“银行行长”)的文本,记录错误并用拼音标注修复。
- 对比 3 个不同音色在同样文本上的 MOS 盲评分。
- 用 ASR 回测法评估合成语音的可懂度(合成 → Whisper 识别 → 算 WER)。
- 实现长文本自动切句合成 + 拼接,对比整段合成的差异。
面试常问
Q:TTS 的两段式架构及各部分职责? 声学模型把文本转成梅尔频谱(决定内容和韵律),声码器把频谱转成波形(决定音质)。解耦让声码器可复用,也让韵律控制有明确的干预点。
Q:中文 TTS 特有的难点? 多音字消歧、文本规范化(数字/符号/英文读法)、韵律层次(中文是声调语言,语调模式与英文不同)——大部分工程投入在文本前端而非声学模型本身。
Q:声音克隆的技术路线? 少样本:说话人编码器提取音色嵌入做条件(零样本克隆);多样本:在目标音色数据上微调。几分钟数据的微调效果通常显著优于零样本。
Q:怎么评估 TTS 系统? 主观 MOS(自然度)是黄金标准;ASR 回测 WER 是可懂度的客观代理;工程上 RTF 与首包延迟决定可用性。离线优化看 MOS,线上体验看延迟。
💬 评论
这套方案在哪一步卡住了?也欢迎补充你的实现方式或踩坑经验。