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.

Khi nào nên dùng Magpie

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ạnModuleChi tiết
1. TokenisationMagpieTokenizerPer-language G2P (IPA dict / byT5 bytes / pinyin / katakana), shared 2360-token vocab with per-tokenizer offsets, always-appended EOS
2. Text encoderMagpieTextEncoder6 causal Transformer layers, d=768, k=3 conv FFN
3. Decoder prefillMagpieDecoder12 causal layers with cross-attention. Seeds the 110-frame baked speaker context + BOS into the KV cache.
4. LocalTransformerMagpieLocalTransformer1-layer codebook AR head, d=256. Samples the 8 codebooks per frame sequentially given the decoder hidden.
5. Decoder stepMagpieDecoderOne AR step per frame until EOS or 500-frame cap (~23 s).
6. NanoCodecMagpieNanoCodecFSQ 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ữPipeline G2P
Tiếng AnhenTừ điển CMU IPA (125 k mục, đi kèm)
Tiếng Tây Ban NhaesTừ điển IPA tiếng Tây Ban Nha (đi kèm)
Tiếng ĐứcdeTừ điển IPA tiếng Đức (đi kèm)
Tiếng PhápfrBộ mã hóa byte UTF-8 byT5
Tiếng ÝitBộ mã hóa byte UTF-8 byT5
Tiếng ViệtviBộ mã hóa byte UTF-8 byT5
Tiếng HindihiTra cứu codepoint Devanagari + sub-vocab last-wins
Tiếng Quan ThoạizhPhân từ NLTokenizer(.simplifiedChinese) + Apple .mandarinToLatin + từ điển pinyin → IPA đi kèm + dấu thanh #N
Tiếng NhậtjaĐọ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 CLIBản sắc
0sofiaSofia (mặc định)
1ariaAria
2jasonJason
3leoLeo
4johnJohn Van Stan

Biến thể mô hình

Biến thểĐĩaRAM (load + decode)HuggingFace
INT4 (mặc định)~247 MB~1,3 GBaufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit
INT8~411 MB~1,6 GBaufklarer/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ọnMặc địnhMô tả
--magpie-variantint4Biến thể lượng tử hóa: int4 hoặc int8
--magpie-speakersofiaNgười nói dựng sẵn: sofia, aria, jason, leo, john
--magpie-temperature0.6Nhiệt độ lấy mẫu (0 = greedy)
--magpie-top-k80Bộ lọc top-k cho lấy mẫu
--magpie-max-frames500Giới hạn cứng số frame codec (~23 s)
--magpie-min-frames4Số frame tối thiểu trước khi cho phép EOS
--magpie-prephonemizedoffCoi đầu vào là luồng IPA / âm vị; bỏ qua G2P theo ngôn ngữ
--languageenglishChọn pipeline tokenizer theo ngôn ngữ
--streamoffPhát ra AsyncStream<AudioChunk> thay vì một WAV duy nhất
--seedLấy mẫu Gumbel có thể tái lập
Mẹo lấy mẫu tiếng Nhật

Đầ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 thanhThời gian thựcRTF
Batch, INT4, greedy, prompt ngắn2,8 s0,88 s0,32
Batch, INT4, greedy, câu5,8 s1,35 s0,23
Batch, INT4, sampled, đầu ra 23 s23 s5,6 s0,24
Streaming, INT4, sampled23 s21,6 s0,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 .mlmodelctext_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:

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:

Cả ba bản sửa được tài liệu hóa inline trong module Swift.

Nguồn

Giấy phép