Qwen3-TTS
Qwen3-TTS 是一个 12Hz 编解码语言模型,搭配 Mimi 解码器实现高质量的文本转语音合成。模型经过 4 位量化,在 Apple Silicon 上快于实时运行。
流水线
语音合成遵循三阶段流水线:
- Talker — 28 层 transformer,以 12.5 Hz 将输入文本转换为首个码本 token
- Code Predictor — 5 层 transformer,从首个码本的隐藏状态预测余下的 15 个码本
- Mimi Codec Decoder — 将全部 16 个码本 token 转换为 24 kHz 音频波形
架构
Talker
Talker 是核心的自回归模型,从文本输入生成编解码 token。
| 参数 | 数值 |
|---|---|
| 层数 | 28 |
| 隐藏维度 | 1024 |
| Query 头数 | 16 |
| Key/Value 头数 | 8 (GQA) |
| MLP | SwiGLU |
| 位置编码 | RoPE |
Code Predictor
轻量级的 5 层 transformer,接收来自首个码本的隐藏状态并并行预测剩余的 15 个码本。这避免了每步运行 Talker 16 次。
Mimi Codec Decoder
Mimi 解码器将量化的编解码 token 还原为音频:
- RVQ 解码(16 个码本)
- 前置卷积(512 至 1024 通道)
- 前置 transformer(1024 至 512 瓶颈,8 层,SwiGLU + LayerScale)
- 上采样(2x,2x)
- SEANet 解码器(8x、5x、4x、3x 上采样阶段)
- 24 kHz 波形输出
模型变体
| 模型 | 大小 | HuggingFace |
|---|---|---|
| Qwen3-TTS-0.6B Base (4-bit) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-4bit |
| Qwen3-TTS-0.6B Base (8-bit) | 2.4 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-Base-MLX-8bit |
| Qwen3-TTS-0.6B CustomVoice (4-bit) | 1.7 GB | aufklarer/Qwen3-TTS-12Hz-0.6B-CustomVoice-MLX-4bit |
| Qwen3-TTS-1.7B Base (4-bit) | 3.2 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-4bit |
| Qwen3-TTS-1.7B Base (8-bit) | 4.8 GB | aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-8bit |
| Qwen3-TTS CoreML (FP16) | 2.1 GB | aufklarer/Qwen3-TTS-CoreML |
CoreML 后端
CoreML 后端通过 Core ML 在 GPU 上运行完整的 Qwen3-TTS 流水线,使其可在 iOS 和 macOS 上部署而无需 MLX 依赖。模型被拆分为 6 个专门的子模型,针对 Apple 的计算栈进行了优化:
- TextProjector — 将文本 token 嵌入投影到共享隐藏空间
- CodeEmbedder — 嵌入首个码本 token 和控制 token
- MultiCodeEmbedder — 嵌入码本 1–15 的 token
- CodeDecoder — 28 层自回归 transformer,带无状态 KV 缓存(最多 256 个位置)
- MultiCodeDecoder — 用于码本 1–15 的 5 层代码预测器
- 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 CodeDecoder 使用固定的 256 位置 KV 缓存。长段文本应拆分为单独的句子。解码 token 会被自动限制以适应预填充后剩余的缓存槽位。
CLI 用法
从文本生成语音:
.build/release/audio speak "Hello, world!" --output hello.wav
选项
| 标志 | 描述 |
|---|---|
--engine | TTS 引擎:qwen3(MLX,默认)、coreml(CoreML/GPU)或 cosyvoice |
--output、-o | 输出 WAV 文件路径 |
--language | 语言(默认:english)。省略则使用说话人的母语方言。 |
--model | 模型变体:base 或 customVoice |
--speaker | 说话人音色(需配合 --model customVoice) |
--temperature | 采样温度(默认:0.3) |
--top-k | Top-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")