dots.tts:小红书用 2B 参数告诉你,语音合成不需要离散 token

dots.tts:小红书用 2B 参数告诉你,语音合成不需要离散 token

Seven

2026 年 6 月 5 日,小红书 AI 团队(rednote-hilab)在 GitHub 上悄然放出了一个名为 dots.tts 的项目。四天后,它拿到了 346 颗星、21 个 fork,HuggingFace 上有了在线 Demo,社区已经有人把它移植到了 Apple Silicon 的 MLX 框架和 ComfyUI 上。这个项目只有 2B 参数,但在 Seed-TTS-Eval 基准上拿下了开源模型的最佳平均成绩——中文 WER 0.94%、英文 WER 1.30%,说话人相似度 81.0。更关键的是,它在整个管线里没有使用一个离散 token。

dots.tts logo

一、离散 vs 连续:TTS 的两条技术路线

语音合成(Text-to-Speech,TTS)领域在过去两年经历了剧烈的技术路线分化。

传统做法是把语音信号量化成离散 token,再用语言模型逐个预测。这条路线的代表有 CosyVoice、Seed-TTS、VoxCPM 等。它的优势是复用了 LLM 的自回归范式,训练稳定、工程成熟。但离散化本身就是一种信息压缩——把连续的声学信号硬切成有限个码本条目,必然会丢失细节,尤其在韵律、情感和说话人音色的还原上存在天花板。

dots.tts 选了另一条路:全连续。它用 AudioVAE 把 48kHz 的原始波形编码成连续的潜在表示,然后用自回归流匹配(AR flow-matching)直接在连续空间里逐 patch 预测。没有 VQ(向量量化)、没有码本、没有离散 token——整个管线从文本到波形都是连续的。

这不是一个简单的“用连续替代离散”的故事。dots.tts 的架构设计把语义编码器、LLM 骨干和流匹配声学头三者串在一起,每个组件各司其职,形成了一条完整的全连续流水线。

二、架构:三个组件各司其职

dots.tts 架构概览

dots.tts 的架构由三个核心组件组成:

2.1 AudioVAE:48kHz 的连续编码器

AudioVAE 是整个管线的入口和出口。它把 48kHz 的单声道波形编码成连续的潜在表示(latent),推理结束后再用 BigVGAN 风格的因果解码器把 latent 解码回波形。这个 VAE 是冻结的,不参与训练,保证了声学表示的稳定性。

48kHz 的采样率意味着 dots.tts 可以生成接近 CD 音质的语音,这在开源 TTS 模型中并不常见——很多模型为了降低计算量会选择 16kHz 或 24kHz。

2.2 语义编码器 + Qwen2.5-1.5B 骨干

文本侧的处理直接复用了 Qwen2.5-1.5B-Base 作为 LLM 骨干。文本以 BPE token 的形式输入,不需要经过音素转换(phoneme conversion),这意味着它天然支持多语言,不受限于特定语言的音素集。

语义编码器的作用是把每个新生成的 VAE patch 重新编码成紧凑的嵌入,送给 LLM 作为下一步预测的上下文。它会剥离高方差的声学细节,只保留语义级别的信息,让 LLM 专注于“下一段语音该说什么”而不是“下一个采样点是什么”。

2.3 AR 流匹配头:连续空间的逐 patch 去噪

这是 dots.tts 最核心的创新。声学头是一个 DiT(Diffusion Transformer),它根据 LLM 的隐藏状态和已生成的 AR 前缀来去噪下一个 VAE patch。同时,它还接收一个冻结的 CAM++ 说话人 x-vector 作为侧输入,用于保持音色一致性。

这个设计的关键在于:流匹配(flow-matching)直接在连续空间里操作,不需要先量化成离散 token 再生成。每个 patch 的生成都是一次连续的去噪过程,保留了比离散化更丰富的声学细节。

2.4 两种序列布局

dots.tts 支持两种推理模式:

  • 普通模式(plain mode):把完整文本作为前缀放在音频 span 之前,标准的 TTS 流程
  • 1T1A 交错模式:一个 BPE token 和一个 audio step 交替排列,支持低延迟流式输出,适合与对话 LLM 配合使用

