Maskinoversettelse · Engelsk original
Magpie-TTS Flerspråklig
NVIDIA Magpie-TTS Multilingual 357M i Swift på Apple Silicon — en autoregressiv multi-kodebok tekst-til-speech-modell over NeMos 22.05 kHz Nano-Codec. Ni språk (engelsk, spansk, fransk, italiensk, italiensk, vietnamesisk, hindi, mandarin kinesisk, japansk) med fem bakte høyttaleridentiteter. Sendt quantized på INT4 (~247 MB) eller INT8 (~411 MB). Streaming-ready, ~120 ms første-packet latens.
Magpie er det riktige valget når du trenger en enkelt liten pakke som snakker ni språk med en konsistent stemme. De fem bakte høyttalerne forblir identitetsstabile på tvers av språk - nyttig for flerspråklige assistenter, utdanningsprogrammer eller audiobook-narrasjon med kode-switching. For null-shot stemmekloning bruk CosyVoice3, Qwen3-TTS Base, eller VoxCPM2 i stedet.
Arkitektur
Magpie er en 4-bunden MLX rørledning: tekstkoder → krysssettende dekoder → LocalTransformer kodebokhode → Causal HiFi-GAN lydkodek. Buntene deler dekoder vekter mellom forhåndsfylling og trinnoppføringspunkter for å matche oppstrøms FluidInferences CoreML layout.
| Stage | Modul | Detaljer |
|---|---|---|
| 1. Tokenisering | MagpieTokenizer | Per-språk G2P (IPA dict / byT5 bytes / pinyin / katakana), delt 2360-token vokab med per-tokenizer offsets, alltid append EOS |
| 2. Tekstkoder | MagpieTextEncoder | 6 Årsak Transformer lag, d=768, k=3 konv FFN |
| 3. Destillert prefyll | MagpieDecoder | 12 årsakslag med tverrvarsel. Frø 110-rammebakt høyttaler sammenheng + BOS inn i KV-bufferen. |
| 4. Lokaltransformer | MagpieLocalTransformer | 1-lags kodebok AR-hode, d=256. Prøver 8 kodebøker per ramme sekvensielt gitt dekoderen skjult. |
| 5. Dehydreringstrinn | MagpieDecoder | Et AR-trinn per ramme til EOS eller 500-trinnshette (~23 s). |
| 6. NanoCodec | MagpieNanoCodec | FSQ invers → årsak HiFi-GAN → 22.05 kHz mono bølgeform. |
Språk og G2P
Alle ni språk rundt gjennom Qwen3-ASR i SDK's testMultilingualRoundTrip. Hver får en skreddersydd rørledning:
| Språk | Kode | G2P rørledning |
|---|---|---|
| Engelsk | en | CMU IPA dikt (125 k oppføringer, pakket) |
| Spansk | es | Spansk IPA dikt (bundet) |
| Tysk | de | Tysk IPA dikt (bundet) |
| fransk | fr | byT5 UTF-8 bytekoder |
| Italiensk | it | byT5 UTF-8 bytekoder |
| Vietnamesisk | vi | byT5 UTF-8 bytekoder |
| Hindi | hi | Devanagari kodepunkt oppslag + siste-wins sub-vocab |
| Mandarin kinesisk | zh | NLTokenizer(.simplifiedChinese) ord seg + Apple .mandarinToLatin + bundet pinyin → IPA dikt + #N tone markører |
| Japansk | ja | CFStringTokenizer kanji lesing + NFC-bevart dakuten + Heiban pitchmarkører + partikkel/utgrening overstyr |
Den delte 2360-entry vocab konkatenerer hvert språks undertokeniser end-to-end med en per-language offset (innspilt i MagpieSubVocab). Tekstinnbyggingen legger til to ekstra rader forbi vocab for BOS / EOS; eos_id = 2361 er lagt til i hver inngangssekvens.
Baket høyttalere
Checkpointet inneslutter fem høyttalerkontekster (110 rammer × 768 dim hver) som brukes som prefiks for hver AR-dekode. Høyttaleridentitet er konsistent på alle ni språk.
| Indeks | CLI-navn | Identifikasjon |
|---|---|---|
| 0 | sofia | Sofia (standard) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo |
| 4 | john | John Van Stan |
Modell Varianter
| Variant | Disken | RAM (last + dekode) | 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 |
Begge pakkene bruker MLX flat affinisering (mlx_affine_flat, gruppestørrelse 64) og dekvantisere til FP32 på lastetid — kjøretid aktiveringer er full presisjon. INT4 er lydløst uunngåelig fra INT8 for denne modellen; velg INT4 med mindre du har lagring å spare.
CLI bruk
# 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
Alternativer
| Mulighet | Standard | Beskrivelse |
|---|---|---|
--magpie-variant | int4 | Kvantitiseringsvariant: int4 eller int8 |
--magpie-speaker | sofia | Baket høyttaler: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Prøvetemperatur (0 = grådig) |
--magpie-top-k | 80 | Top-k-filter for prøvetaking |
--magpie-max-frames | 500 | Hard cap på kodek rammer (~23 s) |
--magpie-min-frames | 4 | Minimumsrammer før EOS tillates |
--magpie-prephonemized | av | Behandle inngang som IPA / fonemstrøm; hoppe over per-språk G2P |
--language | english | Velger per-språk tokeniser-rørledningen |
--stream | av | Emit AsyncStream<AudioChunk> i stedet for en enkelt WAV |
--seed | — | Reproduserbar Gumbel prøvetaking |
Japanske innganger lengre enn et enkelt ord trenger stokastisk dekoding (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 speiler NeMos referansetest). Greedy blir fast på den første frasen fordi den heiban pitch-accent heuristic avviker fra per-word sannhet.
Stemmekloning - ikke støttet
Magpie har ingen null-shot høyttaler conditioning i modellen; bare 5 bakte identiteter skip i bundten. CLI avviser den delte --voice-sample, --speaker, og --instruct flagg med en handlingsbar feil som peker brukere på --magpie-speaker flagg eller motorer som støtter kloning (Qwen3-TTS Base, CosyVoice3, VoxCPM2).
Ytelse (M4 Pro)
| Innstilling | Audio | Vegg | RTF |
|---|---|---|---|
| Batch, INT4, grådig, kort spørring | 2.8 s | 0.88 s | 0.32 |
| Batch, INT4, grådig, setning | 5.8 s | 1.35 s | 0.23 |
| Batch, INT4, sample, 23 s utgang | 23 s | 5,6 s | 0.24 |
| Streaming, INT4, prøvespilling | 23 s | 21,6 s | 0.93 |
Første pakke latens i streaming-modus er -120 ms etter modellbelastning. Strømming RTF er høyere fordi kodeken gjeninnkalles på full kodebuffer ved hver biteutslipp (en fremtidig revisjon kan cache codec-tilstand).
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 motor (--engine magpie-coreml)
I tillegg til MLX bunten, sender Magpie en CoreML pakke (aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8). Fire .mlmodelc pakker — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder - kjører på ANE / GPU; en Swift-side FSQ invers forvandler prøvekoder til 32-dim latenter codecen bruker.
# 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
Kaveater vs --engine magpie:
- Hybrid pipeline i dag. Den 1-lag LocalTransformer (den faktiske kodebok prøvetakingshode NeMo tog) og 8 lydinnbyggingstabeller sendes ikke inne i CoreML bunt. Ved første syntese CoreML motor lat-laster den MLX INT4 Bunt å kjøre begge deler. ASR Rundtur er bit-for-bit identisk med MLX motor; forskjellen er at denne motoren trekker i MLX En ren pakke også. CoreML Vei for kun ANE iOS implementasjon trenger bunten til skipet
local_transformer/*.npy+audio_embedding_*.npyog en Swift akselererer LT (sporet oppfølging). - Ingen streaming.
nanocodec_decoder.mlmodelcspores i et fast 64-rammevindu. Vi deler lengre sekvenser internt, men førstepakke latens ville være ~ 3 s hvis vi sender ut ved bitgrenser.--streamblir avvist med en handlingsfeil. - Ingen japansk tokenizer. Den CoreML bunten sender ikke JA-tokenizer JSONs ennå.
--language jamed denne motoren auto-faller-tilbake til MLX backend.
Høyttaler bestilling samsvarer med CoreML buntens speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo - forskjellig fra MLX), og høyttalerens enum-kart internt slik at CLI-navnene fungerer for begge motorene.
Implementasjonsnotater
Tre feil verdt å vite om hvis du porterer NeMo-stil flerspråklig TTS:
- FSQ gulvdeling — MLX-swifts
/Ekte divisjon (mlx_divide); NeMos FSQ inverse bruker Python//. BrukMLX.floorDivide(...)eller hver FSQ slot dekoder til fraksjonelle forskyvninger og kodeken smører lyden. - Sub-vocab forskyvninger - NeMos
AggregatedTTSTokenizerkonkatenerer per språk vokaberer med offset. Et naivt globalt første-omstendighetskart lander alltid i den engelske regionen og produserer nonsenslyd for andre språk. - Hindi last-wins dedup —
HindiCharsTokenizersender ut duplikat Devanagari-oppføringer (CHARSET overlapper PUNCT_LIST). Pythons{l: i for i, l in enumerate(tokens)}dikt-comp holder den siste oppgaven; speil som ikke første gang.
Alle tre rettelser dokumenteres i Swift modul.
Kilde
- Oppstrømsvekt: nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Kodek: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Papir: NanoCodec: Mot høy kvalitet ultra rask tale LLM Inferens (2025)
- Referanse CoreML port: FluidInferens/mobius
- Swift moduler: Magpietts (MLX) + MagpittScoreML (CoreML)
- CoreML bundt: aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit
Lisens
- Modellvekter: NVIDIA Open Model License (kommersiell bruk tillatt; se koblet PDF på HuggingFace siden)
- Swift port + pakket IPA / pinyin ordbøker: samme som oppstrøms NeMo (Apache 2.0 for ordbøker, NVIDIA OML for modellen)