Qwen3-TTS

Qwen3-TTS là mô hình ngôn ngữ codec 12Hz với bộ giải mã Mimi để tổng hợp giọng nói chất lượng cao từ văn bản. Mô hình được lượng tử hóa 4-bit và chạy nhanh hơn thời gian thực trên Apple Silicon.

Pipeline

Tổng hợp giọng nói tuân theo pipeline ba giai đoạn:

  1. Talker — transformer 28 lớp chuyển văn bản đầu vào thành token codebook đầu tiên ở tần số 12.5 Hz
  2. Code Predictor — transformer 5 lớp dự đoán 15 codebook còn lại từ các hidden state của codebook đầu tiên
  3. Bộ giải mã codec Mimi — chuyển toàn bộ 16 token codebook thành dạng sóng âm thanh 24 kHz

Kiến trúc

Talker

Talker là mô hình tự hồi quy cốt lõi sinh ra token codec từ văn bản đầu vào.

Tham sốGiá trị
Số lớp28
Chiều ẩn1024
Đầu query16
Đầu key/value8 (GQA)
MLPSwiGLU
Mã hóa vị tríRoPE

Code Predictor

Một transformer nhẹ 5 lớp nhận các hidden state từ codebook đầu tiên và dự đoán song song 15 codebook còn lại. Điều này tránh việc phải chạy toàn bộ Talker 16 lần mỗi bước.

Bộ giải mã codec Mimi

Bộ giải mã Mimi chuyển các token codec đã lượng tử hóa trở lại thành âm thanh:

  1. Giải mã RVQ (16 codebook)
  2. Pre-convolution (512 đến 1024 kênh)
  3. Pre-transformer (bottleneck từ 1024 xuống 512, 8 lớp, SwiGLU + LayerScale)
  4. Upsample (2x, 2x)
  5. Bộ giải mã SEANet (các tầng upsample 8x, 5x, 4x, 3x)
  6. Đầu ra dạng sóng 24 kHz

Biến thể mô hình

Mô hìnhKích thướcHuggingFace
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

Backend CoreML

Backend CoreML chạy toàn bộ pipeline Qwen3-TTS trên GPU thông qua Core ML, cho phép triển khai trên iOS và macOS mà không cần các phụ thuộc MLX. Mô hình được chia thành 6 submodel chuyên biệt được tối ưu cho ngăn xếp tính toán của Apple:

  1. TextProjector — Chiếu các embedding token văn bản sang không gian ẩn dùng chung
  2. CodeEmbedder — Tạo embedding cho token codebook đầu tiên và token điều khiển
  3. MultiCodeEmbedder — Tạo embedding cho các token từ codebook 1–15
  4. CodeDecoder — Transformer tự hồi quy 28 lớp với KV cache không trạng thái (tối đa 256 vị trí)
  5. MultiCodeDecoder — Code predictor 5 lớp cho các codebook 1–15
  6. SpeechDecoder — Bộ giải mã codec Mimi, chuyển 16 token codebook thành âm thanh 24 kHz
# Tổng hợp bằng CoreML
.build/release/speech speak "Hello, world!" --engine coreml -o hello.wav

# CoreML dùng temperature 0.8 mặc định (cần thiết để có chất lượng tốt)
.build/release/speech speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
Giới hạn KV cache của CoreML

CodeDecoder của CoreML dùng KV cache cố định 256 vị trí. Các đoạn dài hơn cần được tách thành từng câu riêng lẻ. Các token giải mã sẽ tự động bị giới hạn để vừa với số slot cache còn lại sau prefill.

Sử dụng CLI

Sinh giọng nói từ văn bản:

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

Tùy chọn

FlagMô tả
--engineEngine TTS: qwen3 (MLX, mặc định), coreml (CoreML/GPU) hoặc cosyvoice
--output, -oĐường dẫn tới file WAV đầu ra
--languageNgôn ngữ (mặc định: english). Bỏ qua để dùng phương ngữ bản ngữ của người nói.
--modelBiến thể mô hình: base hoặc customVoice
--speakerGiọng người nói (yêu cầu --model customVoice)
--temperatureNhiệt độ lấy mẫu (mặc định: 0.3)
--top-kTham số lấy mẫu top-k
--max-tokensSố token tối đa cần sinh (mặc định: 500)
--streamBật streaming — phát ra các chunk âm thanh trong quá trình sinh
--first-chunk-framesSố frame trong chunk đầu tiên được streaming
--chunk-framesSố frame trong mỗi chunk tiếp theo được streaming
--batch-fileĐường dẫn tới file văn bản với mỗi câu một dòng để tổng hợp theo lô
--batch-sizeSố câu được xử lý song song trong chế độ batch

Ví dụ

# Tổng hợp cơ bản
.build/release/speech speak "The quick brown fox." -o fox.wav

# Đầu ra streaming
.build/release/speech speak "Long passage of text..." --stream -o stream.wav

# Tổng hợp theo lô từ file
.build/release/speech speak --batch-file sentences.txt --batch-size 4 -o output_dir/

Streaming

Flag --stream bật đầu ra âm thanh theo chunk trong quá trình sinh. Thay vì chờ toàn bộ câu hoàn thành, âm thanh được phát ra theo từng chunk khi token được sinh ra. Dùng --first-chunk-frames--chunk-frames để kiểm soát kích thước của mỗi chunk.

Chế độ batch

Để tổng hợp nhiều câu, dùng --batch-file với một file văn bản chứa mỗi dòng một câu. Flag --batch-size kiểm soát số câu được xử lý song song.

Hiệu năng

Trên M2 Max, Qwen3-TTS đạt RTF (hệ số thời gian thực) khoảng 0.55, nghĩa là sinh giọng nói nhanh hơn thời gian thực. Với warmup bằng compile(), mỗi bước mất khoảng 37 ms.

Giới hạn an toàn

Giá trị tối đa mặc định là 500 token, tương ứng khoảng 40 giây âm thanh ở 12.5 Hz. Đặt giá trị cao hơn có nguy cơ vượt quá timeout watchdog của Metal GPU, có thể gây khởi động lại hệ thống trên Apple Silicon vì GPU được dùng chung với bộ tổng hợp giao diện.

Ngôn ngữ

Qwen3-TTS hỗ trợ tổng hợp giọng nói đa ngôn ngữ. Mô hình tự động phát hiện ngôn ngữ đầu vào và sinh giọng nói tương ứng.

API Swift

import Qwen3TTS

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