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.

När man ska nå för Magpie

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.

StegModulDetaljer
1. TokeniseringMagpieTokenizerPer-language G2P (IPA dict / byT5 byte / pinyin / katakana), delade 2360-token vocab med per-tokenizer offsets, alltid-appended EOS
2. Text-kodareMagpieTextEncoder6 orsakssamband Transformer skikt, d=768, k=3 konv FFN
3. Decoder prefillMagpieDecoder12 kausala lager med korsuppmärksamhet. Frön 110-ram bakade högtalarkontexten + BOS i KV-cache.
4. LocalTransformerMagpieLocalTransformer1-skiktskodbok AR-huvudet, d=256. Prover de 8 kodböckerna per ram sekventiellt med tanke på avkodaren dold.
5. Decoder stegMagpieDecoderEtt AR steg per ram till EOS eller 500-ram cap (~23 s).
6. NanoCodecMagpieNanoCodecFSQ 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åkKodkodG2P pipeline
Engelska engelska engelskaenCMU IPA dikt (125 k poster, buntad)
Spanska spanskaesSpanska IPA dikt (bunden)
Tyska tyskadeTyska IPA dikt (bunden)
Franska franskafrbyT5 UTF-8 byteskodare
Italienska ItalienitbyT5 UTF-8 byteskodare
VietnamesiskavibyT5 UTF-8 byteskodare
HindihiDevanagari codepoint lookup + Last-wins sub-vocab
Mandarin kinesiskazhNLTokenizer(.simplifiedChinese) ord seg + Apple .mandarinToLatin + bundled pinyin → IPA dikt + #N tonmarkörer
Japansk Japansk Japan JapanskjaCFStringTokenizer 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.

IndexCLI-namnidentitet
0sofiaSofia (default)
1ariaAria
2jasonJason
3leoLeo
4johnJohn Van Stan

Modellvarianter

VariantDiskRAM (belastning + avkodning)HuggingFace
INT4 (standard)247 MB~1.3 GBaufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit
INT8~411 MB~1.6 GBaufklarer/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

AlternativStandardBeskrivning
--magpie-variantint4Kvantiseringsvariant: int4 eller int8
--magpie-speakersofiaBakad högtalare: sofia, aria, jason, leo, john
--magpie-temperature0.6Provtagningstemperatur (0 = girig)
--magpie-top-k80Top-k filter för provtagning
--magpie-max-frames500Hårddisk på codec-ramar (~23 s)
--magpie-min-frames4Minsta ramar innan EOS tillåts
--magpie-prephonemizedOff offBehandla inmatning som IPA / telefonme stream; hoppa per språk G2P
--languageenglishPlockar per-language tokeniser pipeline
--streamOff offEmit AsyncStream<AudioChunk> istället för en enda WAV
--seed—Reproducible Gumbel provtagning
Japanska provtagningstips

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ällningAudioVäggRTF
Batch, INT4, girig, kort snabb snabb2.8 s0,88 s0.32
Batch, INT4, girig, mening5,8 s1,35 s0.23
Batch, INT4, provtagen, 23 s output23 s5,6 s0.24
Streaming, INT4, provtagen23 s21,6 s0.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:

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:

Alla tre korrigeringar är dokumenterade inline i Swift modul.

Källa

Licens