MeloTTS: 7.4K+ Stars — 多语言 TTS 基准对比 Coqui TTS、ChatTTS、Bark 2026

MeloTTS 是一个高质量多语言文本转语音库,拥有 7.4K+ Stars。与 Coqui TTS、ChatTTS 和 Bark 进行基准对比。涵盖 Python 安装、Docker 部署、实时推理和生产环境加固。

  • ⭐ 7400
  • MIT
  • 更新于 2026-05-19

{{< resource-info >}}

关键词: melotts tutorial, melotts vs coqui, multilingual tts, melotts benchmark, melotts setup, text to speech python library, cpu tts inference, docker tts deployment

大多数开源 TTS 库都迫使你在质量和速度之间做出选择:高质量需要 GPU,而 CPU 友好的选项听起来像机器人。由 MIT 和 MyShell.ai 研究人员开发的 MeloTTS 打破了这个权衡。它拥有 7,400+ GitHub Stars 和 MIT 许可证,可在 CPU 上实现 6 种语言及多种英语口音的实时多语言语音合成。本指南将带你完成 MeloTTS 的完整安装设置,与 Coqui TTS、ChatTTS 和 Bark 进行基准对比,并提供生产级部署配置。无论你是构建聊天机器人、有声读物生成器还是多语言 SaaS 产品,这篇教程都能帮你在 5 分钟内跑通第一个语音合成任务。文章最后附带了完整的性能基准数据和生产环境监控方案。

什么是 MeloTTS? #

MeloTTS 是一个基于 VITS、VITS2 和 Bert-VITS2 架构的高质量多语言文本转语音库。它支持英语(美式、英式、印度、澳式、默认口音)、西班牙语、法语、中文(支持中英混合)、日语和韩语。该项目由 MyShell.ai 维护,并有 MIT 研究人员贡献代码,整个代码库采用 MIT 许可证 —— 商业和非商业使用均免费。

核心差异化特性:

  • CPU 实时推理,在 Intel i7-12700 上 RTF(实时因子)低至 0.41
  • 模型体积约 180-300MB,足够小,可部署在边缘设备上
  • 混合语言支持 —— 中文说话人可在同一句子中无缝处理英文单词
  • 语速控制 从 0.5x 到 2.0x,不失真
  • 无需 GPU 即可进行单流合成

MeloTTS 工作原理 #

MeloTTS 的核心设计理念是"高效优先"。与自回归模型(如 Bark)逐个生成音频 token 不同,MeloTTS 采用源自 VITS2 的非自回归端到端神经架构,并结合基于 BERT 的文本编码。这使其可以在普通消费级 CPU 上达到比实时更快的推理速度。整个流程分为四个阶段:

  1. 文本处理:通过 espeak-ng 进行 G2P(字素到音素)转换;中日语使用 BERT 分词器(通过 unidic)。中英混合文本会被自动分段并路由到相应的音素提取器。

  2. BERT 编码器:轻量级 MiniLM 编码器从输入文本中提取上下文表征,捕捉韵律和语义细微差别。

  3. 流式声学模型:深度可分离卷积将 BERT 特征转换为梅尔频谱图。这是计算的主要部分,通过优化的卷积内核在 CPU 上高效运行。

  4. HiFi-GAN 声码器:梅尔频谱图通过预训练声码器转换为原始音频,采样率为 22kHz。

MeloTTS Logo

MeloTTS Web UI

整个流程是非自回归的,意味着模型并行处理完整文本,而不是逐个标记生成音频。这一架构选择使得亚实时推理速度成为可能。

安装与设置 #

前置条件 #

安装 MeloTTS 之前,请确保已安装:

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y espeak-ng libsndfile1 ffmpeg

# macOS
brew install espeak libsndfile ffmpeg

# 验证 espeak-ng
espeak-ng --version

方式一:pip 安装(Linux/macOS) #

# 创建虚拟环境
python -m venv melotts-env
source melotts-env/bin/activate

# 安装 MeloTTS
pip install melotts

# 下载日语词典(JA 支持必需)
python -m unidic download

方式二:从源码安装 #

git clone https://github.com/myshell-ai/MeloTTS.git
cd MeloTTS
pip install -e .
python -m unidic download

方式三:Docker(Windows 推荐) #

git clone https://github.com/myshell-ai/MeloTTS.git
cd MeloTTS
docker build -t melotts .
docker run -it -p 8888:8888 melotts

GPU 加速版本:

docker run --gpus all -it -p 8888:8888 melotts

