Coqui TTS 语音合成¶
为什么要学 Coqui TTS¶
Coqui TTS 是一个功能完善的开源语音合成框架,支持多种 TTS 模型架构(Tacotron2、VITS、YourTTS 等),提供了从训练到推理的完整工具链。与 Bark 的不可控性不同,Coqui TTS 允许精确控制语速、音调,并支持用自己的数据微调模型实现语音克隆。对于需要可控、可定制语音合成的应用来说,Coqui TTS 是最灵活的开源方案。
核心概念¶
| 概念 | 白话解释 | 用途 |
|---|---|---|
| TTS Model | 语音合成模型 | 将文本转为声学特征 |
| Vocoder | 声码器 | 将声学特征转为音频波形 |
| Speaker Embedding | 说话人嵌入 | 多说话人模型的音色表示 |
| Voice Cloning | 语音克隆 | 用少量参考音频复制音色 |
| XTTS | 跨语言 TTS | 支持多语言的最新模型 |
| Phonemizer | 音素化器 | 将文字转为音素序列 |
安装配置¶
安装¶
模型选择¶
# 列出所有可用模型
tts --list_models
# 主要模型:
# tts_models/multilingual/multi-dataset/xtts_v2 ← 最强多语言模型
# tts_models/zh-CN/baker/tacotron2-DDC ← 中文
# tts_models/en/ljspeech/tacotron2-DDC ← 英文经典
# tts_models/en/vctk/vits ← 多说话人
快速上手¶
命令行使用¶
# 基础 TTS
tts --text "Hello, this is a test." --out_path output.wav
# 中文
tts --text "你好,这是语音合成测试。" \
--model_name tts_models/zh-CN/baker/tacotron2-DDC \
--out_path chinese.wav
# XTTS v2(多语言+语音克隆)
tts --text "你好世界" \
--model_name tts_models/multilingual/multi-dataset/xtts_v2 \
--speaker_wav reference.wav \
--language_idx zh-cn \
--out_path output.wav
Python API¶
from TTS.api import TTS
# 加载模型
tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2",
gpu=True)
# 基本合成
tts.tts_to_file(
text="你好,我是人工智能语音助手。",
file_path="output.wav",
language="zh-cn"
)
# 语音克隆
tts.tts_to_file(
text="This is voice cloning in action.",
file_path="cloned.wav",
speaker_wav="reference_audio.wav",
language="en"
)
实时播放¶
from TTS.api import TTS
import sounddevice as sd
import numpy as np
tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2")
# 生成音频数组
wav = tts.tts(
text="这是实时播放测试。",
language="zh-cn"
)
# 播放
sd.play(np.array(wav), samplerate=22050)
sd.wait()
进阶用法¶
XTTS v2 高级用法¶
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
# 加载配置和模型
config = XttsConfig()
config.load_json("path/to/config.json")
model = Xtts.init_from_config(config)
model.load_checkpoint(config, checkpoint_dir="path/to/checkpoint/")
model.cuda()
# 计算说话人潜在表示
gpt_cond_latent, speaker_embedding = model.get_conditioning_latents(
audio_path=["reference1.wav", "reference2.wav"]
)
# 生成语音
out = model.inference(
text="你好,这是高级语音合成。",
language="zh",
gpt_cond_latent=gpt_cond_latent,
speaker_embedding=speaker_embedding,
temperature=0.7,
)
import torchaudio
torchaudio.save("output.wav", torch.tensor(out["wav"]).unsqueeze(0), 24000)
流式生成¶
from TTS.tts.models.xtts import Xtts
import sounddevice as sd
model = Xtts.init_from_config(config)
model.load_checkpoint(config, checkpoint_dir="checkpoint/")
# 获取说话人特征
gpt_cond_latent, speaker_embedding = model.get_conditioning_latents(
audio_path=["reference.wav"]
)
# 流式生成
chunks = model.inference_stream(
text="这是一段较长的文本,我们使用流式方式生成。",
language="zh",
gpt_cond_latent=gpt_cond_latent,
speaker_embedding=speaker_embedding,
stream_chunk_size=20,
)
stream = sd.OutputStream(samplerate=24000, channels=1)
stream.start()
for chunk in chunks:
stream.write(chunk.cpu().numpy())
stream.stop()
多说话人模型¶
from TTS.api import TTS
# VCTK 多说话人模型
tts = TTS(model_name="tts_models/en/vctk/vits")
# 列出可用说话人
print(tts.speakers)
# 使用特定说话人
tts.tts_to_file(
text="Hello from speaker p225",
file_path="speaker_p225.wav",
speaker="p225"
)
微调/训练自定义模型¶
# 准备数据格式
# dataset/
# ├── metadata.csv # filename|text
# ├── wavs/
# │ ├── audio_001.wav
# │ ├── audio_002.wav
# │ └── ...
# metadata.csv 格式:
# audio_001|你好世界
# audio_002|今天天气很好
# 训练配置
from TTS.tts.configs.vits_config import VitsConfig
from TTS.tts.models.vits import Vits
config = VitsConfig(
batch_size=16,
eval_batch_size=8,
num_loader_workers=4,
run_name="my-chinese-tts",
output_path="output/",
datasets=[{
"formatter": "ljspeech",
"path": "dataset/",
"meta_file_train": "metadata.csv",
"language": "zh-cn",
}],
)
# 启动训练
# python TTS/bin/train_tts.py --config_path config.json
部署为 API¶
from fastapi import FastAPI
from fastapi.responses import FileResponse
from TTS.api import TTS
import tempfile
app = FastAPI()
tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)
@app.post("/synthesize")
async def synthesize(text: str, language: str = "zh-cn"):
tmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
tts.tts_to_file(text=text, file_path=tmp.name, language=language)
return FileResponse(tmp.name, media_type="audio/wav")
# TTS 内置 API 服务器
# tts-server --model_name tts_models/multilingual/multi-dataset/xtts_v2
常见问题¶
Q: 中文发音不标准?¶
- 使用 XTTS v2 模型配合中文参考音频
- 或使用专门的中文模型
tts_models/zh-CN/baker/tacotron2-DDC - 添加拼音标注辅助发音
Q: 生成速度慢?¶
- 使用 GPU 加速
- XTTS v2 支持流式生成
- 对于低延迟需求,使用 VITS 模型(单阶段,更快)
Q: 语音克隆效果不好?¶
- 参考音频要清晰(无背景噪音、无混响)
- 参考音频 5-15 秒最佳
- 使用多段参考音频
- XTTS v2 在少样本克隆上效果最好
Q: Coqui TTS 项目还在维护吗?¶
Coqui AI 公司已关闭,但代码开源。社区继续维护 fork 版本。XTTS v2 模型仍然是同类最强之一。
参考资源¶
- GitHub:https://github.com/coqui-ai/TTS
- 文档:https://tts.readthedocs.io/
- 模型列表:https://github.com/coqui-ai/TTS#models
- Hugging Face:https://huggingface.co/coqui
- Demo:https://huggingface.co/spaces/coqui/xtts