Magpie-TTS Multilingual
NVIDIA Magpie-TTS Multilingual 357M trong Swift trên Apple Silicon — một mô hình văn bản sang giọng nói tự hồi quy đa codebook trên Nano-Codec 22,05 kHz của NeMo. Chín ngôn ngữ (tiếng Anh, tiếng Tây Ban Nha, tiếng Đức, tiếng Pháp, tiếng Ý, tiếng Việt, tiếng Hindi, tiếng Quan Thoại, tiếng Nhật) với năm bản sắc người nói dựng sẵn. Phát hành ở dạng lượng tử hóa INT4 (~247 MB) hoặc INT8 (~411 MB). Sẵn sàng streaming, độ trễ gói đầu tiên ~120 ms.
Magpie là lựa chọn đúng khi bạn cần một gói nhỏ duy nhất nói được chín ngôn ngữ với giọng nói nhất quán. Năm người nói dựng sẵn giữ bản sắc ổn định qua các ngôn ngữ — hữu ích cho trợ lý đa ngôn ngữ, ứng dụng giáo dục hoặc kể sách nói có chuyển ngữ. Đối với nhân bản giọng nói zero-shot, hãy dùng CosyVoice3, Qwen3-TTS Base, hoặc VoxCPM2.
Kiến trúc
Magpie là một pipeline MLX gồm 4 bundle: text encoder → decoder cross-attention → đầu codebook LocalTransformer → codec âm thanh Causal HiFi-GAN. Các bundle chia sẻ trọng số decoder giữa các điểm vào prefill và step để khớp với bố cục CoreML của FluidInference upstream.
| Giai đoạn | Module | Chi tiết |
|---|---|---|
| 1. Tokenisation | MagpieTokenizer | Per-language G2P (IPA dict / byT5 bytes / pinyin / katakana), shared 2360-token vocab with per-tokenizer offsets, always-appended EOS |
| 2. Text encoder | MagpieTextEncoder | 6 causal Transformer layers, d=768, k=3 conv FFN |
| 3. Decoder prefill | MagpieDecoder | 12 causal layers with cross-attention. Seeds the 110-frame baked speaker context + BOS into the KV cache. |
| 4. LocalTransformer | MagpieLocalTransformer | 1-layer codebook AR head, d=256. Samples the 8 codebooks per frame sequentially given the decoder hidden. |
| 5. Decoder step | MagpieDecoder | One AR step per frame until EOS or 500-frame cap (~23 s). |
| 6. NanoCodec | MagpieNanoCodec | FSQ inverse → causal HiFi-GAN → 22.05 kHz mono waveform. |
Ngôn ngữ và G2P
Cả chín ngôn ngữ đều round-trip qua Qwen3-ASR trong testMultilingualRoundTrip của SDK. Mỗi ngôn ngữ có một pipeline được điều chỉnh riêng:
| Ngôn ngữ | Mã | Pipeline G2P |
|---|---|---|
| Tiếng Anh | en | Từ điển CMU IPA (125 k mục, đi kèm) |
| Tiếng Tây Ban Nha | es | Từ điển IPA tiếng Tây Ban Nha (đi kèm) |
| Tiếng Đức | de | Từ điển IPA tiếng Đức (đi kèm) |
| Tiếng Pháp | fr | Bộ mã hóa byte UTF-8 byT5 |
| Tiếng Ý | it | Bộ mã hóa byte UTF-8 byT5 |
| Tiếng Việt | vi | Bộ mã hóa byte UTF-8 byT5 |
| Tiếng Hindi | hi | Tra cứu codepoint Devanagari + sub-vocab last-wins |
| Tiếng Quan Thoại | zh | Phân từ NLTokenizer(.simplifiedChinese) + Apple .mandarinToLatin + từ điển pinyin → IPA đi kèm + dấu thanh #N |
| Tiếng Nhật | ja | Đọc kanji CFStringTokenizer + dakuten được bảo toàn NFC + dấu cao độ heiban + override cho tiểu từ/lời chào |
Vocab chia sẻ 2360 mục nối từng sub-tokenizer của mỗi ngôn ngữ end-to-end với offset theo ngôn ngữ (ghi trong MagpieSubVocab). Text-embedding thêm hai hàng bổ sung sau vocab cho BOS/EOS; eos_id = 2361 được nối vào mọi chuỗi đầu vào.
Người nói dựng sẵn
Checkpoint nhúng năm ngữ cảnh người nói (110 frame × 768 chiều mỗi cái) dùng làm tiền tố cho mỗi lần giải mã AR. Bản sắc người nói nhất quán trên cả chín ngôn ngữ.
| Chỉ số | Tên CLI | Bản sắc |
|---|---|---|
| 0 | sofia | Sofia (mặc định) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Biến thể mô hình
| Biến thể | Đĩa | RAM (load + decode) | HuggingFace |
|---|---|---|---|
| INT4 (mặc định) | ~247 MB | ~1,3 GB | aufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit |
| INT8 | ~411 MB | ~1,6 GB | aufklarer/Magpie-TTS-Multilingual-357M-MLX-8bit |
Cả hai bundle dùng lượng tử hóa flat affine của MLX (mlx_affine_flat, group size 64) và giải lượng tử về FP32 khi load — các activation lúc runtime đều ở độ chính xác đầy đủ. INT4 không thể phân biệt được về mặt thính giác với INT8 cho mô hình này; chọn INT4 trừ khi bạn có dư bộ nhớ lưu trữ.
Sử dụng CLI
# Tiếng Anh, giải mã greedy
speech speak "Hello, world." --engine magpie --magpie-speaker aria \
--magpie-temperature 0 -o out.wav
# Tiếng Tây Ban Nha (bất kỳ ngôn ngữ nào trong 9 — chọn bằng --language)
speech speak "Hola, mundo." --engine magpie --language es \
--magpie-speaker aria -o out.wav
# Tiếng Nhật — cần giải mã ngẫu nhiên (greedy bị kẹt ở cụm từ đầu tiên)
speech speak "こんにちは世界、これは音声合成システムです。" \
--engine magpie --language ja --magpie-temperature 0.6 \
--magpie-top-k 80 --seed 42 -o out.wav
# Tổng hợp streaming với phát lại
speech speak "Streaming test" --engine magpie --stream --play
# Liệt kê 5 người nói dựng sẵn
speech speak --engine magpie --list-speakers
# IPA đã phiên âm sẵn bỏ qua G2P theo ngôn ngữ
speech speak "həˈloʊ" --engine magpie --magpie-prephonemized -o out.wav
Tùy chọn
| Tùy chọn | Mặc định | Mô tả |
|---|---|---|
--magpie-variant | int4 | Biến thể lượng tử hóa: int4 hoặc int8 |
--magpie-speaker | sofia | Người nói dựng sẵn: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Nhiệt độ lấy mẫu (0 = greedy) |
--magpie-top-k | 80 | Bộ lọc top-k cho lấy mẫu |
--magpie-max-frames | 500 | Giới hạn cứng số frame codec (~23 s) |
--magpie-min-frames | 4 | Số frame tối thiểu trước khi cho phép EOS |
--magpie-prephonemized | off | Coi đầu vào là luồng IPA / âm vị; bỏ qua G2P theo ngôn ngữ |
--language | english | Chọn pipeline tokenizer theo ngôn ngữ |
--stream | off | Phát ra AsyncStream<AudioChunk> thay vì một WAV duy nhất |
--seed | — | Lấy mẫu Gumbel có thể tái lập |
Đầu vào tiếng Nhật dài hơn một từ duy nhất cần giải mã ngẫu nhiên (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 phản chiếu test tham chiếu của NeMo). Greedy bị kẹt ở cụm từ đầu tiên vì heuristic dấu cao độ heiban lệch khỏi sự thật theo từng từ.
Nhân bản giọng nói — không hỗ trợ
Magpie không có điều kiện hóa người nói zero-shot trong mô hình; chỉ 5 bản sắc dựng sẵn đi kèm bundle. CLI từ chối các cờ chia sẻ --voice-sample, --speaker, và --instruct kèm thông báo lỗi có thể hành động được, chỉ tới cờ --magpie-speaker hoặc các engine có hỗ trợ nhân bản (Qwen3-TTS Base, CosyVoice3, VoxCPM2).
Hiệu năng (M4 Pro)
| Cấu hình | Âm thanh | Thời gian thực | RTF |
|---|---|---|---|
| Batch, INT4, greedy, prompt ngắn | 2,8 s | 0,88 s | 0,32 |
| Batch, INT4, greedy, câu | 5,8 s | 1,35 s | 0,23 |
| Batch, INT4, sampled, đầu ra 23 s | 23 s | 5,6 s | 0,24 |
| Streaming, INT4, sampled | 23 s | 21,6 s | 0,93 |
Độ trễ gói đầu tiên ở chế độ streaming là ≈120 ms sau khi load mô hình. RTF streaming cao hơn vì codec được gọi lại trên toàn bộ buffer code ở mỗi lần phát chunk (một phiên bản tương lai có thể cache trạng thái codec).
API Swift
import MagpieTTS
let model = try await MagpieTTS.fromPretrained(variant: .int4)
// Tổng hợp batch (en/es/de/fr/it/vi/hi/zh — greedy hoạt động)
let audio = try model.synthesize(
text: "Hello, world.",
speaker: .aria,
language: .english,
params: MagpieTTSParams(temperature: 0, topK: 1, maxSteps: 500))
// Tiếng Nhật — dùng lấy mẫu ngẫu nhiên
let audioJA = try model.synthesize(
text: "こんにちは世界、これは音声合成システムです。",
speaker: .aria,
language: .japanese,
params: MagpieTTSParams(temperature: 0.6, topK: 80,
maxSteps: 300, seed: 42))
// Streaming (AsyncStream<AudioChunk>)
let stream = model.synthesizeStream(
text: "Streaming text",
speaker: .aria,
language: .english,
firstChunkFrames: 8,
framesPerChunk: 25)
for try await chunk in stream {
// chunk.samples là Float32 mono 22,05 kHz
}
Backend CoreML (--engine magpie-coreml)
Bên cạnh bundle MLX, Magpie phát hành một bundle CoreML (aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8). Bốn gói .mlmodelc — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder — chạy trên ANE / GPU; một FSQ inverse phía Swift biến các code đã lấy mẫu thành các latent 32 chiều mà codec tiêu thụ.
# 8 ngôn ngữ (không có tiếng Nhật), 5 người nói dựng sẵn
speech speak "Hello world." --engine magpie-coreml --magpie-speaker aria -o hi.wav
speech speak "Hola mundo." --engine magpie-coreml --language es --magpie-speaker leo -o es.wav
# --language ja tự động định tuyến sang backend MLX (thông báo stderr)
speech speak "こんにちは" --engine magpie-coreml --language ja -o ja.wav
Các điểm cần lưu ý so với --engine magpie:
- Pipeline hybrid hiện tại. LocalTransformer 1 lớp (đầu lấy mẫu codebook thực sự mà NeMo huấn luyện) và 8 bảng audio embedding không được phát hành bên trong bundle CoreML. Ở lần tổng hợp đầu tiên, engine CoreML lazy-load bundle MLX INT4 để vận hành cả hai phần. Round-trip ASR giống hệt bit-for-bit với backend MLX; điểm khác biệt là engine này cũng kéo theo bundle MLX. Một con đường CoreML thuần túy cho triển khai chỉ ANE trên iOS cần bundle phải có
local_transformer/*.npy+audio_embedding_*.npyvà một LT Swift Accelerate (đang theo dõi). - Không streaming.
nanocodec_decoder.mlmodelcđược trace ở cửa sổ cố định 64 frame. Chúng tôi chia nhỏ các chuỗi dài hơn ở bên trong, nhưng độ trễ gói đầu tiên sẽ là ~3 s nếu phát tại ranh giới chunk.--streambị từ chối với lỗi có thể hành động được. - Không có tokenizer tiếng Nhật. Bundle CoreML chưa phát hành JSON tokenizer JA.
--language javới engine này tự động fallback về backend MLX.
Thứ tự người nói khớp với speaker_info.json của bundle CoreML (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — khác với MLX), và enum người nói ánh xạ bên trong để các tên CLI hoạt động cho cả hai engine.
Ghi chú triển khai
Ba lỗi đáng biết nếu bạn đang port TTS đa ngôn ngữ kiểu NeMo:
- Chia số nguyên FSQ —
/của MLX-swift là phép chia thật (mlx_divide); FSQ inverse của NeMo dùng//của Python. DùngMLX.floorDivide(...)nếu không mỗi slot FSQ sẽ giải mã thành các offset phân số và codec sẽ làm nhòe âm thanh. - Offset sub-vocab —
AggregatedTTSTokenizercủa NeMo nối các vocab theo từng ngôn ngữ với offset. Một bản đồ first-occurrence toàn cục ngây thơ sẽ luôn rơi vào vùng tiếng Anh và tạo ra âm thanh vô nghĩa cho các ngôn ngữ khác. - Hindi last-wins dedup —
HindiCharsTokenizerphát ra các mục Devanagari trùng lặp (CHARSET trùng với PUNCT_LIST). Dict-comprehension{l: i for i, l in enumerate(tokens)}của Python giữ lại lần gán cuối; hãy phản chiếu điều đó, không dùng first-occurrence.
Cả ba bản sửa được tài liệu hóa inline trong module Swift.
Nguồn
- Trọng số upstream: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Paper: NanoCodec: Towards High-Quality Ultra Fast Speech LLM Inference (2025)
- Port CoreML tham chiếu: FluidInference/mobius
- Module Swift: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- Bundle CoreML: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Giấy phép
- Trọng số mô hình: NVIDIA Open Model License (cho phép sử dụng thương mại; xem PDF được liên kết trên trang HuggingFace)
- Port Swift + từ điển IPA / pinyin đi kèm: giống với NeMo upstream (Apache 2.0 cho từ điển, NVIDIA OML cho mô hình)