交错模式意味着 dots.tts 可以在 LLM 输出文本的同时就开始生成语音,延迟可以压到非常低。这对实时对话场景非常有价值。

三、训练:三阶段管线

dots.tts 的训练分三个阶段:

  1. 预训练(Pretrain):在大规模语音数据上训练基础模型
  2. 自纠正对齐(Self-Corrective Alignment, SCA):用自监督方式修正生成错误,提升音质和对齐度
  3. MeanFlow 蒸馏(MF):把多步流匹配蒸馏成 4 步推理,实现 7.5 倍加速

三个阶段产出的 checkpoint 都已开源。SCA 版本在各项基准上表现最好,MF 版本在保持接近 SCA 性能的同时把推理步数从 10 步压缩到 4 步,速度提升显著。

四、性能:开源 SOTA 的成绩单

dots.tts 在多个基准上都展示了强劲的表现。

4.1 Seed-TTS-Eval

这是目前 TTS 领域最权威的零样本基准之一,测试模型在没有微调的情况下模仿任意说话人的能力。

模型 参数 中文 WER↓ / SIM↑ 英文 WER↓ / SIM↑ 平均 WER↓ / SIM↑
Seed-TTS(闭源) 1.12 / 79.6 2.25 / 76.2 3.65 / 77.8
Qwen3-TTS 1.7B 1.22 / 77.0 1.23 / 71.7 3.07 / 74.5
CosyVoice 3 1.5B 1.12 / 78.1 2.22 / 72.0 3.06 / 75.3
dots.tts (SCA) 2B 0.94 / 81.0 1.30 / 77.1 2.95 / 79.2

dots.tts 在中文 WER(0.94%)和中文 SIM(81.0)上都拿到了最佳成绩,平均 WER 2.95% 也是全场最低。在说话人相似度上,dots.tts 的 79.2 平均分大幅领先第二名 Seed-TTS 的 77.8。

Seed-TTS-Eval 基准对比

4.2 MiniMax 多语言基准(24 语种)

这个基准测试模型在 24 种语言上的表现。dots.tts 的 SCA 版本在 24 语种上拿到了最高的平均说话人相似度 83.9,在 19 种语言上单独领先,另外 2 种打平。

这个结果说明全连续架构在多语言场景下的优势——不需要针对每种语言设计离散码本,连续表示天然适应不同语言的声学特征。

4.3 EmergentTTS-Eval

这是一个更贴近实际使用的基准,由 Gemini-2.5-Pro 作为裁判,评估语音的情感表达、韵律复杂度等维度。

dots.tts 的 SCA 版本在语法复杂度(Syntactic Complexity)上拿到了 65.7% 的胜率,超过了所有闭源系统(包括 GPT-4o 和 Gemini)。Pretrain 版本在情感表达(Emotions)上拿到了开源系统中最高的 72.7%

EmergentTTS-Eval 基准对比

五、实际使用

5.1 安装

dots.tts 的安装比较标准,推荐用 conda 创建独立环境:

1
2
3
4
conda create -n dots_tts python=3.10 -y
conda activate dots_tts
python -m pip install --upgrade pip
python -m pip install -e . -c constraints/recommended.txt

模型权重需要从 HuggingFace 下载,SCA 版本约 4GB 左右。首次运行时会自动下载 CAM++ 说话人编码器。

5.2 命令行用法

最简单的用法是给一段参考音频和目标文本:

1
2
3
4
5
6
dots.tts \
--model-name-or-path /path/to/dots_tts_model \
--text "你好,这是一段语音合成测试。" \
--prompt-audio /path/to/reference.wav \
--prompt-text "参考音频的原始文本" \
--output output.wav

--prompt-audio 提供参考音频的音色,--prompt-text 提供参考音频对应的文本。两者配合使用时是“续写式克隆”(continuation cloning),效果最好。