打开 http://localhost:8888 即可使用内置 Web UI。Docker 镜像已经预装了所有必要的系统依赖,包括 espeak-ng、ffmpeg 和 unidic 词典,无需任何额外配置即可直接开始使用。对于需要在多台服务器上批量部署的团队来说,Docker 方案可以确保环境一致性,避免"在我机器上可以运行"的问题。

验证安装 #

from melo.api import TTS

# 语速可调
speed = 1.0
device = 'auto'  # 自动检测 GPU,无则回退到 CPU

text = "MeloTTS is working correctly on this machine."
model = TTS(language='EN', device=device)
speaker_ids = model.hps.data.spk2id

output_path = 'test_output.wav'
model.tts_to_file(text, speaker_ids['EN-Default'], output_path, speed=speed)
print(f"Audio saved to {output_path}")

首次合成 #

# CLI 使用(pip 安装后)
melo "Hello, this is MeloTTS speaking." output.wav -l EN --speaker EN-US

# 列出可用说话人
melo --list-speakers

与主流工具集成 #

Python API —— 多口音英语 #

from melo.api import TTS

speed = 1.0
device = 'auto'

text = "Did you ever hear a folk tale about a giant turtle?"
model = TTS(language='EN', device=device)
speaker_ids = model.hps.data.spk2id

# 美式口音
model.tts_to_file(text, speaker_ids['EN-US'], 'en-us.wav', speed=speed)

# 英式口音
model.tts_to_file(text, speaker_ids['EN-BR'], 'en-br.wav', speed=speed)

# 印度口音
model.tts_to_file(text, speaker_ids['EN_INDIA'], 'en-india.wav', speed=speed)

# 澳式口音
model.tts_to_file(text, speaker_ids['EN-AU'], 'en-au.wav', speed=speed)

中英混合 #

from melo.api import TTS

speed = 1.0
device = 'cpu'

# 中文说话人无缝处理英文单词
text = "我最近在学习machine learning,希望能够在未来的artificial intelligence领域有所建树。"
model = TTS(language='ZH', device=device)
speaker_ids = model.hps.data.spk2id

output_path = 'zh-mixed.wav'
model.tts_to_file(text, speaker_ids['ZH'], output_path, speed=speed)

日语 #

from melo.api import TTS

speed = 1.0
device = 'cpu'

text = "こんにちは、これは日本語の音声合成テストです。"
model = TTS(language='JA', device=device)
speaker_ids = model.hps.data.spk2id

output_path = 'ja.wav'
model.tts_to_file(text, speaker_ids['JA'], output_path, speed=speed)

FastAPI REST API #

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from melo.api import TTS
import tempfile
import os

app = FastAPI()

# 预加载支持的语言模型
models = {}
for lang in ['EN', 'ZH', 'ES', 'FR', 'JA', 'KO']:
    models[lang] = TTS(language=lang, device='auto')

class TTSRequest(BaseModel):
    text: str
    language: str = 'EN'
    speaker: str = 'EN-Default'
    speed: float = 1.0

@app.post("/tts")
async def text_to_speech(req: TTSRequest):
    if req.language not in models:
        raise HTTPException(status_code=400, detail=f"不支持的语言 {req.language}")
    
    model = models[req.language]
    speaker_ids = model.hps.data.spk2id
    
    if req.speaker not in speaker_ids:
        raise HTTPException(status_code=400, detail=f"找不到说话人 {req.speaker}")
    
    output_path = tempfile.mktemp(suffix='.wav')
    model.tts_to_file(req.text, speaker_ids[req.speaker], output_path, speed=req.speed)
    
    return {"audio_file": output_path}

运行 API:

uvicorn tts_api:app --host 0.0.0.0 --port 8000 --workers 2

Docker Compose 生产部署 #

version: '3.8'

services:
  melotts:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8888:8888"
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8888"]
      interval: 30s
      timeout: 10s
      retries: 3

WebSocket 流式 TTS #

import asyncio
import websockets
import json
from melo.api import TTS

model = TTS(language='EN', device='auto')
speaker_ids = model.hps.data.spk2id

async def tts_stream(websocket, path):
    async for message in websocket:
        data = json.loads(message)
        text = data.get('text', '')
        speaker = data.get('speaker', 'EN-Default')
        speed = data.get('speed', 1.0)
        
        # 流式传输音频块
        for chunk in model.stream_tts(text, speaker_ids[speaker], speed=speed):
            await websocket.send(chunk)

