语音助手念天气预报、有声书主播读小说、用 3 秒录音克隆自己的声音念任意文字——都是 TTS(文字转语音),但难点各不相同:助手要(话音刚落就得出声),主播要(十分钟不跑调、不跳字),克隆要(音色、语气都对上),而「用一句话描述就调出一个新音色」要的是可控

这几个目标常常互相拉扯。Qwen3-TTS(2026 年 1 月,Apache 2.0 开源)的答卷是一套组合拳:双轨 LM 的主干,配两个各有取舍的语音 tokenizer,再加指令式的音色控制。这篇拆开讲清楚它怎么工作,以及在一众 TTS 里站在哪。

这也是本站多模态系列里「语音生成」的正式展开——之前 Thinker-Talker 讲过 Omni 模型怎么「边想边说」,离散 vs 连续 讲过声音要先变成离散 token 才能被 LM 生成。这篇把 TTS 本身讲透。

一、把文字变成声音,分两步

今天主流的 TTS 都不是一步到位,而是两段:

  1. 文字 → 语音 token:一个模型读文字,吐出一串离散的「语音 token」(可以理解成声音的拼音);
  2. 语音 token → 波形:一个解码器(声码器)把这些 token 还原成能播放的声波。
📄 文字「今天天气不错」🔢 语音 token离散·声音的拼音🔊 波形能播放的声波语言模型文字 → token声码器 codectoken → 波形为什么绕一道 token?直接生成十几 kHz 波形序列太长——先压成每秒几十个离散 token,LM 才好建模
TTS 两步走:文字先变成离散语音 token,再由声码器还原成波形

为什么中间要绕一道语音 token?因为直接生成十几 kHz 的原始波形,序列太长、模型扛不住;先压成每秒几十个离散 token,LM 才好建模。这正是 离散 vs 连续 那篇的主题在语音上的落地:声音先离散化,才能被自回归模型「一个接一个」地生成。

二、TTS 的两条大路:LM 派 vs 扩散派

「文字 → 语音 token」这一步,业界分成两大流派——

  • 自回归 LM 派:把语音切成离散 token,像语言模型写字一样一个一个往外蹦。代表有 VALL-E、字节的 Seed-TTS、阿里的 CosyVoice,以及本文的 Qwen3-TTS。好处是自然、能「看几个例子就模仿」(in-context learning),坏处是(逐个吐)、偶尔不稳(长句跑偏)。
  • 扩散 / flow-matching 派:不搞离散 token,直接并行「去噪」出连续的声学特征。代表有 F5-TTS、E2-TTS、Voicebox。好处是(并行出声),坏处是容易跳字(尤其在噪声、跨语言时)。
自回归 LM 派:离散 token,逐个吐(自然、能模仿,但慢)…一个接一个代表:VALL-E · CosyVoice · Seed-TTS · Qwen3-TTS✓ 自然、能 in-context 模仿 ✕ 逐个吐 → 慢、长句偶尔跑偏扩散 / flow-matching 派:连续特征,并行去噪(快,但会跳字)随机噪声声学特征一次并行去噪(多步)整段同时出,不逐个代表:F5-TTS · E2-TTS · Voicebox✓ 并行 → 快 ✕ 噪声 / 跨语言时容易跳字、漏字这正是「离散 vs 连续」在 TTS 的翻版:LM 派走离散(能采样、能模仿),扩散派走连续(并行快)。Qwen3-TTS 选 LM 派
TTS 两条路线:LM 派走离散 token(自然、能模仿,但慢),扩散派走连续去噪(快,但会跳字)

眼熟吗?这就是 离散 vs 连续 里那条分野在 TTS 领域的翻版:LM 派走离散(能采样、能 in-context),扩散派走连续(并行快)。Qwen3-TTS 选了 LM 派——但它得正面 LM 派天生的「慢、首包延迟高」问题,第四节会看到它怎么用两个 tokenizer 破局。

三、双轨 LM:一个主干,边读字边吐声

Qwen3-TTS 的主干是一个双轨自回归 LM:文本 token 和声学 token 两条流沿「通道轴」拼在一起,喂给同一个 LM。文字一进来,模型立刻开始预测对应的声学 token——读一点、吐一点,天然流式。

