Magpie-TTS Multilingual
Apple Silicon üzerinde Swift'te NVIDIA Magpie-TTS Multilingual 357M — NeMo'nun 22,05 kHz Nano-Codec'i üzerinde otoregresif çok kod kitaplı bir metinden konuşmaya modeli. Beş hazır konuşmacı kimliğiyle dokuz dil (İngilizce, İspanyolca, Almanca, Fransızca, İtalyanca, Vietnamca, Hintçe, Mandarin Çincesi, Japonca). INT4 (~247 MB) veya INT8 (~411 MB) olarak nicelenmiş halde sunulur. Streaming için hazır, ~120 ms ilk paket gecikmesi.
Magpie, tutarlı bir sesle dokuz dil konuşan tek bir küçük pakete ihtiyaç duyduğunuzda doğru tercihtir. Beş hazır konuşmacı diller arasında kimlik açısından stabil kalır — çok dilli asistanlar, eğitim uygulamaları veya dil değiştirmeli sesli kitap anlatımı için yararlıdır. Zero-shot ses klonlama için bunun yerine CosyVoice3, Qwen3-TTS Base veya VoxCPM2 kullanın.
Mimari
Magpie 4 paketten oluşan bir MLX pipeline'ıdır: text encoder → cross-attention decoder → LocalTransformer codebook başlığı → Causal HiFi-GAN ses codec'i. Paketler, üst akış FluidInference'in CoreML düzenine uymak için prefill ve step giriş noktaları arasında decoder ağırlıklarını paylaşır.
| Aşama | Modül | Detaylar |
|---|---|---|
| 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. |
Diller ve G2P
Dokuz dilin tamamı SDK'nın testMultilingualRoundTrip'inde Qwen3-ASR üzerinden gidiş-dönüş yapar. Her dilin özel bir pipeline'ı vardır:
| Dil | Kod | G2P pipeline |
|---|---|---|
| İngilizce | en | CMU IPA sözlüğü (125 k giriş, paket içinde) |
| İspanyolca | es | İspanyolca IPA sözlüğü (paket içinde) |
| Almanca | de | Almanca IPA sözlüğü (paket içinde) |
| Fransızca | fr | byT5 UTF-8 byte encoder |
| İtalyanca | it | byT5 UTF-8 byte encoder |
| Vietnamca | vi | byT5 UTF-8 byte encoder |
| Hintçe | hi | Devanagari codepoint araması + last-wins alt sözlük |
| Mandarin Çincesi | zh | NLTokenizer(.simplifiedChinese) kelime parçalama + Apple .mandarinToLatin + paket içi pinyin → IPA sözlüğü + #N ton işaretleri |
| Japonca | ja | CFStringTokenizer kanji okuma + NFC korumalı dakuten + heiban perde işaretleri + edat/selamlama geçersiz kılmaları |
Paylaşılan 2360 girişli sözlük, her dilin alt tokenizer'ını uçtan uca dil başına bir offset ile birleştirir (MagpieSubVocab'da kayıtlıdır). Text-embedding, sözlüğün ötesinde BOS / EOS için iki ek satır ekler; her giriş dizisine eos_id = 2361 eklenir.
Hazır konuşmacılar
Checkpoint, her AR çözümlemenin önekinde kullanılan beş konuşmacı bağlamı (her biri 110 frame × 768 dim) gömer. Konuşmacı kimliği dokuz dilin tamamında tutarlıdır.
| Index | CLI adı | Kimlik |
|---|---|---|
| 0 | sofia | Sofia (varsayılan) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Model varyantları
| Varyant | Disk | RAM (yükleme + çözümleme) | HuggingFace |
|---|---|---|---|
| INT4 (varsayılan) | ~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 |
Her iki paket de MLX flat affine niceleme (mlx_affine_flat, grup boyutu 64) kullanır ve yükleme sırasında FP32'ye dequantize edilir — çalışma zamanı aktivasyonları tam hassasiyettedir. Bu model için INT4, INT8'den işitsel olarak ayırt edilemez; depolama alanınız bol değilse INT4'ü seçin.
CLI kullanımı
# İngilizce, greedy çözümleme
speech speak "Hello, world." --engine magpie --magpie-speaker aria \
--magpie-temperature 0 -o out.wav
# İspanyolca (9 dilden herhangi biri — --language ile seçin)
speech speak "Hola, mundo." --engine magpie --language es \
--magpie-speaker aria -o out.wav
# Japonca — stokastik çözümleme gerekir (greedy ilk öbekte takılır)
speech speak "こんにちは世界、これは音声合成システムです。" \
--engine magpie --language ja --magpie-temperature 0.6 \
--magpie-top-k 80 --seed 42 -o out.wav
# Çalma ile streaming sentez
speech speak "Streaming test" --engine magpie --stream --play
# 5 hazır konuşmacıyı listele
speech speak --engine magpie --list-speakers
# Önceden fonemleştirilmiş IPA, dil başına G2P'yi atlar
speech speak "həˈloʊ" --engine magpie --magpie-prephonemized -o out.wav
Seçenekler
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
--magpie-variant | int4 | Niceleme varyantı: int4 veya int8 |
--magpie-speaker | sofia | Hazır konuşmacı: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Örnekleme sıcaklığı (0 = greedy) |
--magpie-top-k | 80 | Örnekleme için top-k filtresi |
--magpie-max-frames | 500 | Codec frame'leri için sert üst sınır (~23 s) |
--magpie-min-frames | 4 | EOS'a izin verilmeden önce minimum frame sayısı |
--magpie-prephonemized | off | Girişi IPA / fonem akışı olarak değerlendir; dil başına G2P'yi atla |
--language | english | Dile özgü tokenizer pipeline'ını seçer |
--stream | off | Tek bir WAV yerine AsyncStream<AudioChunk> yay |
--seed | — | Tekrar edilebilir Gumbel örnekleme |
Tek bir kelimeden uzun Japonca girişler stokastik çözümleme gerektirir (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 NeMo'nun referans testini yansıtır). Greedy ilk öbekte takılır çünkü heiban perde-vurgu sezgisi kelime başına gerçekten sapar.
Ses klonlama — desteklenmiyor
Magpie'da modelde zero-shot konuşmacı koşullandırması yoktur; pakette yalnızca 5 hazır kimlik bulunur. CLI, paylaşılan --voice-sample, --speaker ve --instruct bayraklarını, kullanıcıları --magpie-speaker bayrağına veya klonlamayı destekleyen motorlara (Qwen3-TTS Base, CosyVoice3, VoxCPM2) yönlendiren eylem alınabilir bir hatayla reddeder.
Performans (M4 Pro)
| Ayar | Ses | Duvar | RTF |
|---|---|---|---|
| Batch, INT4, greedy, kısa prompt | 2,8 s | 0,88 s | 0,32 |
| Batch, INT4, greedy, cümle | 5,8 s | 1,35 s | 0,23 |
| Batch, INT4, sampled, 23 s çıktı | 23 s | 5,6 s | 0,24 |
| Streaming, INT4, sampled | 23 s | 21,6 s | 0,93 |
Streaming modunda ilk paket gecikmesi, model yüklendikten sonra ≈120 ms'dir. Streaming RTF daha yüksektir çünkü codec her chunk yayılışında tüm kod tamponu üzerinde yeniden çağrılır (gelecekteki bir revizyon codec durumunu cache'leyebilir).
Swift API
import MagpieTTS
let model = try await MagpieTTS.fromPretrained(variant: .int4)
// Batch sentez (en/es/de/fr/it/vi/hi/zh — greedy çalışır)
let audio = try model.synthesize(
text: "Hello, world.",
speaker: .aria,
language: .english,
params: MagpieTTSParams(temperature: 0, topK: 1, maxSteps: 500))
// Japonca — stokastik örnekleme kullan
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 22,05 kHz mono Float32'dir
}
CoreML backend (--engine magpie-coreml)
MLX paketinin yanında Magpie bir CoreML paketi de sunar (aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8). Dört .mlmodelc paketi — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder — ANE / GPU üzerinde çalışır; Swift tarafındaki bir FSQ inverse, örneklenmiş kodları codec'in tükettiği 32-dim latent'lere dönüştürür.
# 8 dil (Japonca yok), 5 hazır konuşmacı
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 otomatik olarak MLX backend'e yönlenir (stderr notu)
speech speak "こんにちは" --engine magpie-coreml --language ja -o ja.wav
--engine magpie'a karşı uyarılar:
- Bugün hibrit pipeline. 1 katmanlı LocalTransformer (NeMo'nun eğittiği gerçek codebook örnekleme başlığı) ve 8 audio embedding tablosu CoreML paketinin içinde gönderilmez. İlk sentezde CoreML motoru her iki parçayı çalıştırmak için MLX INT4 paketini lazy-load eder. ASR gidiş-dönüşü MLX backend ile bit bit aynıdır; fark, bu motorun MLX paketini de yüklemesidir. Yalnızca ANE iOS dağıtımı için saf CoreML yolu, paketin
local_transformer/*.npy+audio_embedding_*.npyve bir Swift Accelerate LT içermesini gerektirir (takip edilen iş). - Streaming yok.
nanocodec_decoder.mlmodelcsabit 64 frame'lik pencere ile trace edilmiştir. Daha uzun dizileri içeride parçalıyoruz, ancak chunk sınırlarında yayınlasaydık ilk paket gecikmesi ~3 s olurdu.--streameylem alınabilir bir hatayla reddedilir. - Japonca tokenizer yok. CoreML paketi henüz JA tokenizer JSON'larını yayımlamıyor. Bu motorla
--language jaotomatik olarak MLX backend'e geri döner.
Konuşmacı sıralaması CoreML paketinin speaker_info.json dosyasıyla eşleşir (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — MLX'ten farklı) ve konuşmacı enum'ı içeride eşlendiği için CLI adları her iki motorda da çalışır.
Uygulama notları
NeMo tarzı çok dilli TTS'yi taşıyorsanız bilinmeye değer üç hata:
- FSQ floor division — MLX-swift'in
/operatörü gerçek bölmedir (mlx_divide); NeMo'nun FSQ inverse'i Python'un//'sini kullanır.MLX.floorDivide(...)kullanın, aksi takdirde her FSQ slot'u kesirli offset'lere çözümlenir ve codec sesi bulanıklaştırır. - Alt sözlük offset'leri — NeMo'nun
AggregatedTTSTokenizer'ı dil başına sözlükleri offset'lerle birleştirir. Saf bir global ilk-rastlama haritası her zaman İngilizce bölgesine düşer ve diğer diller için anlamsız ses üretir. - Hintçe last-wins dedup —
HindiCharsTokenizeryinelenen Devanagari girdileri yayar (CHARSET, PUNCT_LIST ile çakışır). Python'un{l: i for i, l in enumerate(tokens)}dict-comp'u son atamayı tutar; bunu yansıtın, ilk-rastlamayı değil.
Üç düzeltmenin tümü Swift modülünde satır içi belgelenmiştir.
Kaynak
- Üst akış ağırlıkları: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Makale: NanoCodec: Towards High-Quality Ultra Fast Speech LLM Inference (2025)
- Referans CoreML port: FluidInference/mobius
- Swift modülleri: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- CoreML paketi: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Lisans
- Model ağırlıkları: NVIDIA Open Model License (ticari kullanım izinlidir; ayrıntılar için HuggingFace sayfasındaki PDF bağlantısına bakın)
- Swift port + paket içi IPA / pinyin sözlükleri: üst akış NeMo ile aynı (sözlükler için Apache 2.0, model için NVIDIA OML)