LongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前技术水平(SOTA),可直接在波形潜空间中运行。
摘要:我们提出了 LongCat-TTS,这是一种新型的、非自回归的基于扩散模型的文本转语音(TTS)模型,其性能达到了当前技术水平(SOTA)。 与以往依赖梅尔频谱图等中间声学表示的方法不同,LongCat-TTS 的核心创新在于直接在波形潜空间内进行操作。这种方法有效减轻了复合误差,并大幅简化了 TTS pipeline,仅需一个波形变分自编码器(Wav-VAE)和一个扩散主干网络即可。 此外,我们对推理过程引入了两项关键改进:首先,我们识别并纠正了一个长期存在的训练-推理不匹配问题;其次,我们用自适应投影引导取代了传统的无分类器引导,以提升生成质量。 实验结果表明,尽管没有复杂的多阶段训练 pipeline 或高质量的人工标注数据集,LongCat-TTS 在 Seed 基准测试上实现了 SOTA 的零样本语音克隆性能,同时保持了具有竞争力的可懂度。 具体而言,我们最大的模型变体 LongCat-TTS-3.5B 优于之前的 SOTA 模型(Seed-TTS),在 Seed-ZH 上的说话人相似度(SIM)分数从 0.809 提升至 0.818,在 Seed-Hard 上从 0.776 提升至 0.797。 最后,通过全面的消融实验和系统分析,我们验证了所提出模块的有效性。 值得注意的是,我们研究了 Wav-VAE 与 TTS 主干网络之间的相互作用,揭示了一个反直觉的发现:Wav-VAE 中更高的重建保真度并不一定能带来更好的整体 TTS 性能。 代码和模型权重已发布,以促进语音社区的进一步研究。
本仓库提供了与 HuggingFace 兼容的实现,包括模型定义、权重转换和推理脚本。
LongCat-AudioDiT 在 Seed 基准测试中实现了语音克隆性能的当前最佳水平(SOTA),超越了闭源和开源模型。
| 模型 | 中文 CER (%) ↓ | 中文 SIM ↑ | 英文 WER (%) ↓ | 英文 SIM ↑ | 中文-难 CER (%) ↓ | 中文-难 SIM ↑ |
|---|---|---|---|---|---|---|
| GT | 1.26 | 0.755 | 2.14 | 0.734 | - | - |
| Seed-DiT | 1.18 | 0.809 | 1.73 | 0.790 | - | - |
| MaskGCT | 2.27 | 0.774 | 2.62 | 0.714 | 10.27 | 0.748 |
| E2 TTS | 1.97 | 0.730 | 2.19 | 0.710 | - | - |
| F5 TTS | 1.56 | 0.741 | 1.83 | 0.647 | 8.67 | 0.713 |
| F5R-TTS | 1.37 | 0.754 | - | - | 8.79 | 0.718 |
| ZipVoice | 1.40 | 0.751 | 1.64 | 0.668 | - | - |
| Seed-ICL | 1.12 | 0.796 | 2.25 | 0.762 | 7.59 | 0.776 |
| SparkTTS | 1.20 | 0.672 | 1.98 | 0.584 | - | - |
| FireRedTTS | 1.51 | 0.635 | 3.82 | 0.460 | 17.45 | 0.621 |
| Qwen2.5-Omni | 1.70 | 0.752 | 2.72 | 0.632 | 7.97 | 0.747 |
| Qwen2.5-Omni_RL | 1.42 | 0.754 | 2.33 | 0.641 | 6.54 | 0.752 |
| CosyVoice | 3.63 | 0.723 | 4.29 | 0.609 | 11.75 | 0.709 |
| CosyVoice2 | 1.45 | 0.748 | 2.57 | 0.652 | 6.83 | 0.724 |
| FireRedTTS-1S | 1.05 | 0.750 | 2.17 | 0.660 | 7.63 | 0.748 |
| CosyVoice3-1.5B | 1.12 | 0.781 | 2.21 | 0.720 | 5.83 | 0.758 |
| IndexTTS2 | 1.03 | 0.765 | 2.23 | 0.706 | 7.12 | 0.755 |
| DiTAR | 1.02 | 0.753 | 1.69 | 0.735 | - | - |
| MiniMax-Speech | 0.99 | 0.799 | 1.90 | 0.738 | - | - |
| VoxCPM | 0.93 | 0.772 | 1.85 | 0.729 | 8.87 | 0.730 |
| MOSS-TTS | 1.20 | 0.788 | 1.85 | 0.734 | - | - |
| Qwen3-TTS | 1.22 | 0.770 | 1.23 | 0.717 | 6.76 | 0.748 |
| CosyVoice3.5 | 0.87 | 0.797 | 1.57 | 0.738 | 5.71 | 0.786 |
| LongCat-AudioDiT-1B | 1.18 | 0.812 | 1.78 | 0.762 | 6.33 | 0.787 |
| LongCat-AudioDiT-3.5B | 1.09 | 0.818 | 1.50 | 0.786 | 6.04 | 0.797 |
pip install -r requirements.txt# TTS
python inference.py --text "今天晴暖转阴雨,空气质量优至良,空气相对湿度较低。" --output_audio output.wav --model_dir meituan-longcat/LongCat-AudioDiT-1B
# Voice cloning
python inference.py \
--text "今天晴暖转阴雨,空气质量优至良,空气相对湿度较低。" \
--prompt_text "小偷却一点也不气馁,继续在抽屉里翻找。" \
--prompt_audio assets/prompt.wav \
--output_audio output.wav \
--model_dir meituan-longcat/LongCat-AudioDiT-1B \
--guidance_method apg
# Batch inference (SeedTTS eval format, one item per line: uid|prompt_text|prompt_wav_path|gen_text)
python batch_inference.py \
--lst /path/to/meta.lst \
--output_dir /path/to/output \
--model_dir meituan-longcat/LongCat-AudioDiT-1B \
--guidance_method apgimport audiodit # auto-registers with transformers
from audiodit import AudioDiTModel
from transformers import AutoTokenizer
import torch, soundfile as sf
# Load model
model = AudioDiTModel.from_pretrained("meituan-longcat/LongCat-AudioDiT-1B").to("cuda")
model.vae.to_half() # VAE runs in fp16 (matching original)
model.eval()
tokenizer = AutoTokenizer.from_pretrained(model.config.text_encoder_model)
# Zero-shot synthesis
inputs = tokenizer(["今天晴暖转阴雨,空气质量优至良,空气相对湿度较低。"], padding="longest", return_tensors="pt")
output = model(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
duration=62, # latent frames
steps=16,
cfg_strength=4.0,
guidance_method="cfg", # or "apg"
seed=1024,
)
sf.write("output.wav", output.waveform.squeeze().cpu().numpy(), 24000)import librosa, torch
# Load prompt audio
audio, _ = librosa.load("assets/prompt.wav", sr=24000, mono=True)
prompt_wav = torch.from_numpy(audio).unsqueeze(0).unsqueeze(0) # (1, 1, T)
# Concatenate prompt_text + gen_text for the text encoder
prompt_text = "小偷却一点也不气馁,继续在抽屉里翻找。"
gen_text = "今天晴暖转阴雨,空气质量优至良,空气相对湿度较低。"
inputs = tokenizer([f"{prompt_text} {gen_text}"], padding="longest", return_tensors="pt")
output = model(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
prompt_audio=prompt_wav,
duration=138, # prompt_frames + gen_frames
steps=16,
cfg_strength=4.0,
guidance_method="apg",
seed=1024,
)本仓库(包括模型权重和源代码)均在MIT许可协议下发布。
除非另有说明,对本仓库的任何贡献均遵循MIT许可协议。本许可协议不授予使用美团商标或专利的任何权利。
详情请参见LICENSE文件。