文本轨(读入)双轨自回归 LM文本 token + 声学 token 沿「通道轴」拼接,同一个主干一起建模声学轨(吐出)🔊 …读一点、吐一点,天然流式。对比 Thinker-Talker 的「大脑+嘴」两个模块:纯 TTS 无需理解多模态,单主干双轨更省
双轨 LM:文本轨与声学轨沿通道轴并行,同一个自回归主干边读字边吐声学 token

这里有个和 Thinker-Talker 的精妙对比。Omni 模型里,「大脑」Thinker 和「嘴」Talker 是两个模块——因为 Omni 要先理解多模态输入(图像、视频、语音),那是 Thinker 的活,Talker 只管把想法念出来。而 Qwen3-TTS 是纯 TTS:输入就是文字,不需要那个理解多模态的大脑,于是一个主干双轨就够,更简洁。不是谁更好,是任务不同——要理解世界就得有 Thinker,只把文字念出来则单主干更省。

四、两个 tokenizer,两种取舍

这是 Qwen3-TTS 最有意思的设计:它不做一个「全能」语音 tokenizer,而是做了两个,各为一种场景。

25Hz 单码本语义为主 · Qwen2-Audio 编码器单层 token(25 帧/秒)分块 flow-matching + DiT扩散解码 · 需一点前瞻🔊 波形首包 ~150ms(1.7B)强项:自然度 · 长文本稳定场景:有声书 · 配音12Hz 多码本第 1 层语义 + 15 层声学细节16 层 RVQ(12.5 帧/秒)轻量因果 ConvNet不用扩散 · 逐帧出声🔊 波形首包 97ms(0.6B)强项:超低延迟 · 实时场景:语音助手 · 实时对话没有免费午餐:与其做一个处处妥协的全能款,不如给两个场景各配一把趁手的刀
两个 tokenizer 各有取舍:25Hz 单码本+扩散解码主打长文本自然度,12Hz 多码本+卷积解码主打低延迟实时
  • Qwen-TTS-Tokenizer-25Hz:单码本(码本大小 32768),每秒 25 帧,编码器站在 Qwen2-Audio 上、把语义和声学线索揉进同一串 token,波形重建用「分块 flow-matching + DiT」(扩散那套)。它需要一点前瞻上下文,首包约 140–150ms(0.6B / 1.7B)。强项是自然度和长文本稳定——念十分钟有声书不跑偏。
  • Qwen-TTS-Tokenizer-12Hz:多码本(16 层 RVQ),每秒 12.5 帧,第一层码本管语义(由 WavLM 蒸馏引导),其余 15 层管声学细节,解码器是一个轻量因果 ConvNet(不用扩散)。它做到 97ms 首包(0.6B 模型)、超低延迟。强项是实时——语音助手、实时对话。

一张表看清取舍:

25Hz 单码本12Hz 多码本
码本单码本16 层 RVQ
帧率25 Hz12.5 Hz
解码器分块 flow-matching + DiT轻量因果 ConvNet
首包延迟~150ms(1.7B)97ms(0.6B)
强项自然度、长文本稳定超低延迟、实时
典型场景有声书、配音语音助手、实时对话

两个细节值得停一下。12.5 Hz 正是 离散 vs 连续 里说的「语音 token 的共识心跳」——Mimi、GLM-4-Voice、Qwen3-Omni 的 AuT 都落在这附近。而 12Hz 那套「多码本第一层管语义、残差层管声学 + 轻量 ConvNet 解码」,和 Qwen3-Omni 的 Code2Wav 是同一门手艺。

为什么不只做一个「全能」tokenizer?因为没有免费午餐:低帧率、多码本、卷积解码换来了低延迟,但长文本的极致自然度还得靠 25Hz + 扩散解码。与其做一个处处妥协的,不如给两个场景各配一把趁手的刀。

五、怎么让它说出你要的声音

光会念还不够,Qwen3-TTS 在「控制音色」上给了两条路:

