MeloTTS:7400+ 星标 — 多语言 TTS 与 Coqui TTS 基准对比
MeloTTS 是一个拥有 7400+ star 的高质量多语言文本转语音库。本文对比其与 Coqui TTS、ChatTTS、Bark 的基准表现,涵盖 Python 环境搭建、Docker 部署、实时推理与生产环境强化。
- MIT
- 更新于 2026-05-19
大多数开源 TTS 库都会逼你做出取舍:高质量意味着需要 GPU,而对 CPU 友好的选项听起来又很机械。由 MIT 和 MyShell.ai 研究人员开发的 MeloTTS 打破了这种权衡。它在 GitHub 上拥有 7400+ star,采用 MIT 许可证,能够在 CPU 上跨 6 种语言和多种英语口音提供实时多语言语音合成。本指南将带你完整搭建 MeloTTS,把它与 Coqui TTS、ChatTTS 和 Bark 进行基准对比,并提供生产可用的部署配置。
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 使用一种源自 VITS2 的非自回归端到端神经网络架构,并结合基于 BERT 的文本编码。整个流程分为四个阶段:
文本处理:对于大多数语言,通过
espeak-ng进行 G2P(字素转音素)转换;对于中文和日语,使用 BERT 分词器(通过unidic)。中英混合文本会被分段,并分别路由到相应的音素提取器。BERT 编码器:一个轻量级的 MiniLM 编码器从输入文本中提取上下文表示,捕捉韵律和语义上的细微差别。
基于流的声学模型:深度可分离卷积把 BERT 特征转换为梅尔频谱图。这是整个流程中计算量最大的部分,通过优化过的卷积核可以在 CPU 上高效运行。
HiFi-GAN 声码器:使用预训练的声码器,把梅尔频谱图转换成采样率为 22kHz 的原始音频。


