Magpie-TTS Multilingual
Apple Silicon पर NVIDIA Magpie-TTS Multilingual 357M का Swift पोर्ट — NeMo के 22.05 kHz Nano-Codec पर आधारित ऑटोरिग्रेसिव मल्टी-कोडबुक TTS मॉडल। नौ भाषाएँ (अंग्रेज़ी, स्पेनिश, जर्मन, फ्रेंच, इतालवी, वियतनामी, हिंदी, मंदारिन, जापानी) पाँच पूर्व-निर्धारित वक्ता पहचानों के साथ। INT4 (~247 MB) या INT8 (~411 MB) में क्वांटाइज़्ड। स्ट्रीमिंग के लिए तैयार, ~120 ms प्रथम-पैकेट विलंबता।
जब आपको एक छोटा बंडल चाहिए जो नौ भाषाओं में एक ही आवाज़ से बोले — Magpie सही विकल्प है। पाँच पूर्व-निर्धारित वक्ता सभी भाषाओं में पहचान-स्थिर रहते हैं — बहुभाषी असिस्टेंट, शिक्षा ऐप्स, या कोड-स्विचिंग वाले ऑडियोबुक नैरेशन के लिए उपयोगी। ज़ीरो-शॉट वॉइस क्लोनिंग के लिए CosyVoice3, Qwen3-TTS Base, या VoxCPM2 उपयोग करें।
आर्किटेक्चर
Magpie 4-बंडल MLX पाइपलाइन है: टेक्स्ट एनकोडर → क्रॉस-अटेंशन डिकोडर → LocalTransformer कोडबुक हेड → कॉज़ल HiFi-GAN ऑडियो कोडेक। बंडल prefill और step एंट्री पॉइंट्स के बीच डिकोडर वज़न साझा करते हैं ताकि अपस्ट्रीम FluidInference के CoreML लेआउट के साथ संगतता बनी रहे।
| चरण | मॉड्यूल | विवरण |
|---|---|---|
| 1. टोकनाइज़ेशन | MagpieTokenizer | प्रति-भाषा G2P (IPA डिक्शनरी / byT5 बाइट्स / पिनयिन / कटाकाना), साझा 2360-टोकन शब्दावली + प्रति-टोकनाइज़र ऑफ़सेट, हमेशा जोड़ा गया EOS |
| 2. टेक्स्ट एनकोडर | MagpieTextEncoder | 6 कॉज़ल Transformer लेयर, d=768, k=3 conv FFN |
| 3. Decoder prefill | MagpieDecoder | क्रॉस-अटेंशन के साथ 12 कॉज़ल लेयर। 110-फ्रेम पूर्व-निर्धारित वक्ता संदर्भ + BOS को KV कैश में सीड करता है। |
| 4. LocalTransformer | MagpieLocalTransformer | 1-लेयर कोडबुक AR हेड, d=256। डिकोडर hidden के आधार पर प्रति-फ्रेम 8 कोडबुक क्रमिक रूप से सैंपल करता है। |
| 5. Decoder step | MagpieDecoder | EOS या 500-फ्रेम सीमा (~23 स) तक प्रति-फ्रेम एक AR स्टेप। |
| 6. NanoCodec | MagpieNanoCodec | FSQ इन्वर्स → कॉज़ल HiFi-GAN → 22.05 kHz मोनो वेवफ़ॉर्म। |
भाषाएँ और G2P
SDK के testMultilingualRoundTrip में सभी नौ भाषाएँ Qwen3-ASR के माध्यम से राउंड-ट्रिप होती हैं। प्रत्येक की अनुकूलित पाइपलाइन है:
| भाषा | कोड | G2P पाइपलाइन |
|---|---|---|
| अंग्रेज़ी | en | CMU IPA डिक्शनरी (125k प्रविष्टियाँ, बंडल में) |
| स्पेनिश | es | स्पेनिश IPA डिक्शनरी (बंडल में) |
| जर्मन | de | जर्मन IPA डिक्शनरी (बंडल में) |
| फ्रेंच | fr | byT5 UTF-8 बाइट एनकोडर |
| इतालवी | it | byT5 UTF-8 बाइट एनकोडर |
| वियतनामी | vi | byT5 UTF-8 बाइट एनकोडर |
| हिंदी | hi | देवनागरी कोडपॉइंट लुकअप + last-wins सब-वोकैब |
| मंदारिन | zh | NLTokenizer(.simplifiedChinese) शब्द-विभाजन + Apple .mandarinToLatin + बंडल पिनयिन → IPA डिक्शनरी + #N टोन मार्कर |
| जापानी | ja | CFStringTokenizer कांजी पठन + NFC-संरक्षित दाकुटेन + heiban पिच मार्कर + कण/अभिवादन ओवरराइड |
साझा 2360-टोकन शब्दावली प्रत्येक भाषा के सब-टोकनाइज़र को प्रति-भाषा ऑफ़सेट के साथ जोड़ती है (MagpieSubVocab में रिकॉर्ड)। टेक्स्ट-एम्बेडिंग शब्दावली के बाद BOS/EOS के लिए दो अतिरिक्त पंक्तियाँ जोड़ती है; eos_id = 2361 हर इनपुट अनुक्रम में जोड़ा जाता है।
पूर्व-निर्धारित वक्ता
चेकपॉइंट में पाँच वक्ता संदर्भ एम्बेड हैं (प्रत्येक 110 फ्रेम × 768 आयाम) जो हर AR डिकोड के उपसर्ग के रूप में उपयोग होते हैं। वक्ता पहचान सभी नौ भाषाओं में संगत रहती है।
| इंडेक्स | CLI नाम | पहचान |
|---|---|---|
| 0 | sofia | Sofia (डिफ़ॉल्ट) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
मॉडल वेरिएंट
| वेरिएंट | डिस्क | RAM (लोड + डिकोड) | HuggingFace |
|---|---|---|---|
| INT4 (डिफ़ॉल्ट) | ~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 |
दोनों बंडल MLX flat affine क्वांटाइज़ेशन (mlx_affine_flat, group size 64) उपयोग करते हैं और लोड समय पर FP32 में डीक्वांटाइज़ होते हैं — रनटाइम सक्रियण पूर्ण परिशुद्धता में हैं। INT4 और INT8 इस मॉडल के लिए श्रवण रूप से अप्रभेद्य हैं; जब तक स्टोरेज की कमी न हो INT4 चुनें।
CLI उपयोग
# अंग्रेज़ी, ग्रीडी डिकोडिंग
speech speak "Hello, world." --engine magpie --magpie-speaker aria \
--magpie-temperature 0 -o out.wav
# स्पेनिश (9 भाषाओं में से कोई — --language से चुनें)
speech speak "Hola, mundo." --engine magpie --language es \
--magpie-speaker aria -o out.wav
# जापानी — स्टोकैस्टिक डिकोडिंग चाहिए (ग्रीडी पहले वाक्यांश पर अटक जाती है)
speech speak "こんにちは世界、これは音声合成システムです。" \
--engine magpie --language ja --magpie-temperature 0.6 \
--magpie-top-k 80 --seed 42 -o out.wav
# प्लेबैक के साथ स्ट्रीमिंग सिंथेसिस
speech speak "Streaming test" --engine magpie --stream --play
# 5 पूर्व-निर्धारित वक्ता सूचीबद्ध करें
speech speak --engine magpie --list-speakers
# पूर्व-फोनेमाइज़्ड IPA प्रति-भाषा G2P को बाईपास करता है
speech speak "həˈloʊ" --engine magpie --magpie-prephonemized -o out.wav
विकल्प
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
--magpie-variant | int4 | क्वांटाइज़ेशन वेरिएंट: int4 या int8 |
--magpie-speaker | sofia | पूर्व-निर्धारित वक्ता: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | सैंपलिंग तापमान (0 = ग्रीडी) |
--magpie-top-k | 80 | सैंपलिंग के लिए Top-k फ़िल्टर |
--magpie-max-frames | 500 | कोडेक फ्रेम पर सख्त सीमा (~23 स) |
--magpie-min-frames | 4 | EOS की अनुमति से पहले न्यूनतम फ्रेम |
--magpie-prephonemized | बंद | इनपुट को IPA/फोनेम स्ट्रीम मानें; प्रति-भाषा G2P छोड़ें |
--language | english | प्रति-भाषा टोकनाइज़र चुनें |
--stream | बंद | एकल WAV के बजाय AsyncStream<AudioChunk> उत्सर्जित करें |
--seed | — | पुनरुत्पाद्य Gumbel सैंपलिंग |
एक शब्द से लंबे जापानी इनपुट के लिए स्टोकैस्टिक डिकोडिंग चाहिए (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 NeMo के संदर्भ टेस्ट को दर्शाता है)। ग्रीडी पहले वाक्यांश पर अटक जाती है क्योंकि heiban पिच ह्यूरिस्टिक प्रति-शब्द सत्य से विचलित होता है।
वॉइस क्लोनिंग — समर्थित नहीं
Magpie में मॉडल में ज़ीरो-शॉट वक्ता कंडीशनिंग नहीं है; बंडल में केवल 5 पूर्व-निर्धारित पहचानें हैं। CLI साझा फ़्लैग --voice-sample, --speaker, --instruct को अस्वीकार करती है और एक क्रियाशील त्रुटि देती है जो --magpie-speaker या क्लोनिंग समर्थन वाले इंजनों (Qwen3-TTS Base, CosyVoice3, VoxCPM2) की ओर इंगित करती है।
प्रदर्शन (M4 Pro)
| सेटिंग | ऑडियो | वॉल टाइम | RTF |
|---|---|---|---|
| बैच, INT4, ग्रीडी, छोटा प्रॉम्प्ट | 2.8 स | 0.88 स | 0.32 |
| बैच, INT4, ग्रीडी, वाक्य | 5.8 स | 1.35 स | 0.23 |
| बैच, INT4, सैंपल्ड, 23 स आउटपुट | 23 स | 5.6 स | 0.24 |
| स्ट्रीमिंग, INT4, सैंपल्ड | 23 स | 21.6 स | 0.93 |
स्ट्रीमिंग मोड में मॉडल लोड के बाद प्रथम-पैकेट विलंबता ≈120 ms है। स्ट्रीमिंग RTF अधिक है क्योंकि कोडेक हर चंक उत्सर्जन पर पूर्ण कोड बफ़र पर पुनः चलता है (भविष्य का संस्करण कोडेक स्थिति कैश कर सकता है)।
Swift API
import MagpieTTS
let model = try await MagpieTTS.fromPretrained(variant: .int4)
// बैच सिंथेसिस (en/es/de/fr/it/vi/hi/zh — ग्रीडी काम करता है)
let audio = try model.synthesize(
text: "Hello, world.",
speaker: .aria,
language: .english,
params: MagpieTTSParams(temperature: 0, topK: 1, maxSteps: 500))
// जापानी — स्टोकैस्टिक सैंपलिंग का उपयोग करें
let audioJA = try model.synthesize(
text: "こんにちは世界、これは音声合成システムです。",
speaker: .aria,
language: .japanese,
params: MagpieTTSParams(temperature: 0.6, topK: 80,
maxSteps: 300, seed: 42))
// स्ट्रीमिंग (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 मोनो Float32 है
}
CoreML बैकएंड (--engine magpie-coreml)
MLX बंडल के साथ-साथ, Magpie एक CoreML बंडल भी प्रदान करता है (aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8)। चार .mlmodelc पैकेज — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder — ANE / GPU पर चलते हैं; Swift-साइड FSQ इन्वर्स सैंपल किए गए कोड को कोडेक द्वारा उपयोग किए जाने वाले 32-आयामी लेटेंट्स में बदलता है।
# 8 भाषाएँ (जापानी नहीं), 5 पूर्व-निर्धारित वक्ता
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 स्वचालित रूप से MLX बैकएंड पर रूट होता है (stderr नोट)
speech speak "こんにちは" --engine magpie-coreml --language ja -o ja.wav
--engine magpie की तुलना में चेतावनी:
- आज हाइब्रिड पाइपलाइन। 1-लेयर LocalTransformer (NeMo जो वास्तविक कोडबुक सैंपलिंग हेड प्रशिक्षित करता है) और 8 ऑडियो एम्बेडिंग टेबल CoreML बंडल के अंदर शिप नहीं किए गए हैं। पहली सिंथेसिस पर CoreML इंजन दोनों को चलाने के लिए MLX INT4 बंडल को आलसी रूप से लोड करता है। ASR राउंड-ट्रिप MLX बैकएंड के समान बिट-दर-बिट है; अंतर यह है कि यह इंजन MLX बंडल भी डाउनलोड करता है। ANE-केवल iOS परिनियोजन के लिए शुद्ध CoreML पथ को बंडल द्वारा
local_transformer/*.npy+audio_embedding_*.npyशिप करने और Swift Accelerate LT की आवश्यकता है (फॉलो-अप ट्रैक किया गया)। - स्ट्रीमिंग नहीं।
nanocodec_decoder.mlmodelcको 64-फ्रेम की निश्चित विंडो पर ट्रेस किया गया है। लंबे अनुक्रम आंतरिक रूप से चंक किए जाते हैं, लेकिन यदि हम चंक सीमाओं पर उत्सर्जित करते हैं तो प्रथम-पैकेट विलंबता ~3 सेकंड होगी।--streamकार्रवाई योग्य त्रुटि के साथ अस्वीकार किया जाता है। - जापानी टोकनाइज़र नहीं। CoreML बंडल अभी तक JA टोकनाइज़र JSON शिप नहीं करता है। इस इंजन के साथ
--language jaस्वचालित रूप से MLX बैकएंड पर वापस आ जाता है।
वक्ता का क्रम CoreML बंडल के speaker_info.json से मेल खाता है (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — MLX से अलग); वक्ता एनम आंतरिक रूप से मैप होता है ताकि CLI नाम दोनों इंजनों के लिए काम करें।
कार्यान्वयन नोट्स
NeMo-शैली बहुभाषी TTS पोर्ट करते समय जानने योग्य तीन बग:
- FSQ फ़्लोर डिविज़न — MLX-swift का
/वास्तविक विभाजन है (mlx_divide); NeMo का FSQ इन्वर्स Python//उपयोग करता है।MLX.floorDivide(...)का उपयोग करें, अन्यथा प्रत्येक FSQ स्लॉट भिन्नात्मक ऑफ़सेट में डिकोड होता है और कोडेक ऑडियो को धुंधला करता है। - सब-वोकैब ऑफ़सेट — NeMo का
AggregatedTTSTokenizerभाषा के शब्दकोशों को ऑफ़सेट के साथ जोड़ता है। एक भोला वैश्विक first-occurrence मैप हमेशा अंग्रेज़ी क्षेत्र में पहुँचता है और अन्य भाषाओं के लिए निरर्थक ऑडियो उत्पन्न करता है। - हिंदी last-wins डेडुप —
HindiCharsTokenizerअपने वोकैब के भीतर दोहराव वाली देवनागरी प्रविष्टियाँ उत्सर्जित करता है (CHARSET PUNCT_LIST के साथ ओवरलैप)। Python की{l: i for i, l in enumerate(tokens)}dict-समझ अंतिम असाइनमेंट रखती है; उसी का अनुसरण करें, first-occurrence का उपयोग न करें।
तीनों फ़िक्स Swift मॉड्यूल में इनलाइन प्रलेखित हैं।
स्रोत
- अपस्ट्रीम वज़न: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- कोडेक: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- पेपर: NanoCodec: Towards High-Quality Ultra Fast Speech LLM Inference (2025)
- संदर्भ CoreML पोर्ट: FluidInference/mobius
- Swift मॉड्यूल: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- CoreML बंडल: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
लाइसेंस
- मॉडल वज़न: NVIDIA Open Model License (वाणिज्यिक उपयोग की अनुमति; HuggingFace पृष्ठ देखें)
- Swift पोर्ट + बंडल IPA/पिनयिन डिक्शनरी: अपस्ट्रीम NeMo के समान (डिक्शनरी Apache 2.0, मॉडल NVIDIA OML)