Traducere automată · Originalul în engleză
Magpie-TTS Multilingual
NVIDIA Magpie-TTS Multilingual 357M în Swift pe Apple Silicon bază multi-codebook autoregresivă peste modelul lui NeMo 22.05 kHz Nano-Codec. Nouă limbi (engleză, spaniolă, germană, franceză, italiană, vietnameză, hindi, chineză mandarină, japoneză) cu cinci identităţi de vorbitor coapte. INT4 (~247 MB) sau INT8 (~411 MB). Streaming-gata, ~120 Prima latenţă.
Magpie este alegerea potrivită atunci când aveți nevoie de un singur pachet mic, care vorbește nouă limbi cu o voce consistentă. Cei cinci vorbitori coapte stau la masa de identitate în toate limbile . Utile pentru asistenți multilingvi, aplicații de educație, sau audiobook narațiune cu cod-switching. Pentru utilizarea clonării vocale zero-shot CosyVoice3 , Qwen3-TTS Baza, sau VoxCPM2 în schimb.
Arhitectură
Magpie este o conducta de 4 bucati MLX: codor text → decodor de atenţie încrucişată → Cap de cod localTransformer → Codebook cauzal HiFi-GAN audio codec. Pachetele partajează greutăţile decodorului între prefill şi puncte de intrare în trepte pentru a se potrivi cu aranjamentul lichidului în amonte CoreML.
| Etape | Modul | Detalii |
|---|---|---|
| 1. Tokenizare | MagpieTokenizer | Per-limbă G2P (IPA dict / byT5 bytes / pinyin / katakana), împărțită la 2360-token vocab cu per-tokenizer offsets, întotdeauna aplicate EOS |
| 2. Codor text | MagpieTextEncoder | 6 straturi cauzale de Transformer, d=768, k=3 conv FFN |
| 3. Prefill decodor | MagpieDecodor | 12 straturi cauzale cu atentie încrucişată. Se însămânţează context difuzor 110-cadru coapte + BOS în cache-ul KV. |
| 4. Transformator local | MagpieLocalTransformer | 1-strat de codebook cap, d=256. Mostrele 8 codebooks pe cadru secvențial dat de decodor ascuns. |
| 5. Treaptă de decodor | MagpieDecodor | O treaptă AR per cadru până la EOS sau la 500 de cadre (~23 s). |
| 6. NanoCodec | MagpieNanoCodec | FSQ invers → cauzal HiFi-GAN → 22.05 kHz monowaleform. |
Limbi și G2P
Toate cele nouă limbi rotunde-trip prin Qwen3-ASR în SDK's testMultilingualRoundTrip. Fiecare dintre acestea are o conductă adaptată:
| Limba | Cod | Conductă G2P |
|---|---|---|
| Engleză | en | CMU IPA dict (inregistrari 125 k, grupate) |
| Spaniolă | es | IPA dilt spaniolă (grupată) |
| Germană | de | IPA germană (grupată) |
| Franceză | fr | byT5 UTF-8 byte encoder |
| Italiană | it | byT5 UTF-8 byte encoder |
| Vietnameză | vi | byT5 UTF-8 byte encoder |
| Hindi | hi | Devanagari codepoint lookup + last-wins sub-vocab |
| Mandarin chinezesc | zh | NLTokenizer(.simplifiedChinese) cuvânt seg + Apple .mandarinToLatin + pachetd pinyin → IPA dict + #N markeri ton |
| Japoneză | ja | CFStringTokenizer kanji reading + NFC-conservat dakuten + markeri de pas Heiban + suprascrieri de particule/de greiere |
Vocabul partajat de 2360 de intrări concatenă fiecare limbă sub-tokeniser la sfârşit cu un offset per-limbă (înregistrat în MagpieSubVocab). Textul-embed adaugă două rânduri suplimentare peste vocabularul pentru BOS / EOS; eos_id = 2361 este anexat la fiecare secvenţă de intrare.
Speakeri copţi
Punctul de control include cinci contexte speaker (110 cadre × 768 dim fiecare) utilizate ca prefix al fiecărui cod AR. Identitatea speaker este consistentă în toate cele nouă limbi.
| Indice | Nume CLI | Identitate |
|---|---|---|
| 0 | sofia | Sofia (default) |
| 1 | aria | Ariaworld. kgm |
| 2 | jason | Jason. |
| 3 | leo | Leo. |
| 4 | john | John Van Stan |
Model Variante
| Variantă | Disc | RAM (încarcă + decodează) | HuggingFace |
|---|---|---|---|
| INT4 (default) | ~247 MO | ~1,3 GB | aufklarer/Magpie-TTS-Multilingual-357M-MLX-4bit |
| INT8 | ~411 MO | ~1,6 GB | aufklarer/Magpie-TTS-Multilingual-357M-MLX-8bit |
Ambele pachete utilizează MLX cuantizare plată afină (mlx_affine_flat, dimensiunea grupului 64) și dequantise to FP32 la timpul de încărcare ? Activările pe timp de funcționare sunt de precizie completă. INT4 este de necontestat INT8 pentru acest model; alege INT4 Doar dacă nu aveţi de păstrat.
Utilizarea 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
Opțiuni
| Opțiune | Implicit | Descriere |
|---|---|---|
--magpie-variant | int4 | Varianta de cuantificare: int4 sau int8 |
--magpie-speaker | sofia | Vorbitor coapte: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Temperatura eșantionului (0 = lacom) |
--magpie-top-k | 80 | Filtru Top-K pentru eșantionare |
--magpie-max-frames | 500 | Capac tare pe ramele de codec (~23 s) |
--magpie-min-frames | 4 | Rame minime înainte de a permite EOS |
--magpie-prephonemized | off | Tratează intrarea ca flux IPA/phoneme; săriți peste fiecare limbă G2P |
--language | english | Alege conducta de tokeniser pe limba |
--stream | off | Emit AsyncStream<AudioChunk> în loc de un singur WAV |
--seed | — | Mostra de eșantionare Gumbel reproductibilă |
Intrările japoneze mai mult decât un singur cuvânt au nevoie de decodare stocastic (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 oglinzi testul de referință NeMo). Greedy devine blocat pe prima frază, deoarece heiban smoc-accent eurist deviază de la adevărul per-cuvânt.
Clonarea vocală nu este susținută
Magpie nu are difuzor zero impuscat conditionat in model; numai nava 5 identitati coapte din pachet. CLI respinge partajat --voice-sample, --speaker, și --instruct steaguri cu o eroare de acţiune care indică utilizatorii la --magpie-speaker pavilion sau motoare care sprijină clonarea ( Baza Qwen3-TTS, CosyVoice3, VoxCPM2).
Performanță (M4 Pro)
| Setare | Audio | Zid | RTF |
|---|---|---|---|
| Lot, INT4, lacom, prompt scurt | 2.8 s | 0.88 s | 0.32 |
| Lot INT4, lacom, propoziţie | 5.8 s | 1.35 s | 0.23 |
| Lot, INT4, eșantionat, 23 s de ieșire | 23 s | 5.6 s | 0.24 |
| Streaming, INT4, eșantionat | 23 s | 21.6 s | 0.93 |
Primul pachet de latență în modul de streaming este de 120 ms după sarcina model. Streaming RTF este mai mare deoarece codec este re-invocat pe tamponul de cod complet la fiecare emisie bucată (o revizuire viitoare poate cache stare codec).
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 suport (--engine magpie-coreml)
Alături de pachetul MLX, Magpie transportă un pachet CoreML (aufklaer/Magpie-TTS-Multilingual-357M-CoreML-8bit, ~342 MB INT8). Patru .mlmodelc pachete ? text_encoder, decoder_prefill, decoder_step, nanocodec_decoder Rulați pe ANE / GPU; un invers Swift-side FSQ transformă codurile eșantionate în latentele 32-dim pe care le consumă codec.
# 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:
- Conductă hibridă astăzi. ă 1-layer LocalTransformer (adevaratul codebook de prelevare de probe cap NeMo trenuri) si 8 mesele audio de înglobare nu sunt expediate în interiorul CoreML La prima sinteză, CoreML motorul leneș-sarcină MLX INT4 pachet pentru a conduce ambele piese. ASR excursia rotundă este bit-for-bit identică cu MLX spate; diferența este că acest motor trage în MLX Un pachet de asemenea. CoreML calea numai pentru ANE iOS Implementarea are nevoie de pachetul pentru a naviga
local_transformer/*.npy+audio_embedding_*.npyși un Swift Accelerate LT (urmărire urmărită). - Niciun flux.
nanocodec_decoder.mlmodelceste urmărit la o fereastră fixă 64-frame. Am adunat secvenţe mai lungi pe plan intern, dar latenţa primului ambalaj ar fi ~3 s dacă am emis la limite de bucăţi.--streameste respins cu o eroare acţională. - Nici un tokenizer japonez. Pachetul CoreML nu trimite încă tokenizator JA JSONs.
--language jacu acest motor auto-falls-back la backend MLX.
Ordinea speakerului se potriveşte cu pachetul CoreML speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo Diferit de MLX), și speaker-ul hărți enum intern, astfel încât numele CLI funcționează pentru ambele motoare.
Note de punere în aplicare
Trei bug-uri care merită să știe dacă sunteți portare multilingve stil NeMo TTS:
- Diviziunea FSQ ا MLX-swift
/este o diviziune adevărată (mlx_divide); FSQ-ul lui NeMo utilizează invers Python//Foloseşte-te.MLX.floorDivide(...)sau fiecare fantă FSQ decodează la compensare fracționată și codec pătează audio. - Sub-vocab offsets NeMo's
AggregatedTTSTokenizerconcatenates per-limbă vocabular cu offset-uri. O hartă naivă globală de prim-actiune întotdeauna aterizează în regiunea engleză și produce audio nonsens pentru alte limbi. - Hindi câştigă ultimul rezultat —
HindiCharsTokenizerEmite intrări duplicate Devanagari (CHARSET se suprapune cu PUNCT_LIST). Python's{l: i for i, l in enumerate(tokens)}dict-comp păstrează ultima misiune; oglindește că, nu prima apariție.
Toate cele trei soluții sunt documentate în linie în modulul Swift .
Sursă
- Greutate în amonte: nvidia/magpie_tts_multilingual_357m (NVIDIA Licență în Model deschis)
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps
- Hîrtie: NanoCodec: Către o vorbire ultrarapidă de înaltă calitate LLM Inference (2025)
- Referință CoreML port: FluidInferince/mobius
- Swift module: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- CoreML pachet: aufklater/Magpie-TTS-Multilingual-357M-CoreML-8bit
Licență
- Model de greutate: NVIDIA Licență de model deschis (utilizare comercială permisă; a se vedea PDF legat pe pagina HuggingFace)
- Swift port + IPA grupat / dicționare pinyin: la fel ca NeMo în amonte (Apache 2.0 pentru dicționare, NVIDIA OML pentru model)