如果只提供 --prompt-audio 不提供 --prompt-text,会走 x-vector 模式,只从参考音频中提取音色信息。精度略低但更方便。

5.3 Python API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from dots_tts.runtime import DotsTtsRuntime
import soundfile as sf

runtime = DotsTtsRuntime.from_pretrained(
"/path/to/dots_tts_model",
precision="bfloat16",
optimize=True, # torch.compile 加速
)

result = runtime.generate(
text="你好,这是一段语音合成测试。",
prompt_audio_path="/path/to/reference.wav",
prompt_text="参考音频的原始文本",
num_steps=10,
guidance_scale=1.0,
)

sf.write("output.wav", result["audio"].float().cpu().squeeze().numpy(), result["sample_rate"])

optimize=True 会在首次加载时做 warmup(较慢),之后的推理会更快。

5.4 HuggingFace 在线体验

如果不想本地部署,可以直接在 HuggingFace Space 上体验:

HuggingFace 在线 Demo

上传参考音频、输入文本、点击 Generate 即可。支持中文、英文、日文、韩文、粤语等多种语言。

5.5 社区生态

dots.tts 开源仅四天,社区已经出现了多个第三方项目:

  • dots-tts-mlx:Apple Silicon 纯 MLX 推理端口,不需要 Python 运行时
  • mlx-swift-dots-tts:Swift 原生端口,直接在 iOS/macOS 上跑
  • Dots-TTS-ComfyUI:ComfyUI 自定义节点,支持 TTS、语音克隆和 Whisper 转录

ComfyUI 的集成意味着 dots.tts 可以和 Stable Diffusion、视频生成等工作流无缝对接。对内容创作者来说,“生成画面 + 配音”可以一站式完成。

六、局限性

dots.tts 不是完美的,有几个值得注意的限制:

低资源语言的 WER 差距。虽然 24 语种的平均 SIM 很高,但在阿拉伯语、印地语、土耳其语、越南语等低资源语言上,WER 明显高于高资源语言。这是 BPE 骨干的固有代价——LLM 的语言覆盖越广,对低资源语言的文本处理就越粗糙。

训练数据偏向语音。虽然 AudioVAE 本身是模态无关的,但 dots.tts 的骨干是在语音为主的混合数据上训练的。唱歌、语音+音效混合生成等场景不在当前版本的覆盖范围内。

微调入口有限。目前只开源了微调脚本,完整的训练管线(预训练、SCA、MeanFlow 蒸馏)还没有释放。想从头训练自己的版本需要等后续更新。

48kHz 的计算开销。48kHz 的采样率意味着更高的计算量。在没有 GPU 的机器上,生成一段 10 秒的语音可能需要几十秒甚至更长。MF 蒸馏版本把推理步数压缩到了 4 步,但仍然需要 GPU 支持。

七、为什么值得关注

dots.tts 的意义不只是“又一个 TTS 模型”。它证明了三件事:

全连续路线是可行的。过去两年,离散 token 路线在 TTS 领域占据了主流,因为它的训练范式更成熟、工程更简单。dots.tts 用实际的 benchmark 成绩证明,全连续路线不仅可行,而且在音质和说话人相似度上可以超越离散路线。

2B 参数足够了。dots.tts 只有 2B 参数,但在 Seed-TTS-Eval 上超过了 1.5B 的 CosyVoice 3 和闭源的 Seed-TTS。这说明模型架构的设计比堆参数更重要。

小红书的 AI 实力被低估了。rednote-hilab 这个团队之前不太被外界关注,但 dots.tts 的技术完成度和开源诚意(Apache-2.0、完整 checkpoint、微调脚本、在线 Demo)都说明这不是一个“交作业”式的开源,而是真正想让社区用起来的项目。

相关链接

  • 标题: dots.tts:小红书用 2B 参数告诉你,语音合成不需要离散 token
  • 作者: Seven
  • 创建于 : 2026-06-09 18:00:00
  • 更新于 : 2026-07-14 00:18:15
  • 链接: https://blog.oneiseven.top/2026/06/09/dots-tts-小红书开源2B参数全连续语音合成/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论