Automatische vertaling · Engels origineel
Magpie-TTS Meertalig
NVIDIA Magpie-TTS Meertalige 357M in Swift op Apple Silicon Een autoregressief multicodeboek tekst-naar-spraakmodel over NeMo's 22.05 kHz Nano-codec. Negen talen (Engels, Spaans, Duits, Frans, Italiaans, Vietnamees, Hindi, Mandarijns Chinees, Japans) met vijf gebakken luidspreker-identiteiten. Verscheept in INT4 (~247 MB) of INT8 (~411 MB). Streaming-ready, ~120 ms first-packet latency.
Magpie is de juiste keuze wanneer je een enkele kleine bundel nodig hebt die negen talen spreekt met een consistente stem. De vijf gebakken luidsprekers blijven identiteitsstabiel in verschillende talen . • nuttig voor meertalige assistenten, onderwijsapps, of audioboekvertelling met code-switching. Voor het klonen van nul-shot voices gebruiken CosyVoice3, Qwen3-TTS Base, of VoxCPM2 in plaats daarvan.
Architectuur
Magpie is een 4-bundel MLX pijplijn: tekstcoder → cross-atttention decoder © LocalTransformer codebook head → Causale HiFi-GAN audiocodec. De bundels delen decodergewichten tussen prefill en stap entrypoints om de upstream FluidInferenties CoreML lay-out aan te passen.
| Fase | Module | Gegevens |
|---|---|---|
| 1. Tokenisatie | MagpieTokenizer | Per taal G2P (IPA dict / byT5 bytes / pinyin / katakana), gedeeld 2360-getoken vocab met per-tokenizer offsets, altijd toegevoegd EOS |
| 2. Tekstcoder | MagpieTextEncoder | 6 causale Transformatorlagen, d=768, k=3 conv FFN |
| 3. Decoder voorvulling | MagpieDecoder | 12 causale lagen met cross-atttention. Zet de 110-frame gebakken luidspreker context + BOS in de KV cache. |
| 4. Lokale Transformer | MagpieLocalTransformer | 1-laags codeboek AR hoofd, d=256. Monsters van de 8 codeboeken per frame achtereenvolgens gegeven de decoder verborgen. |
| 5. Decoder stap | MagpieDecoder | Eén AR stap per frame tot EOS of 500-frame cap (~23 s). |
| 6. Nanocodec | MagpieNanoCodec | FSQ inverse → causaal HiFi-GAN → 22.05 kHz mono waveform. |
Talen en G2P
Alle negen talen round-trip door Qwen3-ASR in de SDK's testMultilingualRoundTrip. Elk krijgt een op maat gemaakte pijplijn:
| Taal | Rubriek | G2P pijpleiding |
|---|---|---|
| Engels | en | CMU IPA dict (125 k inzendingen, gebundeld) |
| Spaans | es | Spaans IPA dict (gebundeld) |
| Duits | de | Duitse IPA-dict (gebundeld) |
| Frans | fr | byT5 UTF-8 byte-encoder |
| Italiaans | it | byT5 UTF-8 byte-encoder |
| Vietnamees | vi | byT5 UTF-8 byte-encoder |
| Hindi | hi | Devanagari codepoint lookup + last-wins sub-vocab |
| Mandarijns Chinees | zh | NLTokenizer(.simplifiedChinese) word seg + Apple .mandarinToLatin + gebundelde pinyin → IPA dick + #N toonmarkeringen |
| Japans | ja | CFStringTokenizer kanji reading + NFC-beserved dakuten + Heiban pitch markers + partikel/groetoverrides |
De gedeelde 2360-entry vocab concateert de sub-tokeniser van elke taal end-to-end met een per-language offset (opgenomen in MagpieSubVocab). De tekst-enmbeding voegt twee extra rijen voorbij de vocab voor BOS / EOS; eos_id = 2361 is toegevoegd aan elke invoerreeks.
Gebakken luidsprekers
Het controlepunt insluit vijf luidsprekercontexten (110 frames × 768 dim elk) gebruikt als het voorvoegsel van elke AR decode. Speaker identiteit is consistent in alle negen talen.
| Index | CLI naam | Identiteit |
|---|---|---|
| 0 | sofia | Sofia (standaard) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Model Varianten
| Variant | Schijf | RAM (load + decoderen) | HuggingFace |
|---|---|---|---|
| INT4 (standaard) | ~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 |
Beide bundels gebruiken MLX platte affiniteitkwantificatie (mlx_affine_flat, groepgrootte 64) en dequantiseren tot FP32 op laadtijd De activeringen van de runtime zijn volledig nauwkeurig. INT4 is hoorbaar niet te onderscheiden van INT8 voor dit model; pick INT4 tenzij u opslag te missen hebt.
CLI-gebruik
# 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
Opties
| Optie | Standaard | Omschrijving |
|---|---|---|
--magpie-variant | int4 | Kwantiseringsvariant: int4 of int8 |
--magpie-speaker | sofia | Gebakken speaker: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Monstertemperatuur (0 = hebzuchtig) |
--magpie-top-k | 80 | Top-k-filter voor bemonstering |
--magpie-max-frames | 500 | Harde dop op codec frames (~23 s) |
--magpie-min-frames | 4 | Minimumframes voor EOS toegestaan |
--magpie-prephonemized | uit | Behandel input als IPA / fome stream; sla per taal G2P over |
--language | english | Kiest de per-language tokeniser pijpleiding |
--stream | uit | Emit AsyncStream<AudioChunk> in plaats van een enkele WAV |
--seed | — | Afwisselbare Gumbel-bemonstering |
Japanse ingangen langer dan een enkel woord hebben stochastische decodering (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 spiegels NeMo's referentietest nodig). Hebzucht raakt vast op de eerste zin omdat de heuristische heuristische Heiban pitch-accent afwijkt van de per-woord waarheid.
Klonen van stemmen wordt niet ondersteund
Magpie heeft geen nul-shot speaker conditionering in het model; alleen de 5 gebakken identiteit schip in de bundel. De CLI verwerpt de gedeelde --voice-sample, --speakeren --instruct vlaggen met een actieerbare fout die gebruikers wijst naar de --magpie-speaker vlag of de motoren die klonen ondersteunen (Qwen3-TTS Base, CosyVoice3, VoxCPM2).
Prestatie (M4 Pro)
| Instellingen | Audio | Muur | RTF |
|---|---|---|---|
| Charge, INT4, hebzuchtig, korte prompt | 2,8 s | 0,88 s | 0.32 |
| Lot, INT4, hebzuchtig, zin | 5,8 s | 1,35 s | 0.23 |
| Charge, INT4, bemonsterd, 23 s uitvoer | 23 s | 5,6 s | 0.24 |
| Streaming, INT4, bemonsterd | 23 s | 21,6 s | 0.93 |
Eerste pakket latency in streaming mode is ≈120 ms na model load. Streaming RTF is hoger omdat de codec opnieuw wordt opgeroepen op de volledige code buffer bij elke brok emissie (een toekomstige revisie kan codec status cache).
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)
Naast de MLX-bundel draagt Magpie een CoreML bundel (aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, 342 MB INT8). .mlmodelc pakketten text_encoder, decoder_prefill, decoder_step, nanocodec_decoder Rennen op ANE / GPU; een Swift-side FSQ inverse verandert de bemonsterde codes in de 32-Dim laat de codec na.
# 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
Caveats vs --engine magpie:
- Hybride pijpleiding vandaag. De 1- Layer LocalTransformer (de eigenlijke codebook bemonsteringskop NeMo treinen) en de 8 audio-inbedding tafels worden niet verzonden binnen de CoreML bundel. Bij de eerste synthese CoreML motor lui-laadt de MLX INT4 bundel om beide stukken te rijden. ASR round-trip is bit-for-bit identiek aan de MLX backend; het verschil is dat deze motor trekt in de MLX Een pure bundel ook. CoreML pad voor AN-alleen iOS inzet moet de bundel naar schip
local_transformer/*.npy+audio_embedding_*.npyen een Swift Accelerate LT (tracked follow-up). - Geen streaming.
nanocodec_decoder.mlmodelcwordt getraceerd in een vast 64-frame venster. We brokken langere sequenties intern, maar first-packet latency zou ~3 s zijn als we uitgezonden aan brok grenzen.--streamwordt afgewezen met een uitvoerbare fout. - Geen Japanse tokensizer. De CoreML bundel verstuurt nog geen JA tokenizer JSONs.
--language jamet deze motor auto-vallen-terug naar de MLX backend.
Bestelling van de luidspreker komt overeen met de CoreML bundel's speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo Anders dan MLX), en de speaker enum kaarten intern, zodat de CLI namen werken voor beide motoren.
Uitvoeringsnota's
Drie bugs die de moeite waard zijn om te weten of je NeMo-stijl meertalig TTS porteert:
- FSQ-vloerverdeling De FSQ-inverse van MLX-swift's
/is de ware scheiding (mlx_divide); NeMo's FSQ inverse gebruikt Python//. GebruikMLX.floorDivide(...)of elke FSQ -sleuf decodeert om breuken te compenseren en de codec uitstrijkt de audio. - Sub-vocab offsets NeMo's
AggregatedTTSTokenizerconcateert per-taal vocabs met offsets. Een naïeve globale kaart van de eerste keer landt altijd in de Engelse regio en produceert onzin audio voor andere talen. - Hindi last-wins dedup —
HindiCharsTokenizerzendt dubbele Devanagari-items uit (CHARSET overlapt PUNCT_LIST). Python's{l: i for i, l in enumerate(tokens)}dict-comp houdt de laatste opdracht; spiegel dat, niet de eerste gebeurtenis.
Alle drie de correcties zijn inline gedocumenteerd in de Swift module.
Bron
- Upstreamgewichten: nvidia/magpie_tts_multilingual_357m (NVIDIA Modellicentie openen)
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Paper: Nanocodec: Naar hoge kwaliteit Ultra snelle spraak LLM Invloed (2025)
- Referentie CoreML poort: FluidInferentie/mobius
- Swift modules: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- CoreML bundel: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Licentie
- Modelgewichten: NVIDIA Open Model Licentie (commercieel gebruik toegestaan; zie gekoppelde PDF op HuggingFace pagina)
- Swift port + gebundeld IPA / pinyin woordenboeken: hetzelfde als upstream NeMo (Apache 2.0 voor de woordenboeken, NVIDIA OML voor het model)