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.

Quando raggiungere per Magpie

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

FaseModuloDettagli
1. TokenizzazioneMagpieTokenizerPer-language G2P (IPA dict / byT5 byte / pinyin / katakana), vocabolo condiviso 2360-token con offset per-tokenizzatore, sempre-appended EOS
2. codificatore del testoMagpieTextEncoder6 strati di trasformatore causale, d=768, k=3 conv FFN
3. Prefill DecoderMagpieDecoder12 strati causali con cross-attention. Semi il contesto di diffusori da 110 fotogrammi + BOS nella cache KV.
4. LocalTransformerMagpieLocalTransformer1-strato codebook AR testa, d=256. Campioni 8 codebooks per frame sequentially dato il decoder nascosto.
5. Passo del decoderMagpieDecoderUn passo AR per frame fino a EOS o 500-frame cap (~23 s).
6. NanoCodecMagpieNanoCodiceFSQ 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:

LinguaCodicepipeline G2P
IngleseenDitta CMU IPA (125 k voci, in bundle)
SpagnoloesDitta IPA spagnola (bundled)
GermaniadeDitta tedesca IPA (bundled)
FrancesefrbyT5 UTF-8 byte encoder
ItalianoitbyT5 UTF-8 byte encoder
VietnamitavibyT5 UTF-8 byte encoder
HindihiDevanagari codice di ricerca + ultimo-wins sub-vocab
Cinese mandarinozhNLTokenizer(.simplifiedChinese) parola seg + Apple .mandarinToLatin + pinyin in bundle → IPA dict + #N
GiapponesejaCFStringTokenizer 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.

IndiceNome CLIIdentità
0sofiaSofia (default)
1ariaAria condizionata
2jasonJason.
3leoLeo.
4johnJohn Van Stan

Varianti di modello

VarianteDiskRAM (carico + decodifica)HuggingFace
INT4 (default)~247 MB~ 1,3 GBaufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit
INT8~ 411 MB~ 1,6 GBaufklarer/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

OpzionePredefinitoDesignazione
--magpie-variantint4Variante di quantizzazione: int4 o int8
--magpie-speakersofiaAltoparlante al forno: sofia, aria, jason, leo, john
--magpie-temperature0.6Temperatura di campionamento (0 = avido)
--magpie-top-k80Filtro in alto per il campionamento
--magpie-max-frames500Tappo rigido su cornici codec (~23 s)
--magpie-min-frames4Cornici minimi prima che EOS consentisse
--magpie-prephonemizedFuori!Trattare l'ingresso come flusso di IPA / fonemi; saltare per lingua G2P
--languageenglishPicks il per lingua tokeniser pipeline
--streamFuori!Emittente AsyncStream<AudioChunk> invece di un singolo WAV
--seed—Campionamento di Gumbel reproducibile
Punta di campionamento giapponese

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)

ImpostazioneAudio audioPareteRTF
Batch, INT4, avido, breve2.8.0.880.32
Batch, INT4, avido, frase5.81.35.0.23
Batch, INT4, campionato, uscita 23 s235.60.24
Streaming, INT4, campionati2321.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:

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:

Tutte e tre le correzioni sono documentate in linea Modulo Swift.

Fonte

Licenza