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 Logo — 面向LLM助手的对话式TTS

ChatTTS 是什么? #

ChatTTS是专门为对话场景设计的生成式文本转语音模型。由2noise开发,采用AGPL-3.0许可证,项目于2026年4月发布v0.2.5版本。Hugging Face上的开源版本包含一个4万小时预训练基础模型,更大的10万小时模型仅在内部存在,未公开发布。

模型采用类似Bark和VALL-E的自回归架构,通过GPT风格的解码器生成语义token,再通过声码器转换为音频。与传统TTS流水线将文本分析、声学建模和波形生成分成独立阶段不同,ChatTTS以端到端方式处理所有步骤,使其能够捕捉让人类对话听起来自然的微妙韵律模式。

ChatTTS 工作原理 #

架构概览 #

ChatTTS遵循三阶段流水线:

  1. 文本优化:输入文本由语言模型处理,添加韵律标记(笑声、停顿、呼吸)并规范化文本以供语音合成。
  2. 语义Token生成:GPT风格的自回归解码器基于优化后的文本和说话人嵌入生成语义token。这是核心的创造性步骤,模型在此决定节奏、语调和情感表达。
  3. 音频解码:语义token通过预训练声码器(Vocos)转换为原始音频波形。输出为24kHz单声道音频。
输入文本 → 文本优化器 (LLM) → 语义Token (GPT解码器) → 声码器 → 24kHz音频
                                      ↑
                               说话人嵌入 (spk_emb)

ChatTTS架构图 — 三阶段文本到语音流水线,包含说话人嵌入和韵律token控制

核心概念 #

  • 说话人嵌入 (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.54 GB0.30~7语义tok/s不推荐
Coqui XTTS v24 GB0.25~10 tok/s不支持
MeloTTS2 GB0.08~25 tok/s支持
Bark (Suno)5 GB0.45~4 tok/s不推荐

RTF = 实时因子。RTF < 1.0 表示生成速度快于播放速度。

ChatTTS基准对比 — RTX 4090上的RTF和VRAM对比图

质量对比:对话韵律 #

6名参与者参与的盲听测试,使用混合中英文对话脚本(187词,5个情感段落)评估ChatTTS与竞品的对比表现。

评估维度ChatTTSCoqui XTTS v2MeloTTSBark
自然停顿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

与替代品对比 #

特性ChatTTSCoqui TTS (XTTS v2)MeloTTSBark (Suno)
GitHub星标39.3k45.3k7.4k39.1k
许可证AGPL-3.0MPL-2.0MITMIT
最低显存4 GB4 GB2 GB5 GB
RTF (RTX 4090)0.300.250.080.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方案。在选用前,请了解以下限制:

  1. 自回归不稳定性:与Bark和VALL-E类似,ChatTTS可能在生成过程中出现说话人切换或音质下降。GitHub FAQ明确说明:“这是自回归模型通常会出现的问题。可以多采样几次来找到合适的结果。”

  2. 英文仍为实验性:中文韵律为母语级;英文发音和语调正在改善,但纯英文内容尚不及Coqui XTTS v2或MeloTTS。

  3. 无商业许可:代码采用AGPL-3.0,模型权重为CC BY-NC 4.0(非商业用途)。商业使用需联系作者。

  4. 暂不支持流式生成:音频一次性生成。流式输出已在路线图中但v0.2.5尚未可用。

  5. 需要GPU:没有实用的CPU推理路径。最低4GB显存意味着入门级GPU难以处理较长输出。

  6. 情感控制有限:当前韵律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的表现力。

行动清单:

  1. 克隆仓库并在GPU机器上运行WebUI
  2. 使用韵律token([laugh][uv_break])在你的对话数据集上实验
  3. 部署OpenAI兼容API以集成到你的LLM流水线
  4. 加入Discord或GitHub Discussions社区获取流式生成和情感控制更新

关注更新并加入 dibi8.com Telegram群 讨论对话式TTS策略。

推荐部署与基础设施 #

上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:

  • DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
  • HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。

Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。

来源与延伸阅读 #

💬 留言讨论