整个流程是非自回归的,这意味着模型是并行处理全文的,而不是逐个 token 生成音频。正是这一架构选择使得推理速度能够快于实时。
安装与配置 #
前置条件 #
在安装 MeloTTS 之前,请确保你已具备以下条件:
# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y espeak-ng libsndfile1 ffmpeg
# macOS
brew install espeak libsndfile ffmpeg
# Verify espeak-ng
espeak-ng --version
方式一:pip 安装(Linux/macOS) #
# Create a virtual environment
python -m venv melotts-env
source melotts-env/bin/activate
# Install MeloTTS
pip install melotts
# Download Japanese dictionary (required for JA support)
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。
验证安装 #
from melo.api import TTS
# Speed is adjustable
speed = 1.0
device = 'auto' # auto-detects GPU, falls back to 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 usage (after pip install)
melo "Hello, this is MeloTTS speaking." output.wav -l EN --speaker EN-US
# List available speakers
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
# American accent
model.tts_to_file(text, speaker_ids['EN-US'], 'en-us.wav', speed=speed)
# British accent
model.tts_to_file(text, speaker_ids['EN-BR'], 'en-br.wav', speed=speed)
# Indian accent
model.tts_to_file(text, speaker_ids['EN_INDIA'], 'en-india.wav', speed=speed)
# Australian accent
model.tts_to_file(text, speaker_ids['EN-AU'], 'en-au.wav', speed=speed)
中英混合文本 #
from melo.api import TTS
speed = 1.0
device = 'cpu'
# Chinese speaker handles English words seamlessly
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()
# Pre-load models for supported languages
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"Language {req.language} not supported")
model = models[req.language]
speaker_ids = model.hps.data.spk2id
if req.speaker not in speaker_ids:
raise HTTPException(status_code=400, detail=f"Speaker {req.speaker} not found")
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
from melo.utils import get_streaming_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)
# Stream audio chunks
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="Text", value="Hello from MeloTTS!"),
gr.Dropdown(choices=speaker_names, label="Speaker", value="EN-Default"),
gr.Slider(0.5, 2.0, value=1.0, label="Speed")
],
outputs=gr.Audio(label="Generated Audio"),
title="MeloTTS Web UI",
description="Real-time multi-lingual text-to-speech"
)
iface.launch(server_name='0.0.0.0', server_port=7860)
基准测试 / 真实使用场景 #
推理速度基准测试 #
实时因子(RTF)衡量的是模型生成音频的速度相对于播放时长的比例。RTF < 1.0 意味着生成速度快于实时播放。
| 硬件 | RTF | 延迟(15 个单词) | 备注 |
|---|---|---|---|
| Intel i7-12700(第 12 代) | 0.41 | 约 85 毫秒 | 比实时快 2 倍 |
| Apple M1(8 核) | 0.48 | 约 95 毫秒 | 无需 GPU |
| AMD Ryzen 7 4800U | 0.55 | 约 110 毫秒 | 笔记本 CPU |
| NVIDIA RTX 3090 | 0.08 | 约 15 毫秒 | 批处理场景 |
| Raspberry Pi 4(4GB) | 1.9 | 约 380 毫秒 | 慢于实时 |
与其他方案的对比 #
| 特性 | MeloTTS | Coqui TTS (XTTS) | ChatTTS | Bark |
|---|---|---|---|---|
| GitHub Star 数 | 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(+ 英语口音变体) | 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 的选项 |
| 声音克隆应用 | Coqui XTTS | 专门的声音克隆流程 |
| 中文对话式 AI | ChatTTS | 针对对话韵律进行了优化 |
| 创意音频(音乐、音效) | 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 内存)或小型 VPS 实例。对于运行多个 TTS 实例的 SaaS 服务商来说,这种低占用直接转化为更低的运营成本。
在相同硬件(Intel i7-12700,32GB 内存)上进行的正面对比测试中:
- MeloTTS:0.41 RTF —— 生成 10 秒音频只需 4.1 秒
- Coqui TTS (XTTS-v2):在 GPU 上为 0.55 RTF,在 CPU 上为 2.8+ —— 没有 GPU 基本不可用
- ChatTTS:在 CPU 上为 1.2 RTF —— 只有配合 GPU 才勉强可用
- Bark:在 CPU 上为 3.5+ RTF,在 GPU(A100)上为 0.3 —— 需要高端 GPU
进阶用法 / 生产环境强化 #
模型预热 #
在生产环境中,务必在启动时就加载模型,以避免冷启动延迟:
from melo.api import TTS
import functools
@functools.lru_cache(maxsize=6)
def get_model(language):
"""Cached model loader — models are loaded once and reused."""
return TTS(language=language, device='auto')
# Pre-warm all languages at startup
for lang in ['EN', 'ZH', 'ES', 'FR', 'JA', 'KO']:
get_model(lang)
print("All models loaded and ready.")
面向吞吐量的批处理 #
from melo.api import TTS
import concurrent.futures
model = TTS(language='EN', device='cuda:0')
speaker_ids = model.hps.data.spk2id
texts = [
"First sentence to synthesize.",
"Second sentence to synthesize.",
"Third sentence to synthesize.",
]
def synth(text):
output_path = f"batch_{hash(text)}.wav"
model.tts_to_file(text, speaker_ids['EN-Default'], output_path)
return output_path
# Parallel batch processing
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(synth, texts))
Gunicorn + FastAPI 生产环境服务器 #
# Install gunicorn with uvicorn workers
pip install gunicorn uvicorn
# Run with 4 workers
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
# Metrics
tts_requests = Counter('melotts_requests_total', 'Total TTS requests', ['language', 'speaker'])
tts_duration = Histogram('melotts_duration_seconds', 'TTS generation duration')
@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():
# ... existing TTS logic ...
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;
# Rate limiting
limit_req zone=tts_zone burst=20 nodelay;
}
}
与其他方案的对比 #
详细功能矩阵 #
| 能力 | MeloTTS | Coqui TTS | ChatTTS | Bark |
|---|---|---|---|---|
| 架构 | VITS2 + BERT | VITS / XTTS | 基于 GPT | GPT 风格 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,其文档相当有限。想要自定义训练流程,可能需要直接阅读源代码。
不支持 SSML:不支持用于控制停顿、重音和音素级细节的语音合成标记语言(SSML)。
每种语言的说话人数量有限:每种语言只有一个说话人(英语另有多种口音变体)。相比之下,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 个字符)在低内存系统上可能会导致内存不足错误。对于长篇内容,建议把文本拆分成句子后分批合成。
Q5:如何修复 espeak-ng not found 报错? #
在安装 MeloTTS 之前,先通过系统包管理器安装 espeak-ng。在 Ubuntu 上:sudo apt-get install espeak-ng。在 macOS 上:brew install espeak。在 Windows 上,从 espeak-ng 的 GitHub 发布页下载安装程序,并将其添加到 PATH 中。
Q6:可以用自己的声音微调 MeloTTS 吗? #
可以,但有一些注意事项。训练流程是存在的(docs/training.md),但文档比较有限。你需要大约 30 分钟干净的录音素材以及对应的文字稿。微调需要 GPU(8GB 以上显存的 NVIDIA 显卡),并且需要花费数小时。
Q7:MeloTTS 与 ElevenLabs 等商业 TTS 相比如何? #
对于所支持的语言,MeloTTS 在可懂度上与商业服务不相上下,在自然度上也接近商业水平。商业服务领先的地方在于声音种类(数千种声音)和克隆质量。而 MeloTTS 在延迟、成本(免费)、隐私(完全本地运行)和可部署性上更胜一筹。
结论 #
在开源 TTS 领域,MeloTTS 占据着一个独特的位置:它是唯一一个把多语言支持、MIT 许可证和 CPU 实时推理结合在一个不到 300MB 的软件包中的库。对于那些在没有 GPU 基础设施的情况下需要可靠语音合成能力的 SaaS 产品、聊天机器人或内容处理流程团队来说,MeloTTS 是务实的选择。
行动建议:
- 运行
pip install melotts,今天就合成你的第一段音频 - 把 FastAPI 示例部署在 Nginx 后面,搭建一个生产可用的 TTS 接口
- 加入 MeloTTS GitHub Discussions 获取社区支持
- 关注 dibi8 Telegram 群组,获取每周 AI 工具更新
推荐主机与基础设施 #
在把上述任何工具部署到生产环境之前,你需要可靠的基础设施。以下是 dibi8 实际在用并推荐的两个选项:
- DigitalOcean — 60 天内可获得 200 美元免费额度,覆盖 14 个以上全球节点。是独立开发者运行开源 AI 工具的默认选择。
- HTStack — 香港 VPS,从中国大陆访问延迟低。这正是承载 dibi8.com 的同一家 IDC——经过生产环境的实战检验。
联盟链接——不会给你带来额外费用,但能帮助 dibi8.com 持续运营。
来源与延伸阅读 #
- MeloTTS GitHub 仓库
- MeloTTS 安装指南
- MeloTTS 训练指南
- MeloTTS Hugging Face Space
- Coqui TTS 文档
- ChatTTS GitHub 仓库
- Bark(Suno)GitHub 仓库
- VITS2 论文
- Bert-VITS2 论文
- MeloTTS 中文社区指南
- Clore.ai 上的 TTS 引擎对比
- Open-LLM-VTuber TTS 基准测试
- MeloTTS 性能深度剖析
💬 留言讨论