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 कब चुनें

जब आपको एक छोटा बंडल चाहिए जो नौ भाषाओं में एक ही आवाज़ से बोले — Magpie सही विकल्प है। पाँच पूर्व-निर्धारित वक्ता सभी भाषाओं में पहचान-स्थिर रहते हैं — बहुभाषी असिस्टेंट, शिक्षा ऐप्स, या कोड-स्विचिंग वाले ऑडियोबुक नैरेशन के लिए उपयोगी। ज़ीरो-शॉट वॉइस क्लोनिंग के लिए CosyVoice3, Qwen3-TTS Base, या VoxCPM2 उपयोग करें।

आर्किटेक्चर

Magpie 4-बंडल MLX पाइपलाइन है: टेक्स्ट एनकोडर → क्रॉस-अटेंशन डिकोडर → LocalTransformer कोडबुक हेड → कॉज़ल HiFi-GAN ऑडियो कोडेक। बंडल prefill और step एंट्री पॉइंट्स के बीच डिकोडर वज़न साझा करते हैं ताकि अपस्ट्रीम FluidInference के CoreML लेआउट के साथ संगतता बनी रहे।

चरणमॉड्यूलविवरण
1. टोकनाइज़ेशनMagpieTokenizerप्रति-भाषा G2P (IPA डिक्शनरी / byT5 बाइट्स / पिनयिन / कटाकाना), साझा 2360-टोकन शब्दावली + प्रति-टोकनाइज़र ऑफ़सेट, हमेशा जोड़ा गया EOS
2. टेक्स्ट एनकोडरMagpieTextEncoder6 कॉज़ल Transformer लेयर, d=768, k=3 conv FFN
3. Decoder prefillMagpieDecoderक्रॉस-अटेंशन के साथ 12 कॉज़ल लेयर। 110-फ्रेम पूर्व-निर्धारित वक्ता संदर्भ + BOS को KV कैश में सीड करता है।
4. LocalTransformerMagpieLocalTransformer1-लेयर कोडबुक AR हेड, d=256। डिकोडर hidden के आधार पर प्रति-फ्रेम 8 कोडबुक क्रमिक रूप से सैंपल करता है।
5. Decoder stepMagpieDecoderEOS या 500-फ्रेम सीमा (~23 स) तक प्रति-फ्रेम एक AR स्टेप।
6. NanoCodecMagpieNanoCodecFSQ इन्वर्स → कॉज़ल HiFi-GAN → 22.05 kHz मोनो वेवफ़ॉर्म।

भाषाएँ और G2P

SDK के testMultilingualRoundTrip में सभी नौ भाषाएँ Qwen3-ASR के माध्यम से राउंड-ट्रिप होती हैं। प्रत्येक की अनुकूलित पाइपलाइन है:

भाषाकोडG2P पाइपलाइन
अंग्रेज़ीenCMU IPA डिक्शनरी (125k प्रविष्टियाँ, बंडल में)
स्पेनिशesस्पेनिश IPA डिक्शनरी (बंडल में)
जर्मनdeजर्मन IPA डिक्शनरी (बंडल में)
फ्रेंचfrbyT5 UTF-8 बाइट एनकोडर
इतालवीitbyT5 UTF-8 बाइट एनकोडर
वियतनामीvibyT5 UTF-8 बाइट एनकोडर
हिंदीhiदेवनागरी कोडपॉइंट लुकअप + last-wins सब-वोकैब
मंदारिनzhNLTokenizer(.simplifiedChinese) शब्द-विभाजन + Apple .mandarinToLatin + बंडल पिनयिन → IPA डिक्शनरी + #N टोन मार्कर
जापानीjaCFStringTokenizer कांजी पठन + NFC-संरक्षित दाकुटेन + heiban पिच मार्कर + कण/अभिवादन ओवरराइड

साझा 2360-टोकन शब्दावली प्रत्येक भाषा के सब-टोकनाइज़र को प्रति-भाषा ऑफ़सेट के साथ जोड़ती है (MagpieSubVocab में रिकॉर्ड)। टेक्स्ट-एम्बेडिंग शब्दावली के बाद BOS/EOS के लिए दो अतिरिक्त पंक्तियाँ जोड़ती है; eos_id = 2361 हर इनपुट अनुक्रम में जोड़ा जाता है।

पूर्व-निर्धारित वक्ता

चेकपॉइंट में पाँच वक्ता संदर्भ एम्बेड हैं (प्रत्येक 110 फ्रेम × 768 आयाम) जो हर AR डिकोड के उपसर्ग के रूप में उपयोग होते हैं। वक्ता पहचान सभी नौ भाषाओं में संगत रहती है।

इंडेक्सCLI नामपहचान
0sofiaSofia (डिफ़ॉल्ट)
1ariaAria
2jasonJason
3leoLeo
4johnJohn Van Stan

मॉडल वेरिएंट

वेरिएंटडिस्कRAM (लोड + डिकोड)HuggingFace
INT4 (डिफ़ॉल्ट)~247 MB~1.3 GBaufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit
INT8~411 MB~1.6 GBaufklarer/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-variantint4क्वांटाइज़ेशन वेरिएंट: int4 या int8
--magpie-speakersofiaपूर्व-निर्धारित वक्ता: sofia, aria, jason, leo, john
--magpie-temperature0.6सैंपलिंग तापमान (0 = ग्रीडी)
--magpie-top-k80सैंपलिंग के लिए Top-k फ़िल्टर
--magpie-max-frames500कोडेक फ्रेम पर सख्त सीमा (~23 स)
--magpie-min-frames4EOS की अनुमति से पहले न्यूनतम फ्रेम
--magpie-prephonemizedबंदइनपुट को IPA/फोनेम स्ट्रीम मानें; प्रति-भाषा G2P छोड़ें
--languageenglishप्रति-भाषा टोकनाइज़र चुनें
--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 की तुलना में चेतावनी:

वक्ता का क्रम CoreML बंडल के speaker_info.json से मेल खाता है (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — MLX से अलग); वक्ता एनम आंतरिक रूप से मैप होता है ताकि CLI नाम दोनों इंजनों के लिए काम करें।

कार्यान्वयन नोट्स

NeMo-शैली बहुभाषी TTS पोर्ट करते समय जानने योग्य तीन बग:

तीनों फ़िक्स Swift मॉड्यूल में इनलाइन प्रलेखित हैं।

स्रोत

लाइसेंस