Awtomatikong salin · Orihinal sa Ingles
Magpie-TTS Multilingual
NVIDIA Magpie-TTS Multilingual 357M sa loob Swift tungkol sa Apple Silicon – isang awtoregresibong multi-codebook na teksto-to-speech na modelo sa ibabaw ng NeMo's 22.05 KHz Nano-Codec. Siyam na wika (Ingles, Kastila, Aleman, Pranses, Italyano, Vietnamese, Hindi, Mandarin Intsik, Hapones) na may limang hinurnong tagapagsalita. INT4 (EX247 MB) o INT8 (Axi411 MB). Streaming-handa, i120 mis first-packet latency.
Ang Magpie ang tamang pili kapag kailangan mo ang isang maliit na bungkos na nagsasalita ng siyam na wika na may di-nagbabagong boses.Ang limang hinurnong tagapagsalita ay nananatiling pagkakakilanlan-stable sa mga wika – kapaki-pakinabang sa mga katulong na may iba't ibang wika, mga app ng edukasyon, o audiobook relation na may code-switching. para sa sero-shot voice cloning gamit ang mga ap. CosyVoice3, Qwen3-TTS Base, o VoxCPM2 sa halip.
Arkitektura
Ang Magpie ay isang 4-bundle MLX pipeline: text reciever → cross-tension decoder → LocalTransformand codebook head → Causal HiFi-GAN audio codec. Ang mga bungkos ay nagbabahagi ng mga decoder weight sa pagitan ng prefill at step ent points upang itugma ang ranid Fluid Inference's CoreML direcle.
| Bagsag | Module | Mga Detalye |
|---|---|---|
| Paggising 1 | Magpie Tonkenizer | Per-wika G2P (IPA dict / byT5 bytes / pinyin / katanakna), ibinahagi ang 2360-token vocab na may per-tokenizer offsets, laging-append na EOS |
| 2. Tagapag - ingat ng Teksto | MagpieTextEncoder | 6 mga patong na causal Transformer, d=768, k=3 conv FFN |
| 3. Kumpleto ang decoder | Magpie Decoder | 12 causal layers na may cross-tension. Binhi ang 110-frame hinurno speaker konteksto + BOS sa loob ng KV cache. |
| 4. | MagpieLokalTransilyo | 1-layer codebook AR head, d=256. Samples ang 8 codebooks kada frame sequentially ibinigay ang decoder nakatago. |
| 5. hakbang sa pag - aalis ng hangin | Magpie Decoder | Isang hakbang kada frame ng AR hanggang EOS o 500-frame cap (if23 s). |
| 6. | MagpieNanoCodec | FSQ inverse → causal HiFi-GAN → 22.05 kHz mono waveform. |
Mga wika at G2P
Ang lahat ng siyam na wika round-trip sa Qwen3-ASR sa SDK's testMultilingualRoundTrip. Ang bawat isa ay nakakakuha ng isang naka-angkop na tubo:
| Wika | Kodigo | G2P pipeline |
|---|---|---|
| Tagalog | en | CMU IPA dict (125 kcript, bunde) |
| Kastila | es | Kastilang IPA dict (binabaybay) |
| Aleman | de | Alemang IPA dict (ihinala) |
| Pranses | fr | byT5 UTF-8 byte regulator |
| Italyano | it | byT5 UTF-8 byte regulator |
| Vietnamese | vi | byT5 UTF-8 byte regulator |
| Hindi | hi | Devanagari codepoint + huling-wins sub-vocab |
| Tsinong Mandarin | zh | NLTokenizer(.simplifiedChinese) salitang seg + Apple .mandarinToLatin + nakabubnilyong pinyin → IPA ict + #N tone markers |
| Hapones | ja | CFStringTokenizer kanji na nagbabasa ng + NFC-invested dakuten + heiban pitch markers + particle/greeting surges |
Ang kabahaging 2360-entry vocab concates ng bawat wika ang sub-tokeniser end-to-end na may per-wika offset (nakasulat sa MagpieSubVocab). Ang teksto-embeding ay nagdadagdag ng dalawang ekstrang hanay na lampas sa vocab para sa BOS / EOS; eos_id = 2361 ay isang appended sa bawat pagkakasunud-sunod.
Mga Mangusap na May Bakuti
Ang checkpoint embeds limang kontekstong speaker (110 frames × 768 mark bawat isa) na ginagamit bilang unlapi ng bawat AR decode.Ang speaker identity ay hindi nagbabago sa ibayo ng lahat ng siyam na wika.
| Indise | Pangalan ng CLI | Pagkakakilanlan |
|---|---|---|
| 0 | sofia | Sofia (pagbagsak) |
| 1 | aria | Aria |
| 2 | jason | Si Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Modelong mga Variante
| Kaurian | Disk | RAM (nakakarga + decode) | HuggingFace |
|---|---|---|---|
| INT4 (default) | °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 |
Ang parehong mga bungkos ay gumagamit ng MLX flat affine quantiation (pagkakaiba-iba)mlx_affine_flat, grupo sukat 64) at dequantise to FP32 sa oras ng pagkarga – ang mga runtime acceptions ay ganap na prepektura. INT4 ay distansyad mula sa INT8 para sa modelong ito; pumili ng INT4 malibang may imbakan upang makakuha ng ekstra.
Paggamit ng CLI
# English, greedy decoding
speech speak "Hello, world." --engine magpie --magpie-speaker aria \
--magpie-temperature 0 -o out.wav
# Spanish (any of the 9 languages — pick with --language)
speech speak "Hola, mundo." --engine magpie --language es \
--magpie-speaker aria -o out.wav
# Japanese — needs stochastic decoding (greedy gets stuck on first phrase)
speech speak "こんにちは世界、これは音声合成システムです。" \
--engine magpie --language ja --magpie-temperature 0.6 \
--magpie-top-k 80 --seed 42 -o out.wav
# Streaming synthesis with playback
speech speak "Streaming test" --engine magpie --stream --play
# List the 5 baked speakers
speech speak --engine magpie --list-speakers
# Pre-phonemised IPA bypasses the per-language G2P
speech speak "həˈloʊ" --engine magpie --magpie-prephonemized -o out.wav
Mga Mapagpipilian
| Mapagpipilian | Pagkawasak | Paglalarawan |
|---|---|---|
--magpie-variant | int4 | Kakaibang mga salita: int4 o int8 |
--magpie-speaker | sofia | Baked speaker: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Nakapanlulupaypay na temperatura (0 = sakim) |
--magpie-top-k | 80 | Pansalang pang-itaas para sa mga halimbawa |
--magpie-max-frames | 500 | hard cap sa mga balangkas ng codec (imperyo23 s) |
--magpie-min-frames | 4 | Mga balangkas ng Minimum bago pahintulutan ang EOS |
--magpie-prephonemized | off | Treatment input bilang IPA / phoneme stream; dive per-wika G2P |
--language | english | Pipiin ang per-wikang toliser pipeline |
--stream | off | Emit AsyncStream<AudioChunk> sa halip na nag-iisang WAV |
--seed | — | Kapani - paniwalang mga Halimbawa ng Gumbel |
Ang mga input na Hapones na mas mahaba kaysa sa isang salita ay nangangailangan ng stochastic decoding (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 salamin ng reperensiyang pagsubok ng NeMo).Ang kasakiman ay naiipit sa unang parirala dahil ang heiban pitch-accent heuristic ay lumilihis sa per-word na katotohanan.
Boses cloning — hindi suportado
Si Magpie ay walang zero-shot speaker conditioning sa modelo; tanging ang 5 na hinde na crew ship sa brock.Ang CLI ay itinatakwil ang pinagsasaluhan. --voice-sample, --speaker, at --instruct mga bandilang may mali na maaaring itutok sa mga gumagamit --magpie-speaker bandila o ang mga makina na sumusuporta sa cloning (mga makina na sumusuporta ritoQwen3-TTS Base, CosyVoice3, VoxCPM2).
Performance (M4 Pro)
| Pagtatakda | Audio | Pader | RTF |
|---|---|---|---|
| Batch, INT4, sakim, maikling hakbang | 2.8 s | 0.88 s | 0.32 |
| Batch, INT4, sakim, na pangungusap | 5.8 s | 1.35 s | 0.23 |
| Batch, INT4, sampol, 23 s output | 23 s | 5.6 s | 0.24 |
| Pag - iimbak, INT4, tikman | 23 s | 21.6 s | 0.93 |
Unang-packet latency sa streaming mode ay if.120 Mga m pagkatapos ng modelong karga. RTF ay mas mataas dahil ang codec ay re-invoked sa buong code buffer sa bawat fraget emission (ang isang hinaharap na rebisyon ay maaaring magkaroon ng cache codec state).
Swift API
import MagpieTTS
let model = try await MagpieTTS.fromPretrained(variant: .int4)
// Batch synthesis (en/es/de/fr/it/vi/hi/zh — greedy works)
let audio = try model.synthesize(
text: "Hello, world.",
speaker: .aria,
language: .english,
params: MagpieTTSParams(temperature: 0, topK: 1, maxSteps: 500))
// Japanese — use stochastic sampling
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 is 22.05 kHz mono Float32
}
CoreML backend (--engine magpie-coreml)
Sa tabi ng bungkos ng MLX, ang Magpie ay nagpapadala ng isang CoreML brock (build na ZXQXZ) Aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, EX342 MB INT8). .mlmodelc mga pakete — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder – run on ANE / GPU; isang Swift-side FSQ inverse ang gumagawa sa sampol na mga code na maging 32-dim na latents ang codec na nakukunsumo.
# 8 languages (no Japanese), 5 baked speakers
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 auto-routes to the MLX backend (stderr note)
speech speak "こんにちは" --engine magpie-coreml --language ja -o ja.wav
Mga vs v sa Caveat --engine magpie:
- Hybrid pipeline ngayon. Ang 1-layer LocalTransformer (ang aktuwal na codebook na halimbawa ng mga treng patungo sa NeMo) at ang mga treng NeMo 8 Hindi ipinadadala sa loob ng mga mesang may audio embending CoreML Sa unang synthesis CoreML makina tamad-based ang MLX INT4 na magpatakbo ng dalawang piraso. ASR round-trip ay bit-for-bit na katulad ng sa MLX backend; ang pagkakaiba ay na hinihila ng makina ang makina MLX Talaksan din. CoreML Pathway papuntang ANE-lamang iOS Kailangang ilagay sa barko ang bungkos
local_transformer/*.npy+audio_embedding_*.npyat isang Swift Accelerate LT (pinagbabawalang kasunod-up). - Walang humuhugos.
nanocodec_decoder.mlmodelcay natunton sa isang nakapirmeng 64-frame window.Duget mas mahabang sequences internally, ngunit ang first-packet latency ay `3 s kung tayo ay naglalabas sa mga hangganan ng crux.--streamay tinatanggihan sa pamamagitan ng isang pagkakamaling maaaring gawin. - Walang Hapones na sapatero. Ang bungkos ng CoreML ay hindi pa barkong JA tokenizer JSONs.
--language jakasama ang engine auto-falls-back to the MLX backend.
Ang speaker ordering ay tumutugma sa CoreML brock's speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — iba sa MLX), at ang tagapagsalitang enum para sa mga internasyunal na mapa kaya't ang CLI para sa parehong makina.
Mga nota ng pag - iihaw
Tatlong bugs na karapat - dapat malaman kung ikaw ay nag-aanunsyo ng NeMo-style languagesword TTS:
- Paghati ng sahig ng FSQ — MLX-Sibád'
/tunay na pagkakabaha - bahagi (mlx_divide); Ang FSQ inverse ng NeMo ay gumagamit ng Python//. GamitinMLX.floorDivide(...)o bawat FSQ slot decodes hanggang sa mga fractional offset at ang codec ay nagdurulot sa audio. - Mga Sub-vocab offset — Ang kay NeMo
AggregatedTTSTokenizerAng mga concate per-gage vocab na may offsets. isang walang muwang na global first-occurrence map ay palaging naghahanggan sa rehiyong Ingles at gumagawa ng walang saysay audio para sa ibang mga wika. - Hindi huling-wins dedup —
HindiCharsTokenizerAng mga release ay kumokopya sa Devanagari entry (CARSET coups PUNCT_LIST). Python'{l: i for i, l in enumerate(tokens)}Ang dict-comp ang nagpapanatili ng huling atas; salamin na, hindi ang unang-occurrence.
Ang lahat ng tatlong setting ay dokumentadong nasa loob ng talaan Swift module.
Pinagmumulan
- Itaas na mga pabigat: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Kodigo: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Papel: NanoCodec: Forwards High-Quality Ultra Fast Speak LLM Inference (2025)
- Reference CoreML daungan: Fluid Inference/mobius
- Swift module: MGA MagpieTT (MLX) + MagpieTTSCOREML (CoreML)
- CoreML brock: Aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Lisensiya
- Modelong mga pabigat: NVIDIA Open Model License (inaprubahang gamitin; tingnan ang kaugnay na PDF sa HuggingFace page)
- Swift port + binigay na IPA / pinyin na mga diksiyunaryo: katulad din ng pasalungat sa NeMo (Apache 2.0 para sa mga diksiyunaryo, NVIDIA OML para sa modelo)