① 3 秒克隆🎙️ 3 秒参考一小段录音说话人编码器与主干联合训练→ 说话人向量(实时克隆)→ 文本+音频对(in-context,保韵律)② 一句话描述音色(Voice Design)「一个低沉沙哑、语速偏慢的中年男声」自然语言写在输入最前面(ChatML)→ 凭空造出新音色双轨 LM 主干按控制信号生成目标音色语音🔊 语音既然主干就是个 LM,让它听懂「用什么声音说」和听懂「说什么」,本是一回事
两种控制:3 秒参考音频克隆音色(说话人向量或上下文),或用一句自然语言描述凭空造一个新音色
  1. 3 秒克隆:给一段 3 秒参考音频,两种用法——抽一个「说话人向量」做实时克隆(快),或把「文本+音频对」当上下文喂进去(in-context,更好地保住原音的韵律)。一个可学习的说话人编码器和主干一起训练,负责在整段输出里锁住音色不漂移。
  2. 一句话描述音色(Voice Design):把控制信号用自然语言写在输入前面(ChatML 格式),「把声音控制当成语言建模任务」。你写「一个低沉沙哑、语速偏慢的中年男声」,它就造一个给你——甚至能凭空造出训练集里没有的新音色。

这条「描述控制」的路子,本质上是把 LM 的老本行(in-context learning、指令跟随)搬到语音生成上——既然主干就是个 LM,那让它听懂「用什么声音说」和听懂「说什么」是一回事。

六、怎么训出来的

前面拆的都是「长什么样」,这节讲「怎么练成的」。Qwen3-TTS 的训练分三块,顺序也大致如此:先把两个 tokenizer 各自训好(学会把声音压成 token、再还原回波形),再训中间那个双轨 LM 主干(学会「看着文字吐 token」)。全程喂进去的语音数据有 5M+ 小时、横跨 10 种语言

① 训两个 tokenizer25Hz 编解码ASR 续训 + VQ → mel 重建流式波形:分块 DiT(flow)12Hz 编解码GAN + WavLM 蒸馏 · 全因果② 双轨 LM 预训练起点:直接拿 Qwen3 权重S1 通用:5M 小时,建对齐S2 高质量:CPT 打磨自然度S3 长上下文:8k → 32k③ 后训练DPO:学人类偏好对GSPO:规则奖励 · 对齐整句说话人微调:锁住音色后训练的 DPO → GSPO,正是把「教模型分辨哪个更好」搬到语音生成上
训练三段式:先各自训好两个 tokenizer,再训双轨 LM——预训练分通用 / 高质量 / 长上下文三步,后训练是 DPO → GSPO → 说话人微调

先训 tokenizer:学会压缩与还原

两个 tokenizer 的训法完全不同,正对应它们不同的取舍:

  • 25Hz 站在 Qwen2-Audio 肩上,分两步:先在语音识别(ASR)任务上继续预训练,给编码器加一个重采样层和一个向量量化(VQ)层,让 token 先抓住语义;再接一个卷积 mel 解码器,拿「从 token 重建 mel 频谱」当目标微调整个模型,把声学细节补回 token。两步合起来,一个 token 里既有语义又有声学。流式出声的那个分块 DiT 解码器则用 flow-matching 单独训练,配一个改版 BigVGAN 声码器。
  • 12Hz 走的是 GAN 那套:生成器直接在原始波形上提取并量化,一个判别器盯着输出、逼它更自然更保真。这里的关键是语义和声学解耦——拿 WavLM 当老师,蒸馏引导第 1 层码本去对齐语义,其余 15 层 RVQ 专管声学;再加一个多尺度 mel 重建损失保住时频一致。整条编解码全因果、不看未来,所以能逐帧流式。

再训主干:预训练三段 + 后训练三段

主干不是从零练的——它直接拿 Qwen3 LM 家族的权重(0.6B / 1.7B)当底子。这也解释了第五节那个「为什么它天生听得懂指令」:读文字、跟指令本来就是 Qwen3 的老本行,TTS 只是教它把「读到的」变成「说出的」。

先看预训练,分三步走,一步比一步精:

  1. 通用:5M+ 小时多语种语音先过一遍,建立「多语种文字 → 语音」的单调对齐——先学会照着字把音发对;
  2. 高质量:用一套质量分层流水线筛出干净数据,继续预训练(CPT)——把发音打磨得更自然;
  3. 长上下文:把最大长度从 8,192 拉到 32,768,并上采样长语音——这正是它念十分钟有声书不跑偏的底气(下一节的长文本 benchmark 会印证)。

再看后训练,也是三步,而这三步恰好是隔壁那篇强化学习博客的实战落地:

  1. DPO:基于人类反馈构造「哪条更好」的偏好对,做 Direct Preference Optimization 对齐——不训裁判,直接从成对偏好里学;
  2. 规则奖励 + GSPO:对能自动判定的东西(读错字、漏字之类)给规则化奖励,配 GSPO 把奖励单位对齐到整句,全面提升能力与稳定性;
  3. 说话人微调:在 base 模型上做一轮轻量说话人微调,让它能稳定发出指定音色(CustomVoice 那 9 个预置嗓音就是这么来的)。

