【免费下载链接】dots.tts-mf
dots.tts-mf 是一个约 20 亿参数、完全连续的开源文本转语音(TTS)系统:AudioVAE 将 48kHz 波形编码为连续隐空间表征,Qwen2.5 系 LLM 逐音频 patch 自回归预测,Flow Matching 声学头再把隐变量还原成 48kHz 波形——整条链路没有使用任何离散 codec token。对于关注 TTS 架构演进、零样本语音克隆与少步数低延迟推理的读者,本文带你完整拆解它"告别离散 codec"的设计思路。
一、为什么"离散 Codec"成了 TTS 的瓶颈 🧩
主流大模型 TTS 常走"LM 预测离散音频 token + vocoder 解码"的两阶段路线,痛点集中且互相纠缠:
| 痛点 | 离散 Codec 路线 | dots.tts-mf 连续路线 |
|---|---|---|
| 量化瓶颈 | 音频被压成有限码本 token,高频细节丢失 | 直接生成 128 维连续隐变量,无量化 |
| 误差累积 | 一个 token 选错无法回头,误差被后续步放大 | 连续值可被去噪过程逐步修正 |
| 训练割裂 | LM 与 vocoder 各自优化,目标不一致 | 端到端:VAE→LLM→声学头同一系统联合训练 |
| 推理开销 | 每步预测一个 token | 每步一次(或少量几次)隐变量去噪 |
dots.tts-mf 的思路很直接:不再让 LLM 猜"下一个 token 是哪个",而是让 LLM 给出隐变量方向的提示,由一个可微的 Flow Matching 声学头把下一段音频"去噪"出来。
二、架构总览:一个音频 patch 的旅程 🎧
整条管线可以概括为四段:
BPE 文本 → LLM 主干 → DiT Flow Matching 声学头 → AudioVAE 解码器 → 48kHz 波形
几个关键数字来自顶层配置 config.json:
latent_dim: 128—— AudioVAE 隐变量为 128 维连续向量;patch_size: 4—— 自回归以"patch"为单位,每个 patch 含 4 帧隐变量;- 按 vocoder 上采样率 10×6×4×2×2×2=1920 计算,隐帧率为 48000/1920=25 Hz,因此每个 patch ≈ 160 ms 语音,自回归主干每秒约做 6.25 步。
这种"patch 级"粒度是刻意设计的:步数足够少,LLM 长序列负担轻;每步信息量又足够多,声学细节不缺失。
三、AudioVAE:48kHz 连续隐空间的地基
AudioVAE 是整套系统的"地基",且在整个推理过程中保持冻结:
- 编码器把 48kHz 单声道波形压进连续隐空间(128 维);
- 解码器是 BigVGAN 风格的因果解码器(
causal: true),采用 SnakeBeta 激活,可流式地把隐变量解码回波形,配置见 config.json 的vocoder段; - 权重文件为 vocoder.safetensors,配套的 latent_stats.pt 存放隐变量归一化统计量,保证 VAE 输入/输出尺度稳定。
因果解码器意味着可以边生成边解码——这是低延迟流式合成的前提。
四、语义编码器(PatchEncoder):给 LLM 一份"降噪"后的输入
直接把 128 维原始 VAE 隐变量喂给 LLM 并不理想:它携带大量高方差的声学纹理细节,LLM 会分心于"波形长相"而非"该说什么、怎么说"。
因此 dots.tts-mf 插入了一层语义编码器(config.json 的 PatchEncoder 段):
- 24 层因果 Transformer,hidden_size 1024,带 RoPE 位置编码;
- 输入是刚生成的 VAE patch,输出一个紧凑语义嵌入供 LLM 消费,相当于"剥掉声学细节、保留韵律与语义"。
这构成了一个闭环:声学头生成 patch → 语义编码器重编码 → LLM 基于语义嵌入决定下一步。LLM 始终工作在"语义空间",声学渲染的细节全部交给声学头。
五、LLM 主干:Qwen2.5-1.5B 直接吃 BPE 文本 🤖
LLM 主干初始化自 Qwen2.5-1.5B-Base,参数详见 llm_config.json:
- 28 层、hidden 1536、GQA(12 个注意力头、2 个 KV 头)、128K 上下文长度;
- 直接消费 BPE 文本,不经过音素转换——它继承了文本 LLM 的语言与常识能力,这也让多语言 TTS 少了一整层脆弱的 G2P 依赖;
- 每个音频步只输出一个 hidden state,作为下一步去噪的条件。
为了在文本序列里"安放"音频,词表新增了一组特殊 token(见 special_tokens_map.json 与 added_tokens.json):
| 特殊 token | 用途 |
|---|---|
<\|audio_comp_start\|> / <\|audio_comp_span\|> / <\|audio_comp_end\|> | 包裹参考音频(压缩)段 |
<\|audio_gen_start\|> / <\|audio_gen_span\|> / <\|audio_gen_end\|> | 标记待生成语音段 |
<\|text_cond_end\|> | 文本条件结束 |
对话格式沿用 Qwen 风格模板,见 chat_template.jinja;分词器配置见 tokenizer_config.json(Qwen2Tokenizer,词表 151672)。
六、Flow Matching 声学头:DiT 逐 patch 去噪 ⚡
声学头是一个 DiT(Diffusion Transformer),负责"以 LLM 提示为条件,从噪声去噪出下一个 VAE patch"(config.json):
- 18 层、hidden 1024,
modulation: true(adaLN 时间步调制); - 条件输入三路:LLM hidden state(内容/韵律提示)+ AR prefix(已生成的前缀,保证段落间连贯)+ 冻结的 CAM++ 说话人 x-vector(512 维,见 config.json,权重见 speaker_encoder.safetensors);
- 训练时
cfg_droprate: 0.2与xvec_drop_rate: 0.2,分别支持 classifier-free guidance 与说话人条件的 dropout 学习。
说话人 x-vector 上限 10 秒参考音频(xvec_max_audio_seconds: 10.0),这让"零样本音色克隆"只需一小段参考音频。
七、MeanFlow 蒸馏:从 10 步压到 2–4 步 🚀
普通 Flow Matching 推理需要多次 ODE 求解(teacher 模型 dots.tts-soar 用 10 次 NFE)。dots.tts-mf 的核心增量是 CFG-aware MeanFlow 蒸馏(config.json 中 meanflow.enabled: true):
- 声学头作为 MeanFlow student 学习 teacher 的速度场,把每 patch 的 ODE 折叠为 2–4 次 NFE;
- CFG 被直接吸收进 student——每步只需一次条件前向,不再跑无条件分支,因此推理时
--guidance-scale/guidance_scale参数不生效; - 开启
use_duration_embedding,让 student 感知剩余去噪时长。
效果是"2.5 倍以上的模型评估次数削减,质量基本不掉"——这就是它成为低延迟/少步数推理推荐 checkpoint 的原因。
八、实测表现:少步数下的 WER 与说话人相似度 📊
Seed-TTS-Eval 零样本测试(约 3 秒参考音频),摘自 README.md:
| 模型 | NFE | 平均 WER↓ / SIM↑ |
|---|---|---|
| dots.tts-soar(teacher) | 10 | 2.95 / 79.2 |
| dots.tts-mf | 4 | 2.94 / 78.2 |
| dots.tts-mf | 3 | 3.21 / 78.1 |
| dots.tts-mf | 2 | 3.43 / 77.0 |
NFE=4 时平均 WER 与 teacher 基本持平(2.94 vs 2.95),说话人相似度仅差 1 个百分点。CV3-Eval 上 harder 的英文集 WER 为 4.37,优于 teacher(4.49)与 Fish-Audio S2(4.40)。
九、快速上手:一条命令合成 48kHz 音频 🎙️
权重下载后即可用 CLI 跑通(NFE=4 为官方推荐的"质量/延迟"平衡点):
dots.tts \
--model-name-or-path dots-studio/dots.tts-mf \
--text "这是一条零样本语音克隆演示。" \
--prompt-audio /path/to/reference.wav \
--prompt-text "参考音频的准确转写文本" \
--num-steps 4 \
--output clone.wav
Python API 侧只需 DotsTtsRuntime.from_pretrained(..., precision="bfloat16") 后调用 generate(text=..., prompt_audio_path=..., prompt_text=..., num_steps=4),完整示例见 README.md。
关键文件速查:
| 文件 | 作用 |
|---|---|
| config.json | 顶层架构:latent_dim、patch_size、DiT/PatchEncoder、MeanFlow 开关 |
| llm_config.json | LLM 主干(Qwen2-1.5B)结构参数 |
| special_tokens_map.json | 参考/生成音频段的特殊 token |
| vocoder.safetensors / speaker_encoder.safetensors | AudioVAE 解码器 / CAM++ 说话人编码器权重 |
| latent_stats.pt | 隐变量归一化统计量 |
十、选型建议与已知局限 ⚠️
- 延迟预算紧:选 dots.tts-mf(NFE=4);追求极限保真/微调,回到 dots.tts-soar(NFE=10,
--guidance-scale可调); - NFE=2/3 可用但 WER/SIM 有可测退化,按延迟预算选档;
- guidance_scale 在此 checkpoint 是 no-op——CFG 已烘进 student,推理期无法调节;
- BPE 主干对阿拉伯语、印地语、土耳其语、越南语等低资源语言 WER 偏高(说话人相似度不受影响);
- 训练以语音为主,不覆盖歌声与"语音+音效"统一生成;
- 高保真零样本克隆可生成高度逼真的合成语音,请仅用于研究与授权场景,配合知情同意、AI 生成标识与合成语音检测。
一句话总结:AudioVAE 提供连续隐空间,语义编码器把 LLM 留在语义层,DiT 声学头负责声学渲染,MeanFlow 蒸馏把推理压到 2–4 步——四个组件各司其职,让"无离散 codec"的端到端 TTS 既保真又低延迟。
【免费下载链接】dots.tts-mf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



