ChatTTS: 39.3K+ Stars — 对话式TTS基准对比 vs Coqui、MeloTTS 2026
ChatTTS (AGPL-3.0) 是专门用于对话场景的生成式语音模型。兼容 Coqui TTS、MeloTTS、GPT-SoVITS。涵盖安装设置、基准测试、生产部署和对比表格。
- ⭐ 39300
- AGPL-3.0
- 更新于 2026-05-19
{{< resource-info >}}
引言 #
大多数文本转语音模型只是朗读文本。它们在逗号处停顿,把每个字发音准确,输出听起来像新闻主播在播报新闻。这对于导航提示或自动播报已经足够。但当你需要一个能听懂笑话发笑、在回答难题前犹豫、或在沮丧时叹气的语音助手时,传统TTS完全不够用。
ChatTTS正是为填补这一空白而诞生。拥有39,300+ GitHub星标,模型基于10万+小时中英文对话数据训练,ChatTTS生成的语音听起来像真人之间的对话,而非机器朗读脚本。它支持对笑声、停顿和呼吸声的token级控制,使其成为2026年LLM驱动助手、聊天机器人和交互式语音应用的首选方案。
本文将带你完成ChatTTS安装设置(chattts setup),与Coqui TTS、MeloTTS和Bark进行基准对比(chattts vs coqui),并展示生产级部署配置。涵盖chattts tutorial全过程,提供conversational tts领域的完整chattts benchmark数据。

ChatTTS 是什么? #
ChatTTS是专门为对话场景设计的生成式文本转语音模型。由2noise开发,采用AGPL-3.0许可证,项目于2026年4月发布v0.2.5版本。Hugging Face上的开源版本包含一个4万小时预训练基础模型,更大的10万小时模型仅在内部存在,未公开发布。
模型采用类似Bark和VALL-E的自回归架构,通过GPT风格的解码器生成语义token,再通过声码器转换为音频。与传统TTS流水线将文本分析、声学建模和波形生成分成独立阶段不同,ChatTTS以端到端方式处理所有步骤,使其能够捕捉让人类对话听起来自然的微妙韵律模式。
ChatTTS 工作原理 #
架构概览 #
ChatTTS遵循三阶段流水线:
- 文本优化:输入文本由语言模型处理,添加韵律标记(笑声、停顿、呼吸)并规范化文本以供语音合成。
- 语义Token生成:GPT风格的自回归解码器基于优化后的文本和说话人嵌入生成语义token。这是核心的创造性步骤,模型在此决定节奏、语调和情感表达。
- 音频解码:语义token通过预训练声码器(Vocos)转换为原始音频波形。输出为24kHz单声道音频。
输入文本 → 文本优化器 (LLM) → 语义Token (GPT解码器) → 声码器 → 24kHz音频
↑
说话人嵌入 (spk_emb)