这条 DPO → GSPO 的路线,正是 PPO、DPO、GRPO 与 GSPO 那篇讲的东西搬到语音上:先用 DPO 掀桌省掉裁判,再上 GSPO 把「一整句好不好」的分对齐到句子级。原来「教模型分辨哪个回答更好」这套,语音生成一样吃。

最后是指令控制怎么训进去:控制信号以自然语言指令的形式、按 ChatML 前置到输入序列,把「用什么声音说」和「说什么」写进同一段对话;训练时还以一定概率激活一个「先想再合成」的思考模式,专门啃复杂描述下的指令跟随。这样一来,音色控制就被当成一道语言建模题来学——这也正是它复用 Qwen3 文本理解能力的地方。

不过有一点技术报告没有展开:这些「描述 → 声音」的配对数据究竟怎么来的——人工标注、属性标签套模板、还是用模型自动生成描述——文中并未交代,只讲清了上面的训练机制;而评测用的 InstructTTSEval 也只是打分基准,不是训练数据来源。(读这类报告常有的留白:能力和机制说得清楚,数据配方往往一笔带过。)

另外,12Hz 那条线还额外挂了个 MTP(多 token 预测)模块——主干先吐第 0 层码本,MTP 一次性补出剩下的残差码本,这是它能逐帧即时出声的关键。

七、和别人比,站在哪

Qwen3-TTS 不是每项都第一,但整体很能打(数据来自技术报告):

  • 零样本克隆(Seed-TTS 测试集,WER 越低越好):Qwen3-TTS-12Hz-1.7B 中文 0.77、英文 1.24;CosyVoice 3 中文 0.71(略胜)、英文 1.45;MiniMax-Speech 中文 0.83、英文 1.65。中文 CosyVoice 3 略优,英文 Qwen3-TTS 明显领先。
  • 多语言音色相似度(10 种语言):10 种语言全部拿到最高分,稳定超过 MiniMax 和 ElevenLabs。
  • 可控生成(InstructTTSEval,描述—语音一致性):Voice Design 中文 85.2%,逼近商业闭源的 Gemini-flash(88.2%),远超 GPT-4o-mini-tts(54.9%)。
  • 跨语言(中文音色说韩语):错误率 4.82,比 CosyVoice 3 的 14.4 降了约 66%。
  • 长文本稳定(10 分钟以上):25Hz-1.7B 中文 WER 1.517、英文 1.225,而有的模型在长文本上会退化到二十几。

一句话:中文单点克隆略输 CosyVoice 3,但在更难的维度上——多语言、可控、跨语言、长文本稳定——Qwen3-TTS 是当前开源里的第一梯队,可控性甚至逼近商业闭源。

八、写在最后

回头看,TTS 那几个互相拉扯的目标,Qwen3-TTS 是这么各个击破的:

  1. → 12Hz 多码本 + ConvNet 解码,97ms 首包;
  2. → 25Hz + 扩散解码,长文本不跑偏;
  3. → 3 秒克隆 + 说话人编码器锁音色;
  4. 可控 → LM 主干 + 自然语言描述,把「怎么说」也当语言建模。

这四样又都建在同一套训练之上:两个 tokenizer 各自练好,双轨主干从 Qwen3 权重起步,经「通用 → 高质量 → 长上下文」三段预训练打底,再用 DPO → GSPO 的后训练把「哪条更好」教给它——后训练这一段,正是 PPO、DPO、GRPO 与 GSPO 那篇的语音续集。

而它最值得记住的一课,还是那句老话——没有一种表示能同时满足所有目标,于是干脆给不同场景各配一个。两个 tokenizer 的分工,和 离散 vs 连续 里「理解用连续、生成用离散」、TMRoPE 里「不同任务给时间不同的坐标系」,是同一种工程品味的不同侧面。

至此,多模态系列的「语音」这条线就齐了:Thinker-Talker 讲它怎么决定「边想边说」,离散 vs 连续 讲声音怎么变成可生成的 token,这篇讲一个专门的 TTS 系统怎么把这些手艺打磨到又快又稳又像又可控。

参考