Maskinöversättning · Engelskt original
Magpie-TTS Multilingual
NVIDIA Magpie-TTS Multilingual 357M i Swift på Apple Silicon - en autoregressiv multi-kodbok text-till-tal modell över NeMo 22.05 kHz Nano-Codec. Nio språk (engelska, spanska, tyska, franska, italienska, vietnamesiska, hindi, mandarin kinesiska, japanska) med fem bakade högtalaridentiteter. INT4 (~247 MB) eller INT8 (~411 MB). Streaming-ready, ~ 120 ms första-packet latens.
Magpie är det rätta valet när du behöver en enda liten bunt som talar nio språk med en konsekvent röst. De fem bakade högtalarna stannar identitetsstabila över språk - användbara för flerspråkiga assistenter, utbildningsappar eller ljudboksberättelse med kodväxling. För noll-shot röst kloning användning CosyVoice3, Qwen3-TTS Baseeller VoxCPM2 I stället.
Arkitektur
Magpie är en 4-bundle MLX pipeline: textencoder → cross-attention decoder · LocalTransformer codebook huvud → Causal HiFi-GAN audio codec. Buntarna delar avkodningsvikter mellan prefill och steg ingångspunkter för att matcha uppströms FluidInference CoreML layout.
| Steg | Modul | Detaljer |
|---|---|---|
| 1. Tokenisering | MagpieTokenizer | Per-language G2P (IPA dict / byT5 byte / pinyin / katakana), delade 2360-token vocab med per-tokenizer offsets, alltid-appended EOS |
| 2. Text-kodare | MagpieTextEncoder | 6 orsakssamband Transformer skikt, d=768, k=3 konv FFN |
| 3. Decoder prefill | MagpieDecoder | 12 kausala lager med korsuppmärksamhet. Frön 110-ram bakade högtalarkontexten + BOS i KV-cache. |
| 4. LocalTransformer | MagpieLocalTransformer | 1-skiktskodbok AR-huvudet, d=256. Prover de 8 kodböckerna per ram sekventiellt med tanke på avkodaren dold. |
| 5. Decoder steg | MagpieDecoder | Ett AR steg per ram till EOS eller 500-ram cap (~23 s). |
| 6. NanoCodec | MagpieNanoCodec | FSQ inverse → kausal HiFi-GAN → 22,05 kHz mono vågform. |
Språk och G2P
Alla nio språk rundtur genom Qwen3-ASR i SDK testMultilingualRoundTrip. Varje får en skräddarsydd pipeline:
| Språkspråk | Kodkod | G2P pipeline |
|---|---|---|
| Engelska engelska engelska | en | CMU IPA dikt (125 k poster, buntad) |
| Spanska spanska | es | Spanska IPA dikt (bunden) |
| Tyska tyska | de | Tyska IPA dikt (bunden) |
| Franska franska | fr | byT5 UTF-8 byteskodare |
| Italienska Italien | it | byT5 UTF-8 byteskodare |
| Vietnamesiska | vi | byT5 UTF-8 byteskodare |
| Hindi | hi | Devanagari codepoint lookup + Last-wins sub-vocab |
| Mandarin kinesiska | zh | NLTokenizer(.simplifiedChinese) ord seg + Apple .mandarinToLatin + bundled pinyin → IPA dikt + #N tonmarkörer |
| Japansk Japansk Japan Japansk | ja | CFStringTokenizer kanji läsning + NFC-bevarad dakuten + heiban pitch markörer + partikel / hälsa överrides |
Den delade 2360-entry vocab concatenates varje språkets sub-tokeniser end-to-end med en per-language offset (inspelad i MagpieSubVocab). Text-inbäddningen lägger till två extra rader förbi vokab för BOS / EOS; eos_id = 2361 appended till varje ingångssekvens.
Bakade högtalare
Kontrollpunkten bäddar in fem högtalarsammanhang (110 ramar × 768 dim varje) som används som prefix för varje AR-avkodning. Högtalaridentitet är konsekvent över alla nio språk.
| Index | CLI-namn | identitet |
|---|---|---|
| 0 | sofia | Sofia (default) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Modellvarianter
| Variant | Disk | RAM (belastning + avkodning) | HuggingFace |
|---|---|---|---|
| INT4 (standard) | 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 |
Båda buntarna använder MLX platt affin kvantisering (mlx_affine_flat, gruppstorlek 64) och dequantise till FP32 vid belastningstid - körtidsaktiveringar är full precision. INT4 är audibly indistinguishable från INT8 för den här modellen; pick INT4
CLI Användning
# 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
Alternativ
| Alternativ | Standard | Beskrivning |
|---|---|---|
--magpie-variant | int4 | Kvantiseringsvariant: int4 eller int8 |
--magpie-speaker | sofia | Bakad högtalare: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Provtagningstemperatur (0 = girig) |
--magpie-top-k | 80 | Top-k filter för provtagning |
--magpie-max-frames | 500 | Hårddisk på codec-ramar (~23 s) |
--magpie-min-frames | 4 | Minsta ramar innan EOS tillåts |
--magpie-prephonemized | Off off | Behandla inmatning som IPA / telefonme stream; hoppa per språk G2P |
--language | english | Plockar per-language tokeniser pipeline |
--stream | Off off | Emit AsyncStream<AudioChunk> istället för en enda WAV |
--seed | — | Reproducible Gumbel provtagning |
Japanska ingångar längre än ett enda ord behöver stokastisk avkodning (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 speglar NeMos referenstest). Greedy fastnar på den första frasen eftersom heiban pitch-accent heuristiska avviker från per ord sanning.
Röstkloning - inte stöds
Magpie har ingen noll-shot högtalare konditionering i modellen; endast 5 bakade identitetsskepp i bunten. CLI avvisar den delade --voice-sample, --speakeroch --instruct flaggor med en handlingsbar fel som pekar på användarna på --magpie-speaker flagga eller de motorer som stöder kloning (Qwen3-TTS Base, CosyVoice3, VoxCPM2).
Prestanda (M4 Pro)
| Inställning | Audio | Vägg | RTF |
|---|---|---|---|
| Batch, INT4, girig, kort snabb snabb | 2.8 s | 0,88 s | 0.32 |
| Batch, INT4, girig, mening | 5,8 s | 1,35 s | 0.23 |
| Batch, INT4, provtagen, 23 s output | 23 s | 5,6 s | 0.24 |
| Streaming, INT4, provtagen | 23 s | 21,6 s | 0.93 |
Första-packet latens i streaming läge är ≈ 120 ms efter modellbelastning. Streaming RTF är högre eftersom codec åter åberopas på hela kod bufferten vid varje chunk utsläpp (en framtida revision kan cache codec tillstånd).
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)
Vid sidan av MLX-paketet skickar Magpie ett CoreML paket (ZXQ1 QXZ).aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit342 MB INT8). .mlmodelc Förpackningar - text_encoder, decoder_prefill, decoder_step, nanocodec_decoder - köra på ANE / GPU; en Swift-side FSQ inverse förvandlar de provtagna koderna till 32-dim latens codec konsumerar.
# 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:
- Hybrid pipeline idag. Den som 1-layer LocalTransformer (den faktiska kodeboken provtagning huvud NeMo tåg) och 8 ljudinbäddningsbord skickas inte inuti CoreML bunt. Vid första syntesen CoreML motor lata laster MLX INT4 bunt för att köra båda bitarna. ASR rundtur är bit-för-bit identisk med MLX backend; skillnaden är att denna motor drar i MLX bunt också. en ren CoreML Vägen för ANE-only iOS Utplacering behöver bunten för att skicka
local_transformer/*.npy+audio_embedding_*.npyoch en Swift Accelerate LT (spårad uppföljning). - Ingen streaming.
nanocodec_decoder.mlmodelcspåras vid ett fast 64-ramfönster. Vi chunk längre sekvenser internt, men först-packet latens skulle vara ~3 s om vi sändes vid bitar.--streamavvisas med ett åtgärdsfel. - Ingen japansk tokenizer. Den CoreML bunt inte skicka JA tokenizeer JSONs ännu.
--language jamed denna motor auto-fall-back till MLX backend.
Högtalarbeställning matchar CoreML paketets speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo - skiljer sig från MLX) och högtalaren kartlägger internt så CLI-namnen fungerar för båda motorerna.
Implementeringsanteckningar
Tre buggar som är värda att veta om du portar NeMo-stil flerspråkig TTS:
- FSQ golvdivision MLX-swift's
/är sann division (mlx_divide); NeMos FSQ invers använder Python//AnvändMLX.floorDivide(...)eller varje FSQ slot avkodar till fraktionella kompensationer och codec smears ljudet. - Sub-vocab offsets - NeMos
AggregatedTTSTokenizerconcatenates per-language vocabs with offsets. En naiv global first-occurrence-karta landar alltid i den engelska regionen och producerar nonsensljud för andra språk. - Hindi Last-wins dedup --
HindiCharsTokenizeravger duplicerade Devanagari-poster (CHARSET överlappar PUNCT_LIST). Python{l: i for i, l in enumerate(tokens)}
Alla tre korrigeringar är dokumenterade inline i Swift modul.
Källa
- Uppströms vikter: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Papper: NanoCodec: Mot hög kvalitet Ultra Fast Speech LLM Inference (2025)
- Referens CoreML port: FluidInference/mobius
- Swift moduler: MagpieTTS (MLX) + MagPieTTSCoreML (CoreML)
- CoreML bunt: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Licens
- Modellvikter: NVIDIA Öppen modelllicens (kommersiell användning tillåten; se länkad PDF på sidan HuggingFace)
- Swift port + buntade IPA / pinyin ordböcker: samma som uppströms NeMo (Apache 2.0 för ordböckerna, NVIDIA OML för modellen)