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 的文本编码。整个流程分为四个阶段:

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

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

  3. 基于流的声学模型:深度可分离卷积把 BERT 特征转换为梅尔频谱图。这是整个流程中计算量最大的部分,通过优化过的卷积核可以在 CPU 上高效运行。

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

MeloTTS Logo

Hugging Face 上的 MeloTTS Web UI

整个流程是非自回归的,这意味着模型是并行处理全文的,而不是逐个 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 4800U0.55约 110 毫秒笔记本 CPU
NVIDIA RTX 30900.08约 15 毫秒批处理场景
Raspberry Pi 4(4GB)1.9约 380 毫秒慢于实时

与其他方案的对比 #

特性MeloTTSCoqui TTS (XTTS)ChatTTSBark
GitHub Star 数7,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(+ 英语口音变体)172(中文、英语)13+
声音克隆不支持支持(6 秒样本)有限支持支持
混合语言支持(中英混合)不支持支持部分支持
所需显存0(CPU)4-6 GB4-8 GB8-12 GB
最长时长无限制无限制约 30 秒约 14 秒
情感控制仅速度支持支持支持
搭建耗时< 5 分钟15-30 分钟15-20 分钟20-30 分钟
商业用途允许部分允许允许允许

使用场景推荐 #

使用场景最佳选择原因
纯 CPU 边缘部署MeloTTS唯一在 CPU 上 RTF < 0.5 的选项
声音克隆应用Coqui XTTS专门的声音克隆流程
中文对话式 AIChatTTS针对对话韵律进行了优化
创意音频(音乐、音效)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 内存)或小型 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;
    }
}

与其他方案的对比 #

详细功能矩阵 #

能力MeloTTSCoqui TTSChatTTSBark
架构VITS2 + BERTVITS / XTTS基于 GPTGPT 风格 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,其文档相当有限。想要自定义训练流程,可能需要直接阅读源代码。

  6. 不支持 SSML:不支持用于控制停顿、重音和音素级细节的语音合成标记语言(SSML)。

  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 个字符)在低内存系统上可能会导致内存不足错误。对于长篇内容,建议把文本拆分成句子后分批合成。

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 是务实的选择。

行动建议:

  1. 运行 pip install melotts,今天就合成你的第一段音频
  2. 把 FastAPI 示例部署在 Nginx 后面,搭建一个生产可用的 TTS 接口
  3. 加入 MeloTTS GitHub Discussions 获取社区支持
  4. 关注 dibi8 Telegram 群组,获取每周 AI 工具更新

推荐主机与基础设施 #

在把上述任何工具部署到生产环境之前,你需要可靠的基础设施。以下是 dibi8 实际在用并推荐的两个选项:

  • DigitalOcean — 60 天内可获得 200 美元免费额度,覆盖 14 个以上全球节点。是独立开发者运行开源 AI 工具的默认选择。
  • HTStack — 香港 VPS,从中国大陆访问延迟低。这正是承载 dibi8.com 的同一家 IDC——经过生产环境的实战检验。

联盟链接——不会给你带来额外费用,但能帮助 dibi8.com 持续运营。

来源与延伸阅读 #

参考与来源 #

📦 出现在以下合集中

💬 留言讨论