Traduzione automatica · Originale inglese
Magpie-TTS multilingue
NVIDIA Magpie-TTS multilingue 357M in Swift su Apple Silicon — un modello di testo-speech multi-codebook autoregressivo sopra NeMo 22.05 kHz Nano-Codec. Nove lingue (inglese, spagnolo, tedesco, francese, italiano, vietnamita, hindi, cinese mandarino, giapponese) con cinque identità di oratore al forno. INT4 (~247 MB) o INT8 (~411 MB). Streaming-ready, ~120 ms latenza del primo pacchetto.
Magpie è la scelta giusta quando avete bisogno di un singolo piccolo fascio che parla nove lingue con una voce coerente. I cinque altoparlanti al forno rimangono identitÃ-stable tra le lingue — utile per assistenti multilingue, app di istruzione, o audiobook narrazione con il codice-switching. CosyVoice3, Base Qwen3-TTS, o VoxCPM2 Invece.
Architettura
Magpie è un 4-bundle MLX pipeline: text encoder → cross-attention decoder → LocalTransformer codebook head → Causal HiFi-GAN codec audio. I bundle condividono pesi decoder tra prefill e step entry points per abbinare FluidInference's CoreML
| Fase | Modulo | Dettagli |
|---|---|---|
| 1. Tokenizzazione | MagpieTokenizer | Per-language G2P (IPA dict / byT5 byte / pinyin / katakana), vocabolo condiviso 2360-token con offset per-tokenizzatore, sempre-appended EOS |
| 2. codificatore del testo | MagpieTextEncoder | 6 strati di trasformatore causale, d=768, k=3 conv FFN |
| 3. Prefill Decoder | MagpieDecoder | 12 strati causali con cross-attention. Semi il contesto di diffusori da 110 fotogrammi + BOS nella cache KV. |
| 4. LocalTransformer | MagpieLocalTransformer | 1-strato codebook AR testa, d=256. Campioni 8 codebooks per frame sequentially dato il decoder nascosto. |
| 5. Passo del decoder | MagpieDecoder | Un passo AR per frame fino a EOS o 500-frame cap (~23 s). |
| 6. NanoCodec | MagpieNanoCodice | FSQ inverse → causale HiFi-GAN → 22.05 kHz monoforma d'onda. |
Lingue e G2P
Tutte le nove lingue di andata e ritorno attraverso Qwen3-ASR nel SDK testMultilingualRoundTrip. Ciascuno ottiene una pipeline su misura:
| Lingua | Codice | pipeline G2P |
|---|---|---|
| Inglese | en | Ditta CMU IPA (125 k voci, in bundle) |
| Spagnolo | es | Ditta IPA spagnola (bundled) |
| Germania | de | Ditta tedesca IPA (bundled) |
| Francese | fr | byT5 UTF-8 byte encoder |
| Italiano | it | byT5 UTF-8 byte encoder |
| Vietnamita | vi | byT5 UTF-8 byte encoder |
| Hindi | hi | Devanagari codice di ricerca + ultimo-wins sub-vocab |
| Cinese mandarino | zh | NLTokenizer(.simplifiedChinese) parola seg + Apple .mandarinToLatin + pinyin in bundle → IPA dict + #N |
| Giapponese | ja | CFStringTokenizer kanji lettura + NFC-preserved dakuten + heiban pitch markers + particle/greeting overrides |
Il vocab condiviso di 2360-entry concatena il sub-tokeniser di ogni lingua con un offset per lingua (registrato in MagpieSubVocab). Il testo-embedding aggiunge due righe supplementari oltre il vocab per BOS / EOS; eos_id = 2361
Altoparlanti al forno
Il checkpoint incorpora cinque contesti di altoparlante (110 frame × 768 dim ciascuno) utilizzati come prefisso di ogni decodifica AR. L'identità del diffusore è coerente in tutte le nove lingue.
| Indice | Nome CLI | Identità |
|---|---|---|
| 0 | sofia | Sofia (default) |
| 1 | aria | Aria condizionata |
| 2 | jason | Jason. |
| 3 | leo | Leo. |
| 4 | john | John Van Stan |
Varianti di modello
| Variante | Disk | RAM (carico + decodifica) | 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 |
Entrambi i fasci utilizzano la quantizzazione piana dell'affinazione MLX (mlx_affine_flat, dimensione del gruppo 64) e dequantise a FP32 al tempo di carico — le attivazioni runtime sono di piena precisione. INT4 è udibilmente indistinguibile da INT8 per questo modello; scegliere INT4 a meno che non si dispone di storage da risparmiare.
Uso 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
Opzioni
| Opzione | Predefinito | Designazione |
|---|---|---|
--magpie-variant | int4 | Variante di quantizzazione: int4 o int8 |
--magpie-speaker | sofia | Altoparlante al forno: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Temperatura di campionamento (0 = avido) |
--magpie-top-k | 80 | Filtro in alto per il campionamento |
--magpie-max-frames | 500 | Tappo rigido su cornici codec (~23 s) |
--magpie-min-frames | 4 | Cornici minimi prima che EOS consentisse |
--magpie-prephonemized | Fuori! | Trattare l'ingresso come flusso di IPA / fonemi; saltare per lingua G2P |
--language | english | Picks il per lingua tokeniser pipeline |
--stream | Fuori! | Emittente AsyncStream<AudioChunk> invece di un singolo WAV |
--seed | — | Campionamento di Gumbel reproducibile |
Ingressi giapponesi più lunghi di una sola parola hanno bisogno di decodifica stocastica (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 Greedy si blocca sulla prima frase perché l'eurismo heiban pitch-accent devia dalla verità per parola.
clonazione vocale — non supportato
Magpie non ha alcun condizionamento dell'altoparlante a zero-shot nel modello; solo la nave di identità cotta 5 nel fascio. --voice-sample, --speakere --instruct bandiere con un errore che indica gli utenti all'interno --magpie-speaker bandiera o motori che supportano la clonazione (Base Qwen3-TTS, CosyVoice3, VoxCPM2).
Prestazioni ( M4 Pro)
| Impostazione | Audio audio | Parete | RTF |
|---|---|---|---|
| Batch, INT4, avido, breve | 2.8. | 0.88 | 0.32 |
| Batch, INT4, avido, frase | 5.8 | 1.35. | 0.23 |
| Batch, INT4, campionato, uscita 23 s | 23 | 5.6 | 0.24 |
| Streaming, INT4, campionati | 23 | 21.6. | 0.93 |
La latenza del primo pacchetto in modalità di streaming è ≈120 ms dopo il carico del modello. Streaming RTF
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
Accanto al MLX fascio, Magpie navi un CoreML (pacchetto)aufklarer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8). Quattro .mlmodelc pacchetti — text_encoder, decoder_prefill, decoder_step, nanocodec_decoder — eseguire su ANE / GPU; un inverso FSQ Swift-side trasforma i codici campionati in latticini 32-dim il codec consuma.
# 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:
- Oggi e' un'ibrida pipeline. Il 1-layer LocalTransformer (la testa di campionamento del codebook reale NeMo treni) e il 8 i tavoli incorporati audio non vengono spediti all'interno CoreML fascio. Su prima sintesi il CoreML motore pigro-carica il MLX INT4 fascio per guidare entrambi i pezzi. ASR andata e ritorno è bit-for-bit identico al MLX backend; la differenza è che questo motore tira dentro MLX anche il fascio. Un puro CoreML percorso per ANE-solo iOS la distribuzione ha bisogno del pacchetto per spedire
local_transformer/*.npy+audio_embedding_*.npye un Swift Accelerare LT (segu-up tracciato). - No streaming.
nanocodec_decoder.mlmodelcè tracciato in una finestra fissa a 64-frame. Se si selezionano sequenze più lunghe internamente, ma la latenza del primo pacchetto sarebbe ~3 s se si emettesse a limiti di chunk.--stream - Nessun tokenizer giapponese. Il fascio CoreML non spedisce ancora JA tokenizer JSONs.
--language jacon questo motore auto-falls-back al MLX backend.
L'ordine del diffusore corrisponde al fascio CoreML speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo — diversi da MLX), e l'altoparlante enum mappa internamente in modo che i nomi CLI funzionino per entrambi i motori.
Note di attuazione
Tre bug che vale la pena sapere se si sta portando NeMo-style multilingue TTS:
- Divisione pavimento FSQ — di MLX-swift
/è la vera divisione (mlx_divide); NeMo's FSQ utilizza Python//. UsoMLX.floorDivide(...)o ogni slot decodifica FSQ a offset frazionari e il codec spalma l'audio. - Sub-vocab offsets — NeMo's
AggregatedTTSTokenizerconcatena vocabs per lingua con offset. - Hindi dedup —
HindiCharsTokenizeremette duplicati Devanagari (CHARSET sovrappone PUNCT_LIST). PythonE'...{l: i for i, l in enumerate(tokens)}dict-comp mantiene l'ultimo incarico; specchio che, non prima occupazione.
Tutte e tre le correzioni sono documentate in linea Modulo Swift.
Fonte
- Pesi a monte: Nvidia/magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Codec: nvidia/ nemo-nano-codec-22khz-1.89kbps-21.5fps
- Carta: NanoCodec: Verso alta qualità ultra veloce discorso LLM Inferenza (2025)
- Riferimento CoreML porto: FluidInference/mobius
- Moduli Swift: MagpieTTS (MLX) + MagpieTTSCOREML (CoreML)
- CoreML bundle: aufklarer/ Magpie-TTS-Multilingual-357M-CoreML-8bit
Licenza
- Peso del modello: NVIDIA Open Model License (uso commerciale consentito; vedi PDF collegato sulla pagina HuggingFace
- Swift port + dizionari IPA / pinyin in bundle: stesso di NeMo a monte (Apache 2.0 per i dizionari, NVIDIA OML per il modello)