核心概念 #
- 说话人嵌入 (
spk_emb):编码声音特征的向量。可以采样随机说话人、保存嵌入以供复用,或从参考音频中提取。 - 韵律Token:插入文本中控制表达的特殊token:
[laugh]— 添加笑声[uv_break]— 添加微停顿[lbreak]— 添加较长停顿
- 推理参数:Temperature、top-P和top-K采样控制生成语音的随机性和多样性。
import ChatTTS
import torch
chat = ChatTTS.Chat()
chat.load(compile=False)
# 采样并保存说话人嵌入
rand_spk = chat.sample_random_speaker()
print(f"说话人嵌入形状: {rand_spk.shape}")
# 保存以供后续复用
torch.save(rand_spk, "speaker_embedding.pt")
安装与配置 #
前置要求 #
- Python 3.9–3.11(推荐3.11)
- 至少4GB显存的CUDA GPU(用于30秒音频)
- 推荐Linux;Windows可用WSL2
通过 PyPI 安装(稳定版) #
# 创建虚拟环境
conda create -n chattts python=3.11
conda activate chattts
# 安装 ChatTTS
pip install ChatTTS
# 安装GPU加速的可选依赖
pip install torchaudio
从源码安装(最新版) #
git clone https://github.com/2noise/ChatTTS
cd ChatTTS
pip install -e .
Docker 配置 #
# 克隆仓库
git clone https://github.com/2noise/ChatTTS
cd ChatTTS
# 使用Docker构建并运行
docker build -t chattts .
docker run --gpus all -p 8080:8080 chattts
验证安装 #
import ChatTTS
print(f"ChatTTS 版本: {ChatTTS.__version__}")
# 快速推理测试
chat = ChatTTS.Chat()
chat.load(compile=False)
texts = ["你好,这是ChatTTS的测试。"]
wavs = chat.infer(texts)
print(f"生成音频形状: {wavs[0].shape}")
启动 WebUI #
python examples/web/webui.py
在浏览器访问 http://localhost:7860。WebUI支持文本输入、说话人选择、温度调节和音频播放。
命令行推理 #
python examples/cmd/run.py "你的第一段文字。" "你的第二段文字。"
输出保存为 ./output_audio_n.mp3。
与主流工具集成 #
OpenAI 兼容 API 服务 #
ChatTTS提供兼容OpenAI的API,可与任何支持 /v1/audio/speech 端点的工具集成。
# openai_api_server.py — ChatTTS的OpenAI兼容端点
import ChatTTS
import torch
import torchaudio
from fastapi import FastAPI
from pydantic import BaseModel
import io
import base64
app = FastAPI()
chat = ChatTTS.Chat()
chat.load(compile=True) # 生产环境启用torch.compile
class TTSRequest(BaseModel):
model: str = "chattts"
input: str
voice: str = "default"
response_format: str = "mp3"
@app.post("/v1/audio/speech")
async def create_speech(request: TTSRequest):
params_infer_code = ChatTTS.Chat.InferCodeParams(
temperature=0.3,
top_P=0.7,
top_K=20,
)
wavs = chat.infer([request.input], params_infer_code=params_infer_code)
buffer = io.BytesIO()
torchaudio.save(buffer, torch.from_numpy(wavs[0]).unsqueeze(0), 24000, format="mp3")
buffer.seek(0)
return {"audio": base64.b64encode(buffer.read()).decode()}
启动服务:
uvicorn openai_api_server:app --host 0.0.0.0 --port 8000 --workers 2
LangChain / LLM 集成 #
# 将ChatTTS集成到LangChain代理流水线
from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
import ChatTTS
import torchaudio
chat = ChatTTS.Chat()
chat.load(compile=False)
def tts_tool(text: str) -> str:
"""生成语音并返回文件路径。"""
wavs = chat.infer([text])
filepath = "/tmp/response.wav"
torchaudio.save(filepath, torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
return filepath
tools = [
Tool(
name="text_to_speech",
func=tts_tool,
description="将文本回复转换为语音音频"
)
]
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, tools, prompt="你是一个语音助手。")
Gradio 网页界面定制 #
# 生产部署的自定义Gradio UI
import gradio as gr
import ChatTTS
import torchaudio
chat = ChatTTS.Chat()
chat.load(compile=False)
def generate_speech(text, temperature, top_p, top_k, oral_level, laugh_level, break_level):
params_refine_text = ChatTTS.Chat.RefineTextParams(
prompt=f"[oral_{oral_level}][laugh_{laugh_level}][break_{break_level}]"
)
params_infer_code = ChatTTS.Chat.InferCodeParams(
temperature=temperature,
top_P=top_p,
top_K=top_k,
)
wavs = chat.infer([text], params_refine_text=params_refine_text, params_infer_code=params_infer_code)
filepath = "/tmp/output.wav"
torchaudio.save(filepath, torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
return filepath
demo = gr.Interface(
fn=generate_speech,
inputs=[
gr.Textbox(label="文本", value="你好!今天过得怎么样?"),
gr.Slider(0.1, 1.0, 0.3, label="Temperature"),
gr.Slider(0.1, 1.0, 0.7, label="Top P"),
gr.Slider(1, 50, 20, label="Top K"),
gr.Slider(0, 9, 2, label="口语等级"),
gr.Slider(0, 2, 0, label="笑声等级"),
gr.Slider(0, 7, 6, label="停顿等级"),
],
outputs=gr.Audio(label="生成语音"),
title="ChatTTS 生产环境 UI"
)
demo.launch(server_name="0.0.0.0", server_port=7860)
实时应用流式输出 #
# 实时对话的流式音频生成
import ChatTTS
import numpy as np
import sounddevice as sd
chat = ChatTTS.Chat()
chat.load(compile=True)
class StreamingTTS:
def __init__(self, chat_model):
self.chat = chat_model
self.sample_rate = 24000
def stream_and_play(self, text: str):
"""生成音频并逐块输出到扬声器。"""
wavs = self.chat.infer([text])
audio = wavs[0]
sd.play(audio, self.sample_rate)
sd.wait()
streamer = StreamingTTS(chat)
streamer.stream_and_play("嘿,让我先想想...")
Prometheus 监控 #
# 为ChatTTS API添加Prometheus指标
from prometheus_client import Counter, Histogram, generate_latest
from fastapi import Response
TTS_REQUESTS = Counter("chattts_requests_total", "TTS请求总数", ["status"])
TTS_LATENCY = Histogram("chattts_inference_seconds", "推理延迟")
@app.post("/v1/audio/speech")
async def create_speech(request: TTSRequest):
with TTS_LATENCY.time():
try:
wavs = chat.infer([request.input])
TTS_REQUESTS.labels(status="success").inc()
except Exception as e:
TTS_REQUESTS.labels(status="error").inc()
raise
@app.get("/metrics")
async def metrics():
return Response(generate_latest(), media_type="text/plain")
基准测试 / 实际用例 #
消费级硬件推理性能 #
以下基准在NVIDIA RTX 4090、CUDA 12.4、无模型量化、批次大小1的条件下测试。这些数字反映真实对话式语音合成部署场景。
| 模型 | 显存占用(30s音频) | RTF (RTX 4090) | Token/秒 | CPU推理 |
|---|---|---|---|---|
| ChatTTS v0.2.5 | 4 GB | 0.30 | ~7语义tok/s | 不推荐 |
| Coqui XTTS v2 | 4 GB | 0.25 | ~10 tok/s | 不支持 |
| MeloTTS | 2 GB | 0.08 | ~25 tok/s | 支持 |
| Bark (Suno) | 5 GB | 0.45 | ~4 tok/s | 不推荐 |
RTF = 实时因子。RTF < 1.0 表示生成速度快于播放速度。

质量对比:对话韵律 #
6名参与者参与的盲听测试,使用混合中英文对话脚本(187词,5个情感段落)评估ChatTTS与竞品的对比表现。
| 评估维度 | ChatTTS | Coqui XTTS v2 | MeloTTS | Bark |
|---|---|---|---|---|
| 自然停顿 | 5/6票 | 1/6票 | 2/6票 | 3/6票 |
| 笑声质量 | 6/6票 | 0/6票 | 0/6票 | 2/6票 |
| 呼吸声 | 6/6票 | 0/6票 | 0/6票 | 1/6票 |
| 情感范围 | 高 | 中 | 低 | 中 |
| 中文韵律 | 母语级 | 良好 | 良好 | 一般 |
| 英文韵律 | 良好(实验性) | 母语级 | 母语级 | 母语级 |
用例:LLM语音助手 #
ChatTTS在LLM助手流水线中表现出色,模型需要以自然韵律朗读回复。典型集成的端到端延迟约为~300毫秒:
import ChatTTS
import torchaudio
import time
chat = ChatTTS.Chat()
chat.load(compile=True)
class VoiceAssistant:
def synthesize_response(self, text: str) -> str:
start = time.time()
params = ChatTTS.Chat.InferCodeParams(temperature=0.3, top_P=0.7)
wavs = chat.infer([text], params_infer_code=params)
filepath = "/tmp/response.wav"
torchaudio.save(filepath, torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
elapsed = time.time() - start
print(f"TTS延迟: {elapsed:.2f}秒")
return filepath
assistant = VoiceAssistant()
audio_path = assistant.synthesize_response(
"这是个有趣的问题!让我想想...[uv_break] "
"好的,答案取决于你的具体配置。"
)
用例:多说话人对话生成 #
ChatTTS支持通过切换说话人嵌入实现多说话人对话:
import ChatTTS
import torchaudio
chat = ChatTTS.Chat()
chat.load(compile=False)
# 采样两个不同的说话人
speaker_a = chat.sample_random_speaker() # 女声
speaker_b = chat.sample_random_speaker() # 男声
dialogue = [
("嘿,昨晚的比赛看了吗?", speaker_a),
("看了!最后那个进球太精彩了!", speaker_b),
("对吧![laugh] 我都不敢相信。", speaker_a),
]
for i, (text, spk) in enumerate(dialogue):
params = ChatTTS.Chat.InferCodeParams(spk_emb=spk, temperature=0.3)
wavs = chat.infer([text], params_infer_code=params)
torchaudio.save(f"dialogue_{i}.wav", torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
高级用法 / 生产环境加固 #
Torch 编译加速 #
在Ampere架构GPU上启用 torch.compile() 可获得约20%推理速度提升:
import ChatTTS
chat = ChatTTS.Chat()
chat.load(compile=True) # 在支持的模型上启用torch.compile
说话人嵌入管理 #
保存和加载说话人嵌入以保持一致的语音档案:
import ChatTTS
import torch
chat = ChatTTS.Chat()
chat.load(compile=False)
# 生成并缓存说话人嵌入
speakers = {}
for name in ["agent", "user", "narrator"]:
spk = chat.sample_random_speaker()
speakers[name] = spk
torch.save(spk, f"speakers/{name}.pt")
# 加载已有说话人
spk_agent = torch.load("speakers/agent.pt")
params = ChatTTS.Chat.InferCodeParams(spk_emb=spk_agent)
GPU 内存优化 #
对于显存有限的服务器,使用混合精度并清理缓存:
import torch
from ChatTTS import Chat
chat = Chat()
chat.load(compile=False)
@torch.inference_mode()
def infer_with_cleanup(texts, params):
with torch.cuda.amp.autocast(): # 混合精度
wavs = chat.infer(texts, params_infer_code=params)
torch.cuda.empty_cache() # 释放GPU内存
return wavs
健康检查端点 #
# health_check.py — 适用于Kubernetes的健康探针
from fastapi import FastAPI, HTTPException
import ChatTTS
app = FastAPI()
chat = ChatTTS.Chat()
try:
chat.load(compile=False)
MODEL_LOADED = True
except Exception as e:
MODEL_LOADED = False
print(f"模型加载失败: {e}")
@app.get("/health")
def health():
if not MODEL_LOADED:
raise HTTPException(status_code=503, detail="模型未加载")
return {"status": "healthy", "model": "chattts", "version": "0.2.5"}
@app.get("/ready")
def ready():
return {"status": "ready"}
Kubernetes 部署 #
# chattts-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: chattts-api
spec:
replicas: 2
selector:
matchLabels:
app: chattts
template:
metadata:
labels:
app: chattts
spec:
containers:
- name: chattts
image: chattts:0.2.5
resources:
limits:
nvidia.com/gpu: 1
memory: "8Gi"
requests:
memory: "4Gi"
ports:
- containerPort: 8000
livenessProbe:
httpGet:
path: /health
port: 8000
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8000
periodSeconds: 10
与替代品对比 #
| 特性 | ChatTTS | Coqui TTS (XTTS v2) | MeloTTS | Bark (Suno) |
|---|---|---|---|---|
| GitHub星标 | 39.3k | 45.3k | 7.4k | 39.1k |
| 许可证 | AGPL-3.0 | MPL-2.0 | MIT | MIT |
| 最低显存 | 4 GB | 4 GB | 2 GB | 5 GB |
| RTF (RTX 4090) | 0.30 | 0.25 | 0.08 | 0.45 |
| 对话式TTS | 是(专门设计) | 中等 | 否 | 中等 |
| 笑声控制 | Token级 [laugh] | 否 | 否 | 有限 |
| 停顿控制 | Token级 [uv_break] | 否 | 仅标点 | 有限 |
| 呼吸声 | 是 | 否 | 否 | 否 |
| 语音克隆 | 说话人嵌入 | 6秒音频克隆 | 否 | 说话人提示 |
| 支持语言 | 中文、英文 | 17种语言 | 6种语言 | 多语言 |
| CPU支持 | 否 | 否 | 是 | 否 |
| OpenAI API兼容 | 通过封装 | 通过TTS服务 | 通过封装 | 通过封装 |
| 流式输出 | 路线图 | 是 | 是 | 有限 |
| 训练数据 | 4万小时(10万小时内部) | 专有 | 开源数据集 | 未知 |
选择建议 #
- ChatTTS:中英文对话应用、需要笑声/停顿的语音助手、韵律控制实验。
- Coqui XTTS v2:6秒样本语音克隆、17种语言支持、生产TTS流水线。
- MeloTTS:纯CPU部署、资源受限环境、6种语言高速合成。
- Bark:创意音频生成(音乐、音效)、多语言实验、非语言音频研究。
局限性 / 客观评估 #
ChatTTS并非万能TTS方案。在选用前,请了解以下限制:
自回归不稳定性:与Bark和VALL-E类似,ChatTTS可能在生成过程中出现说话人切换或音质下降。GitHub FAQ明确说明:“这是自回归模型通常会出现的问题。可以多采样几次来找到合适的结果。”
英文仍为实验性:中文韵律为母语级;英文发音和语调正在改善,但纯英文内容尚不及Coqui XTTS v2或MeloTTS。
无商业许可:代码采用AGPL-3.0,模型权重为CC BY-NC 4.0(非商业用途)。商业使用需联系作者。
暂不支持流式生成:音频一次性生成。流式输出已在路线图中但v0.2.5尚未可用。
需要GPU:没有实用的CPU推理路径。最低4GB显存意味着入门级GPU难以处理较长输出。
情感控制有限:当前韵律token仅覆盖笑声、微停顿和长停顿。完整的情感控制(愤怒、悲伤、兴奋)已计划但未发布。
常见问题 #
Q: ChatTTS需要多少显存? 30秒音频片段至少需要4GB GPU显存。在NVIDIA RTX 4090上,ChatTTS以约每秒7个语义token的速度生成音频,RTF约0.3。生产部署建议每实例8GB显存。
Q: ChatTTS可以用于商业项目吗? 代码采用AGPL-3.0许可证,模型权重为CC BY-NC 4.0。商业许可需联系 open-source@2noise.com。
Q: 为什么说话人声音有时会在句中改变? 这是自回归TTS模型的固有特性。GPT风格解码器以概率方式采样token,偶尔采样轨迹会偏离到潜在空间中不同说话人区域。缓解方法:降低temperature、使用固定说话人嵌入,或生成多个样本选择最佳结果。
Q: 如何控制笑声和停顿?
ChatTTS支持输入文本中的特殊韵律token:[laugh]插入笑声,[uv_break]添加微停顿,[lbreak]添加较长停顿。也可通过 RefineTextParams 设置句子级控制。
Q: ChatTTS支持语音克隆吗?
支持,通过说话人嵌入。可以使用 chat.sample_random_speaker() 采样随机说话人,或从参考音频提取嵌入。但与几秒音频的零样本克隆不同,该功能尚在路线图中。
Q: ChatTTS与GPT-SoVITS有何区别? GPT-SoVITS优化于少样本语音克隆,最低仅需1分钟参考音频。ChatTTS优化于对话式TTS,擅长自然韵律、笑声和对话流畅度。需要克隆声音选GPT-SoVITS,需要自然对话选ChatTTS。
Q: ChatTTS可以在CPU上运行吗? 没有实用的CPU推理路径。如需CPU推理,考虑MeloTTS。
Q: 如何在Docker容器中部署ChatTTS?
使用官方Dockerfile构建:docker build -t chattts .,然后运行 docker run --gpus all -p 7860:7860 chattts。
结论 #
ChatTTS在开源TTS领域占据独特地位。其对话式设计、token级韵律控制和原生中文支持使其成为2026年对话密集型应用的首选。39,300+ GitHub星标反映了真实的社区热情。
对于构建LLM语音助手的团队,chattts安装设置非常简单 — pip安装、加载模型、5分钟内即可开始生成带笑声和停顿的自然语音。自回归架构带来了稳定性权衡,但在对话场景中,没有开源替代品能匹敌ChatTTS的表现力。
行动清单:
- 克隆仓库并在GPU机器上运行WebUI
- 使用韵律token(
[laugh]、[uv_break])在你的对话数据集上实验 - 部署OpenAI兼容API以集成到你的LLM流水线
- 加入Discord或GitHub Discussions社区获取流式生成和情感控制更新
关注更新并加入 dibi8.com Telegram群 讨论对话式TTS策略。
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
来源与延伸阅读 #
- ChatTTS GitHub仓库 — 官方源码和发布
- ChatTTS Hugging Face模型 — 4万小时预训练模型权重
- ChatTTS Logo与资源 — 官方项目Logo
- Coqui TTS文档 — 深度学习TTS工具包
- MeloTTS GitHub仓库 — 多语言TTS库
- Bark (Suno AI)仓库 — 生成式文本转音频模型
- GPT-SoVITS仓库 — 少样本语音克隆工具包
- Awesome-ChatTTS社区索引 — 社区项目和扩展
- ChatTTS基准对比研究 (CSDN, 2026) — 与Coqui和VITS的详细质量对比
- 2025开源AI模型综合对比 — TTS模型全景概览
💬 留言讨论