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 上达到比实时更快的推理速度。整个流程分为四个阶段:
文本处理:通过
espeak-ng进行 G2P(字素到音素)转换;中日语使用 BERT 分词器(通过unidic)。中英混合文本会被自动分段并路由到相应的音素提取器。BERT 编码器:轻量级 MiniLM 编码器从输入文本中提取上下文表征,捕捉韵律和语义细微差别。
流式声学模型:深度可分离卷积将 BERT 特征转换为梅尔频谱图。这是计算的主要部分,通过优化的卷积内核在 CPU 上高效运行。
HiFi-GAN 声码器:梅尔频谱图通过预训练声码器转换为原始音频,采样率为 22kHz。


整个流程是非自回归的,意味着模型并行处理完整文本,而不是逐个标记生成音频。这一架构选择使得亚实时推理速度成为可能。
安装与设置 #
前置条件 #
安装 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 4800U | 0.55 | ~110 ms | 笔记本 CPU |
| NVIDIA RTX 3090 | 0.08 | ~15 ms | 批处理 |
| Raspberry Pi 4 (4GB) | 1.9 | ~380 ms | 慢于实时 |
与替代品对比 #
| 特性 | MeloTTS | Coqui TTS (XTTS) | ChatTTS | Bark |
|---|---|---|---|---|
| GitHub Stars | 7,400 | 34,000 | 33,000 | 37,000 |
| 许可证 | MIT | MIT / AGPL | AGPL-3.0 | MIT |
| CPU 实时 | 是 (RTF 0.41) | 否 (需 GPU) | 部分支持 | 否 |
| 模型体积 | ~180-300 MB | ~1.5-3 GB | ~1.2 GB | ~2-5 GB |
| 支持语言 | 6 (+ EN 口音) | 17 | 2 (中, 英) | 13+ |
| 语音克隆 | 否 | 是 (6秒样本) | 有限 | 是 |
| 混合语言 | 是 (中+英) | 否 | 是 | 部分 |
| 显存需求 | 0 (CPU) | 4-6 GB | 4-8 GB | 8-12 GB |
| 最大时长 | 无限制 | 无限制 | ~30秒 | ~14秒 |
| 情感控制 | 仅语速 | 是 | 是 | 是 |
| 设置时间 | < 5 分钟 | 15-30 分钟 | 15-20 分钟 | 20-30 分钟 |
| 商业使用 | 是 | 部分 | 是 | 是 |
应用场景推荐 #
| 应用场景 | 最佳选择 | 原因 |
|---|---|---|
| 仅 CPU 边缘部署 | MeloTTS | CPU 上唯一 RTF < 0.5 的选项,模型不到 300MB |
| 语音克隆应用 | Coqui XTTS | 专用语音克隆管线,6 秒参考音频即可 |
| 中文对话 AI | ChatTTS | 针对对话韵律优化 |
| 创意音频 (音乐, SFX) | Bark | 可生成非语音音频 |
| 多语言 SaaS 产品 | MeloTTS | MIT 许可证,资源占用最小 |
| 批量有声书生成 | Coqui TTS | 更多语音选择,支持长内容 |
延迟对比 (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;
}
}
与替代品对比 #
详细功能矩阵 #
| 能力 | MeloTTS | Coqui TTS | ChatTTS | Bark |
|---|---|---|---|---|
| 架构 | VITS2 + BERT | VITS / XTTS | GPT-based | GPT-style transformer |
| 训练数据 | 多语言语料库 | LJSpeech + 自定义 | 对话数据 | Suno 内部数据 |
| 开放权重 | 是 | 是 | 是 | 是 |
| 可自托管 | 是 | 是 | 是 | 是 |
| 离线可用 | 是 | 是 | 是 | 是 |
| 流式输出 | 是 | 否 | 否 | 否 |
| SSML 支持 | 否 | 是 | 否 | 否 |
| 微调文档 | 有 | 详尽 | 有限 | 极少 |
| 社区规模 | 中等 | 大 | 大 | 非常大 |
| 最近更新 | 2024-12 | 活跃中 | 活跃中 | 2024 |
选择建议 #
MeloTTS:当你需要仅 CPU 部署、多语言支持、MIT 许可证和亚秒级延迟时选择。适合 SaaS 产品、移动端后端和边缘设备。
Coqui TTS:当需要语音克隆或最大预训练语音选择时选择。XTTS-v2 模型可生成开源中最自然的克隆语音。
ChatTTS:针对中文或英文对话 AI 应用选择。韵律针对对话调优,适合聊天机器人和虚拟助手。
Bark:当需要生成音乐、笑声或音效等创意音频时选择。代价是显著更高的计算需求。
局限性 / 客观评估 #
MeloTTS 并非万能方案。以下是需要考虑的具体局限:
无语音克隆:与 Coqui XTTS 或 Bark 不同,MeloTTS 无法从参考音频克隆说话人。你只能使用每种语言内置的说话人。
无情感控制:你可以调整语速,但没有参数控制快乐、悲伤、愤怒等情感质量。Bark 和 ChatTTS 提供更丰富的情感表达。
G2P 限制:默认字素到音素管线使用基于规则的
espeak-ng,偶尔会对罕见词或专有名词发音错误。没有开箱即用的神经 G2P。无流式推理:虽然完整生成速度很快,但你必须等待整个音频合成完成后才能开始播放。不支持真正的逐块流式传输。
微调文档有限:自定义数据集训练可行,但文档比 Coqui TTS 稀疏。自定义训练需要阅读源代码。训练流程包括数据预处理、BERT 特征提取、声学模型训练和声码器微调四个阶段,每个阶段都需要仔细调整超参数。
不支持 SSML:不支持用于控制停顿、强调和音素级细节的语音合成标记语言(Speech Synthesis Markup Language)。这意味着你无法通过 XML 标签控制语音的韵律细节,如
<break time="500ms"/>或<emphasis>等。每种语言说话人数量少:每种语言只有一个说话人(英语有口音变体)。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_path 和 ckpt_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 是务实的选择。
行动清单:
- 运行
pip install melotts今天合成你的第一个音频,体验亚秒级语音合成的速度 - 在 Nginx 后部署 FastAPI 示例以获得生产级 TTS 端点
- 加入 MeloTTS GitHub Discussions 获取社区支持和最新更新
- 关注 dibi8 Telegram 群组获取每周 AI 工具更新
- 如果在生产环境遇到性能瓶颈,可以尝试 model quantization 或使用 ONNX Runtime 加速
- 对于客服系统等多语言场景,MeloTTS 的 REST API 能无缝集成到现有微服务架构中,支持水平扩展
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
💬 留言讨论