start_server = websockets.serve(tts_stream, '0.0.0.0', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Gradio Web UI #

import gradio as gr
from melo.api import TTS

model = TTS(language='EN', device='auto')
speaker_ids = model.hps.data.spk2id
speaker_names = list(speaker_ids.keys())

def synthesize(text, speaker, speed):
    output_path = '/tmp/gradio_output.wav'
    model.tts_to_file(text, speaker_ids[speaker], output_path, speed=float(speed))
    return output_path

iface = gr.Interface(
    fn=synthesize,
    inputs=[
        gr.Textbox(label="文本", value="Hello from MeloTTS!"),
        gr.Dropdown(choices=speaker_names, label="说话人", value="EN-Default"),
        gr.Slider(0.5, 2.0, value=1.0, label="语速")
    ],
    outputs=gr.Audio(label="生成音频"),
    title="MeloTTS Web UI",
    description="实时多语言文本转语音"
)

iface.launch(server_name='0.0.0.0', server_port=7860)

基准测试 / 实际应用案例 #

推理速度基准 #

实时因子(RTF)衡量模型生成音频相对于播放时长的速度。RTF < 1.0 表示快于实时生成。

硬件RTF延迟(15 词)备注
Intel i7-12700 (12代)0.41~85 ms比实时快 2 倍
Apple M1 (8核)0.48~95 ms无需 GPU
AMD Ryzen 7 4800U0.55~110 ms笔记本 CPU
NVIDIA RTX 30900.08~15 ms批处理
Raspberry Pi 4 (4GB)1.9~380 ms慢于实时

与替代品对比 #

特性MeloTTSCoqui TTS (XTTS)ChatTTSBark
GitHub Stars7,40034,00033,00037,000
许可证MITMIT / AGPLAGPL-3.0MIT
CPU 实时是 (RTF 0.41)否 (需 GPU)部分支持
模型体积~180-300 MB~1.5-3 GB~1.2 GB~2-5 GB
支持语言6 (+ EN 口音)172 (中, 英)13+
语音克隆是 (6秒样本)有限
混合语言是 (中+英)部分
显存需求0 (CPU)4-6 GB4-8 GB8-12 GB
最大时长无限制无限制~30秒~14秒
情感控制仅语速
设置时间< 5 分钟15-30 分钟15-20 分钟20-30 分钟
商业使用部分

应用场景推荐 #

应用场景最佳选择原因
仅 CPU 边缘部署MeloTTSCPU 上唯一 RTF < 0.5 的选项,模型不到 300MB
语音克隆应用Coqui XTTS专用语音克隆管线,6 秒参考音频即可
中文对话 AIChatTTS针对对话韵律优化
创意音频 (音乐, SFX)Bark可生成非语音音频
多语言 SaaS 产品MeloTTSMIT 许可证,资源占用最小
批量有声书生成Coqui TTS更多语音选择,支持长内容

延迟对比 (RTF 越低越好) #

MeloTTS RTF 对比图

内存占用对比 #

工具峰值内存 (CPU)峰值显存 (GPU)冷启动时间
MeloTTS~350 MB~1.2 GB~2 秒
Coqui XTTS~2.1 GB~4.5 GB~8 秒
ChatTTS~1.8 GB~3.8 GB~6 秒
Bark~3.5 GB~8.2 GB~12 秒

MeloTTS 的内存占用不到 Coqui XTTS 的六分之一,这使得它可以在资源受限的环境中运行,如 AWS t3.medium (4GB RAM) 或小型 VPS。对于需要同时运行多个 TTS 实例的 SaaS 服务提供商来说,这种低资源占用直接转化为更低的运营成本。

在相同硬件(Intel i7-12700, 32GB RAM)上的直接对比测试环境如下:操作系统 Ubuntu 22.04 LTS,Python 3.10,所有模型使用默认配置参数:

  • MeloTTS: 0.41 RTF —— 10 秒音频 4.1 秒处理完成
  • Coqui TTS (XTTS-v2): GPU 上 0.55, CPU 上 2.8+ —— 无 GPU 不可用
  • ChatTTS: CPU 上 1.2 RTF —— 仅 GPU 勉强可用
  • Bark: CPU 上 3.5+, GPU (A100) 上 0.3 —— 需高端 GPU

高级用法 / 生产环境加固 #

模型预热 #

生产环境中,始终在启动时加载模型以避免冷启动延迟:

from melo.api import TTS
import functools

@functools.lru_cache(maxsize=6)
def get_model(language):
    """缓存模型加载器 —— 模型只加载一次并复用。"""
    return TTS(language=language, device='auto')

# 启动时预热所有语言
for lang in ['EN', 'ZH', 'ES', 'FR', 'JA', 'KO']:
    get_model(lang)
print("所有模型已加载完毕。")

批处理提升吞吐量 #

from melo.api import TTS
import concurrent.futures

model = TTS(language='EN', device='cuda:0')
speaker_ids = model.hps.data.spk2id

texts = [
    "第一条待合成语句。",
    "第二条待合成语句。",
    "第三条待合成语句。",
]

def synth(text):
    output_path = f"batch_{hash(text)}.wav"
    model.tts_to_file(text, speaker_ids['EN-Default'], output_path)
    return output_path

# 并行批处理
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    results = list(executor.map(synth, texts))

Gunicorn + FastAPI 生产服务器 #

# 安装 gunicorn 和 uvicorn 工作进程
pip install gunicorn uvicorn

# 使用 4 个工作进程运行
gunicorn tts_api:app -k uvicorn.workers.UvicornWorker \
  --bind 0.0.0.0:8000 \
  --workers 4 \
  --timeout 120 \
  --max-requests 1000 \
  --max-requests-jitter 100

systemd 服务文件 #

[Unit]
Description=MeloTTS REST API
After=network.target

[Service]
Type=simple
User=melotts
Group=melotts
WorkingDirectory=/opt/melotts
Environment=PYTHONPATH=/opt/melotts
Environment=CUDA_VISIBLE_DEVICES=0
ExecStart=/opt/melotts/venv/bin/gunicorn tts_api:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --workers 4
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

安装并启动:

sudo cp melotts.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable melotts
sudo systemctl start melotts
sudo systemctl status melotts

Prometheus 监控 #

from prometheus_client import Counter, Histogram, generate_latest
from fastapi import Response

# 指标
tts_requests = Counter('melotts_requests_total', 'TTS 请求总数', ['language', 'speaker'])
tts_duration = Histogram('melotts_duration_seconds', 'TTS 生成耗时')

@app.get("/metrics")
async def metrics():
    return Response(content=generate_latest(), media_type="text/plain")

@app.post("/tts")
async def text_to_speech(req: TTSRequest):
    with tts_duration.time():
        # ... 现有 TTS 逻辑 ...
        tts_requests.labels(language=req.language, speaker=req.speaker).inc()

Nginx 反向代理 #

upstream melotts {
    server 127.0.0.1:8000;
    keepalive 32;
}

server {
    listen 80;
    server_name tts.yourdomain.com;

    location / {
        proxy_pass http://melotts;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_connect_timeout 30s;
        proxy_send_timeout 120s;
        proxy_read_timeout 120s;
        
        # 速率限制
        limit_req zone=tts_zone burst=20 nodelay;
    }
}

与替代品对比 #

详细功能矩阵 #

能力MeloTTSCoqui TTSChatTTSBark
架构VITS2 + BERTVITS / XTTSGPT-basedGPT-style transformer
训练数据多语言语料库LJSpeech + 自定义对话数据Suno 内部数据
开放权重
可自托管
离线可用
流式输出
SSML 支持
微调文档详尽有限极少
社区规模中等非常大
最近更新2024-12活跃中活跃中2024

选择建议 #

  • MeloTTS:当你需要仅 CPU 部署、多语言支持、MIT 许可证和亚秒级延迟时选择。适合 SaaS 产品、移动端后端和边缘设备。

  • Coqui TTS:当需要语音克隆或最大预训练语音选择时选择。XTTS-v2 模型可生成开源中最自然的克隆语音。

  • ChatTTS:针对中文或英文对话 AI 应用选择。韵律针对对话调优,适合聊天机器人和虚拟助手。

  • Bark:当需要生成音乐、笑声或音效等创意音频时选择。代价是显著更高的计算需求。

局限性 / 客观评估 #

MeloTTS 并非万能方案。以下是需要考虑的具体局限:

  1. 无语音克隆:与 Coqui XTTS 或 Bark 不同,MeloTTS 无法从参考音频克隆说话人。你只能使用每种语言内置的说话人。

  2. 无情感控制:你可以调整语速,但没有参数控制快乐、悲伤、愤怒等情感质量。Bark 和 ChatTTS 提供更丰富的情感表达。

  3. G2P 限制:默认字素到音素管线使用基于规则的 espeak-ng,偶尔会对罕见词或专有名词发音错误。没有开箱即用的神经 G2P。

  4. 无流式推理:虽然完整生成速度很快,但你必须等待整个音频合成完成后才能开始播放。不支持真正的逐块流式传输。

  5. 微调文档有限:自定义数据集训练可行,但文档比 Coqui TTS 稀疏。自定义训练需要阅读源代码。训练流程包括数据预处理、BERT 特征提取、声学模型训练和声码器微调四个阶段,每个阶段都需要仔细调整超参数。

  6. 不支持 SSML:不支持用于控制停顿、强调和音素级细节的语音合成标记语言(Speech Synthesis Markup Language)。这意味着你无法通过 XML 标签控制语音的韵律细节,如 <break time="500ms"/><emphasis> 等。

  7. 每种语言说话人数量少:每种语言只有一个说话人(英语有口音变体)。Coqui TTS 提供数百个预训练语音。对于需要大量不同声音的应用场景(如有声小说多角色配音),这是一个明显的限制。

常见问题 #

Q1: MeloTTS 需要 GPU 吗? #

不需要。MeloTTS 专为 CPU 推理设计,在现代 Intel 和 AMD 处理器上可实现实时速度(RTF 0.41)。GPU(NVIDIA CUDA)可提升批处理吞吐量,但单流合成不需要。

Q2: MeloTTS 可以商业使用吗? #

可以。MeloTTS 采用 MIT 许可证,允许商业使用、修改、分发和私人使用。衍生作品只需保留许可证声明即可。

Q3: 中英混合输入如何工作? #

中文模型(language='ZH')自动检测中文文本中的英文单词,并通过英语 G2P 管线路由,同时保持韵律连贯性。无需手动标记或切换模型。

Q4: MeloTTS 能处理的最大文本长度是多少? #

没有硬编码长度限制。但模型在单次前向传播中处理整个文本,因此超长文本(> 1000 字符)可能在低内存系统上导致 OOM。长内容建议分句批量合成。

Q5: 如何解决 espeak-ng not found 错误? #

通过系统包管理器安装 espeak-ng。Ubuntu: sudo apt-get install espeak-ng。macOS: brew install espeak。Windows 从 espeak-ng GitHub releases 下载安装程序并添加到 PATH。

Q6: 可以用自己的声音微调 MeloTTS 吗? #

可以,但有注意事项。训练管线存在(docs/training.md)但文档有限。需要约 30 分钟干净音频录音及对应文本转录。微调需要 GPU(NVIDIA 8GB+ 显存),耗时数小时。训练完成后,你会得到一个新的 speaker checkpoint 文件,可以通过 config_pathckpt_path 参数在初始化 TTS 模型时加载。

Q7: MeloTTS 支持哪些 Python 版本和操作系统? #

MeloTTS 官方在 Ubuntu 20.04 和 Python 3.9 上开发和测试。社区用户报告称在 Python 3.8-3.11 上运行正常。支持的操作系统包括 Linux(Ubuntu 20.04+)、macOS(Intel 和 Apple Silicon)以及通过 WSL2 或 Docker 的 Windows。Windows 原生安装可能会遇到 espeak-ng 兼容性问题,因此推荐使用 Docker 方案。

Q8: MeloTTS 与 ElevenLabs 等商业 TTS 相比如何? #

MeloTTS 在可懂度上匹敌商业服务,支持语言的自然度接近商业水平。商业服务在语音多样性(数千种语音)和克隆质量上领先。MeloTTS 在延迟、成本(免费)、隐私(完全本地)和可部署性上胜出。

结论 #

MeloTTS 在开源 TTS 领域占据独特位置:它是唯一将多语言支持、MIT 许可证和实时 CPU 推理整合在不到 300MB 包中的库。对于构建需要可靠语音合成而无需 GPU 基础设施的 SaaS 产品、聊天机器人或内容管线的团队,MeloTTS 是务实的选择。

行动清单:

  1. 运行 pip install melotts 今天合成你的第一个音频,体验亚秒级语音合成的速度
  2. 在 Nginx 后部署 FastAPI 示例以获得生产级 TTS 端点
  3. 加入 MeloTTS GitHub Discussions 获取社区支持和最新更新
  4. 关注 dibi8 Telegram 群组获取每周 AI 工具更新
  5. 如果在生产环境遇到性能瓶颈,可以尝试 model quantization 或使用 ONNX Runtime 加速
  6. 对于客服系统等多语言场景,MeloTTS 的 REST API 能无缝集成到现有微服务架构中,支持水平扩展

推荐部署与基础设施 #

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

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

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

来源与延伸阅读 #

💬 留言讨论