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'a ne zaman uzanılır

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şamaModülDetaylar
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.

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:

DilKodG2P pipeline
İngilizceenCMU IPA sözlüğü (125 k giriş, paket içinde)
İspanyolcaesİspanyolca IPA sözlüğü (paket içinde)
AlmancadeAlmanca IPA sözlüğü (paket içinde)
FransızcafrbyT5 UTF-8 byte encoder
İtalyancaitbyT5 UTF-8 byte encoder
VietnamcavibyT5 UTF-8 byte encoder
HintçehiDevanagari codepoint araması + last-wins alt sözlük
Mandarin ÇincesizhNLTokenizer(.simplifiedChinese) kelime parçalama + Apple .mandarinToLatin + paket içi pinyin → IPA sözlüğü + #N ton işaretleri
JaponcajaCFStringTokenizer 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.

IndexCLI adıKimlik
0sofiaSofia (varsayılan)
1ariaAria
2jasonJason
3leoLeo
4johnJohn Van Stan

Model varyantları

VaryantDiskRAM (yükleme + çözümleme)HuggingFace
INT4 (varsayılan)~247 MB~1,3 GBaufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit
INT8~411 MB~1,6 GBaufklarer/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çenekVarsayılanAçıklama
--magpie-variantint4Niceleme varyantı: int4 veya int8
--magpie-speakersofiaHazır konuşmacı: sofia, aria, jason, leo, john
--magpie-temperature0.6Örnekleme sıcaklığı (0 = greedy)
--magpie-top-k80Örnekleme için top-k filtresi
--magpie-max-frames500Codec frame'leri için sert üst sınır (~23 s)
--magpie-min-frames4EOS'a izin verilmeden önce minimum frame sayısı
--magpie-prephonemizedoffGirişi IPA / fonem akışı olarak değerlendir; dil başına G2P'yi atla
--languageenglishDile özgü tokenizer pipeline'ını seçer
--streamoffTek bir WAV yerine AsyncStream<AudioChunk> yay
--seedTekrar edilebilir Gumbel örnekleme
Japonca örnekleme ipucu

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)

AyarSesDuvarRTF
Batch, INT4, greedy, kısa prompt2,8 s0,88 s0,32
Batch, INT4, greedy, cümle5,8 s1,35 s0,23
Batch, INT4, sampled, 23 s çıktı23 s5,6 s0,24
Streaming, INT4, sampled23 s21,6 s0,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:

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:

Üç düzeltmenin tümü Swift modülünde satır içi belgelenmiştir.

Kaynak

Lisans