Qwen3-TTS
Qwen3-TTS เป็นโมเดลภาษา codec 12Hz พร้อมตัวถอดรหัส Mimi สำหรับการสังเคราะห์เสียงพูดคุณภาพสูงจากข้อความ โมเดลถูก quantize เป็น 4-bit และทำงานได้เร็วกว่าเวลาจริงบน Apple Silicon
Pipeline
การสังเคราะห์เสียงพูดดำเนินตาม pipeline สามขั้นตอน:
- Talker — transformer 28 ชั้นที่แปลงข้อความอินพุตเป็นโทเค็น codebook แรกที่ความถี่ 12.5 Hz
- Code Predictor — transformer 5 ชั้นที่ทำนาย codebook อีก 15 ตัวที่เหลือจาก hidden state ของ codebook แรก
- ตัวถอดรหัส codec Mimi — แปลงโทเค็น codebook ทั้ง 16 ตัวเป็นรูปคลื่นเสียง 24 kHz
สถาปัตยกรรม
Talker
Talker คือโมเดล autoregressive หลักที่สร้างโทเค็น codec จากข้อความอินพุต
| พารามิเตอร์ | ค่า |
|---|---|
| จำนวนชั้น | 28 |
| มิติ hidden | 1024 |
| หัว query | 16 |
| หัว key/value | 8 (GQA) |
| MLP | SwiGLU |
| การเข้ารหัสตำแหน่ง | RoPE |
Code Predictor
transformer ขนาดเบา 5 ชั้นที่รับ hidden state จาก codebook แรกและทำนาย codebook อีก 15 ตัวที่เหลือแบบขนาน วิธีนี้ช่วยหลีกเลี่ยงการรัน Talker เต็มรูปแบบ 16 ครั้งต่อขั้นตอน
ตัวถอดรหัส codec Mimi
ตัวถอดรหัส Mimi แปลงโทเค็น codec ที่ quantize แล้วกลับเป็นเสียง:
- ถอดรหัส RVQ (16 codebook)
- Pre-convolution (512 ถึง 1024 ช่อง)
- Pre-transformer (bottleneck จาก 1024 เหลือ 512, 8 ชั้น, SwiGLU + LayerScale)
- Upsample (2x, 2x)
- ตัวถอดรหัส SEANet (ขั้น upsample 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 |
Backend CoreML
Backend CoreML รัน pipeline Qwen3-TTS ทั้งหมดบน GPU ผ่าน Core ML ทำให้สามารถ deploy บน iOS และ macOS โดยไม่ต้องพึ่ง MLX โมเดลถูกแบ่งเป็น 6 submodel เฉพาะทางที่ปรับให้เหมาะกับสแต็กการประมวลผลของ Apple:
- TextProjector — ฉาย embedding ของโทเค็นข้อความไปยังพื้นที่ hidden ที่ใช้ร่วมกัน
- CodeEmbedder — ทำ embedding โทเค็น codebook แรกและโทเค็นควบคุม
- MultiCodeEmbedder — ทำ embedding โทเค็นจาก codebook 1–15
- CodeDecoder — transformer autoregressive 28 ชั้นพร้อม KV cache แบบไร้สถานะ (สูงสุด 256 ตำแหน่ง)
- MultiCodeDecoder — code predictor 5 ชั้นสำหรับ codebook 1–15
- SpeechDecoder — ตัวถอดรหัส codec Mimi แปลงโทเค็น codebook 16 ตัวเป็นเสียง 24 kHz
# การสังเคราะห์ด้วย CoreML
.build/release/speech speak "Hello, world!" --engine coreml -o hello.wav
# CoreML ใช้ temperature 0.8 เป็นค่าเริ่มต้น (จำเป็นเพื่อคุณภาพเอาต์พุต)
.build/release/speech speak "Long text here." --engine coreml --temperature 0.9 -o out.wav
CodeDecoder ของ CoreML ใช้ KV cache คงที่ 256 ตำแหน่ง ข้อความที่ยาวกว่านี้ควรถูกแบ่งเป็นประโยคย่อย โทเค็นที่ถอดรหัสจะถูกจำกัดอัตโนมัติให้พอดีกับสล็อต cache ที่เหลือหลังจาก prefill
การใช้งาน CLI
สร้างเสียงพูดจากข้อความ:
.build/release/speech speak "Hello, world!" --output hello.wav
ตัวเลือก
| Flag | คำอธิบาย |
|---|---|
--engine | 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 | จำนวนโทเค็นสูงสุดที่จะสร้าง (ค่าเริ่มต้น: 500) |
--stream | เปิดใช้งาน streaming — ส่งชิ้นเสียงระหว่างการสร้าง |
--first-chunk-frames | จำนวน frame ในชิ้น streaming แรก |
--chunk-frames | จำนวน frame ต่อชิ้น streaming ถัดไป |
--batch-file | เส้นทางไปยังไฟล์ข้อความที่มีหนึ่งประโยคต่อบรรทัดสำหรับการสังเคราะห์แบบ batch |
--batch-size | จำนวนประโยคที่ประมวลผลขนานในโหมด batch |
ตัวอย่าง
# การสังเคราะห์พื้นฐาน
.build/release/speech speak "The quick brown fox." -o fox.wav
# เอาต์พุต streaming
.build/release/speech speak "Long passage of text..." --stream -o stream.wav
# การสังเคราะห์แบบ batch จากไฟล์
.build/release/speech speak --batch-file sentences.txt --batch-size 4 -o output_dir/
Streaming
Flag --stream เปิดใช้งานเอาต์พุตเสียงแบบเป็นชิ้นระหว่างการสร้าง แทนที่จะรอให้ประโยคทั้งหมดเสร็จสิ้น เสียงจะถูกส่งออกเป็นชิ้นๆ ขณะที่โทเค็นถูกสร้างขึ้น ใช้ --first-chunk-frames และ --chunk-frames เพื่อควบคุมขนาดของแต่ละชิ้น
โหมด batch
สำหรับการสังเคราะห์หลายประโยค ให้ใช้ --batch-file กับไฟล์ข้อความที่มีหนึ่งประโยคต่อบรรทัด Flag --batch-size ควบคุมจำนวนประโยคที่ประมวลผลขนาน
ประสิทธิภาพ
บน M2 Max, Qwen3-TTS ทำ RTF (real-time factor) ได้ประมาณ 0.55 หมายความว่าสร้างเสียงพูดได้เร็วกว่าเวลาจริง ด้วย warmup ผ่าน compile() แต่ละขั้นใช้เวลาประมาณ 37 ms
ค่าสูงสุดเริ่มต้นคือ 500 โทเค็น ซึ่งผลิตเสียงประมาณ 40 วินาทีที่ 12.5 Hz การตั้งค่าที่สูงกว่านี้เสี่ยงต่อการเกิน timeout watchdog ของ Metal GPU ซึ่งอาจทำให้ระบบรีบูตบน Apple Silicon เนื่องจาก GPU ถูกใช้ร่วมกับ compositor
ภาษา
Qwen3-TTS รองรับการสังเคราะห์เสียงพูดหลายภาษา โมเดลจะตรวจจับภาษาของอินพุตโดยอัตโนมัติและสร้างเสียงพูดที่เหมาะสม
API Swift
import Qwen3TTS
let model = try await Qwen3TTSModel.loadFromHub()
let audio = try await model.speak("Hello, world!")
try audio.write(to: "hello.wav")