Qwen3-TTS

Qwen3-TTS 是一个 12Hz 编解码语言模型,搭配 Mimi 解码器实现高质量的文本转语音合成。模型经过 4 位量化,在 Apple Silicon 上快于实时运行。

流水线

语音合成遵循三阶段流水线:

  1. Talker — 28 层 transformer,以 12.5 Hz 将输入文本转换为首个码本 token
  2. Code Predictor — 5 层 transformer,从首个码本的隐藏状态预测余下的 15 个码本
  3. Mimi Codec Decoder — 将全部 16 个码本 token 转换为 24 kHz 音频波形

架构

Talker

Talker 是核心的自回归模型,从文本输入生成编解码 token。

参数数值
层数28
隐藏维度1024
Query 头数16
Key/Value 头数8 (GQA)
MLPSwiGLU
位置编码RoPE

Code Predictor

轻量级的 5 层 transformer,接收来自首个码本的隐藏状态并并行预测剩余的 15 个码本。这避免了每步运行 Talker 16 次。

Mimi Codec Decoder

Mimi 解码器将量化的编解码 token 还原为音频:

  1. RVQ 解码(16 个码本)
  2. 前置卷积(512 至 1024 通道)
  3. 前置 transformer(1024 至 512 瓶颈,8 层,SwiGLU + LayerScale)
  4. 上采样(2x,2x)
  5. SEANet 解码器(8x、5x、4x、3x 上采样阶段)
  6. 24 kHz 波形输出

模型变体

模型大小HuggingFace
Qwen3-TTS-0.6B Base (4-bit)1.7 GBaufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit
Qwen3-TTS-0.6B Base (8-bit)2.4 GBaufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit
Qwen3-TTS-0.6B CustomVoice (4-bit)1.7 GBaufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit
Qwen3-TTS-1.7B Base (4-bit)3.2 GBaufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit
Qwen3-TTS-1.7B Base (8-bit)4.8 GBaufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit
Qwen3-TTS CoreML (FP16)2.1 GBaufklarer/Qwen3-TTS-CoreML

CoreML 后端

CoreML 后端通过 Core ML 在 GPU 上运行完整的 Qwen3-TTS 流水线,使其可在 iOS 和 macOS 上部署而无需 MLX 依赖。模型被拆分为 6 个专门的子模型,针对 Apple 的计算栈进行了优化:

  1. TextProjector — 将文本 token 嵌入投影到共享隐藏空间
  2. CodeEmbedder — 嵌入首个码本 token 和控制 token
  3. MultiCodeEmbedder — 嵌入码本 1–15 的 token
  4. CodeDecoder — 28 层自回归 transformer,带无状态 KV 缓存(最多 256 个位置)
  5. MultiCodeDecoder — 用于码本 1–15 的 5 层代码预测器
  6. SpeechDecoder — Mimi 编解码解码器,将 16 个码本 token 转换为 24 kHz 音频
# CoreML 合成
.build/release/audio speak "Hello, world!" --engine coreml -o hello.wav

# CoreML 默认温度为 0.8(输出质量所需)
.build/release/audio speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
CoreML KV 缓存上限

CoreML CodeDecoder 使用固定的 256 位置 KV 缓存。长段文本应拆分为单独的句子。解码 token 会被自动限制以适应预填充后剩余的缓存槽位。

CLI 用法

从文本生成语音:

.build/release/audio speak "Hello, world!" --output hello.wav

选项

标志描述
--engineTTS 引擎:qwen3(MLX,默认)、coreml(CoreML/GPU)或 cosyvoice
--output-o输出 WAV 文件路径
--language语言(默认:english)。省略则使用说话人的母语方言。
--model模型变体:basecustomVoice
--speaker说话人音色(需配合 --model customVoice
--temperature采样温度(默认:0.3)
--top-kTop-k 采样参数
--max-tokens生成的最大 token 数(默认:500)
--stream启用流式输出 — 在生成过程中发送音频块
--first-chunk-frames首个流式块中的帧数
--chunk-frames后续每个流式块的帧数
--batch-file批量合成的文本文件路径(每行一条语句)
--batch-size批量模式下并行语句数

示例

# 基础合成
.build/release/audio speak "The quick brown fox." -o fox.wav

# 流式输出
.build/release/audio speak "Long passage of text..." --stream -o stream.wav

# 从文件批量合成
.build/release/audio speak --batch-file sentences.txt --batch-size 4 -o output_dir/

流式输出

--stream 标志启用生成过程中的分块音频输出。无需等待整条语句完成,音频会在 token 产生时逐块发送。使用 --first-chunk-frames--chunk-frames 可控制每个块的大小。

批量模式

若需合成多条语句,请使用 --batch-file 并指向一个每行一条的文本文件。--batch-size 标志控制并行处理的语句数量。

性能

在 M2 Max 上,Qwen3-TTS 的 RTF(实时倍率)约为 0.55,意味着它生成语音比实时更快。开启 compile() 预热后,每步约耗时 37 ms。

安全限制

默认最大值为 500 token,约产生 40 秒音频(12.5 Hz)。设置更高的值可能超出 Metal GPU 看门狗的时长限制,由于 Apple Silicon 上 GPU 与合成器共享,这可能导致系统重启。

语言

Qwen3-TTS 支持多语言文本转语音合成。模型会自动检测输入语言并相应生成语音。

Swift API

import Qwen3TTS

let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")