跳转至

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音素化器将文字转为音素序列

安装配置

安装

pip install TTS

# 验证安装
tts --list_models

模型选择

# 列出所有可用模型
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