Tłumaczenie automatyczne · Oryginał angielski
Magpie- TTS Wielojęzyczny
NVIDIA Magpie- TTS Wielojęzyczny 357M w Swift na Apple Silicon - autoregresywny wielo-kodebook text- to- mowy model nad NeMo 22.05 kHz Nano- kodec. Dziewięć języków (angielski, hiszpański, niemiecki, francuski, włoski, wietnamski, hindi, mandaryński chiński, japoński) z pięciu pieczonych tożsamości głośnika. INT4 (~ 247 MB) INT8 (~411 MB). Streaming- ready, ~120 ms first-package latency.
Sroka jest właściwym wyborem, gdy potrzebujesz jednego małego pakietu, który mówi dziewięć języków o konsekwentnym głosie. Pięć pieczonych głośników pozostają identyfikacyjne- stabilne w różnych językach - przydatne dla wielojęzycznych asystentów, aplikacji edukacyjnych, lub audiobook narracji z kode- przełączanie. Dla zeroshot klonowania głosu CosyVoice3, Podstawa Qwen3-TTSlub VoxCPM2 Zamiast tego.
Architektura
Magpie jest 4- pęczek MLX rurociąg: tekst encoder → cross-attention dekoder → LocalTransformer Codebook głowę → Codec audio Causage HiFi- GAN. Pakiety akcji wagi dekodera między prefill i punktów wejścia krok, aby dopasować w górę FluidInference 's CoreML układ.
| Etap | Moduł | Szczegóły |
|---|---|---|
| 1. Tokenizacja | MagpieTokenizer | Per- language G2P (IPA dict / byT5 bytes / pinyin / katakana), wspólne słownictwo 2360- token z offsetami pertokenizera, zawsze dołączone EOS |
| 2. Kodowanie tekstu | MagpieTextEncoder | 6 warstw transformatora, d = 768, k = 3 conv FFN |
| 3. Wstępne wypełnienie dekodera | MagpieDecode | 12 warstw przyczynowo-skutkowych z krzyżową uwagą. Nasienie 110- frame pieczony kontekst głośnika + BOS do pamięci podręcznej KV. |
| 4. LocalTransformer | MagpieLocalTransformer | 1-warstwa kodebook AR head, d = 256. Próbki 8 kodebooków na ramkę kolejno pod warunkiem dekodera ukryte. |
| 5. Krok dekodera | MagpieDecode | Jeden krok AR na ramę do czasu EOS lub 500- ramowy kaptur (~ 23 s). |
| 6. NanoCodec | MagpieNanoCodec | FSQ odwrotność → przyczynowość HiFi- GAN → 22.05 kHz mono fala. |
Języki i G2P
Wszystkie dziewięć języków runda-wycieczka przez Qwen3-ASR w SDK testMultilingualRoundTripKażdy z nich otrzymuje gazociąg:
| Język | Kod | Gazociąg G2P |
|---|---|---|
| Angielski | en | Decyzja w sprawie IPA w ramach unii rynków kapitałowych (125 tysięcy wpisów, w pakiecie) |
| Hiszpański | es | Hiszpański wyrok w sprawie IPA (w pakiecie) |
| Niemiecki | de | Niemiecki wyrok w sprawie IPA (w pakiecie) |
| Francuski | fr | byT5 UTF-8 bajt enkoder |
| Włoski | it | byT5 UTF-8 bajt enkoder |
| Wietnamski | vi | byT5 UTF-8 bajt enkoder |
| Hindi | hi | Devanagari codepoint lookup + last-wins sub- vocab |
| Chinczyk mandaryński | zh | NLTokenizer(.simplifiedChinese) słowo seg + Apple .mandarinToLatin + połączone pinyin → IPA Dyct + #N Znaczniki tonu |
| Japoński | ja | CFStringTokenizer odczyt kanji + zachowane przez NFC- dakuten + znaczniki skoku jałowca + nadjazdy cząstek / powitania |
Współdzielone słownictwo 2360-contratenates każdego języka sub- tokeniser end-to- end z offsetem perjęzycznym (rejestrowane w MagpieSubVocab). Text- osadzanie dodaje dwa dodatkowe rzędy obok słownika dla BOS / EOS; eos_id = 2361 jest załączony do każdej sekwencji wejściowej.
Pieczone głośniki
Punkt kontrolny zawiera pięć kontekstów głośników (110 klatek × 768 dim każdy) używanych jako prefiks każdego dekodu AR. Tożsamość głośnika jest spójna we wszystkich dziewięciu językach.
| Indeks | Nazwa CLI | Tożsamość |
|---|---|---|
| 0 | sofia | Sofia (domyślnie) |
| 1 | aria | Aria |
| 2 | jason | Jason |
| 3 | leo | Leo. |
| 4 | john | John Van Stan |
Warianty modelu
| Wariant | Dysk | RAM (ładunek + dekoder) | HuggingFace |
|---|---|---|---|
| INT4 (domyślnie) | - 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 |
Obie wiązki wykorzystują kwantyfikację płaskich lawin MLX (mlx_affine_flat, rozmiar grupy 64) i dequantise do FP32 w czasie obciążenia - aktywacje runtime są pełne precyzji. INT4 jest słyszalnie nie do odróżnienia od INT8 dla tego modelu; wybierz INT4, chyba że masz zapasowe przechowywanie.
Zastosowanie 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
Opcje
| Opcja | Domyślne | Opis |
|---|---|---|
--magpie-variant | int4 | Wariant ilościowy: int4 lub int8 |
--magpie-speaker | sofia | Głośnik pieczony: sofia, aria, jason, leo, john |
--magpie-temperature | 0.6 | Temperatura pobierania próbek (0 = chciwość) |
--magpie-top-k | 80 | Filtr Top- k do pobierania próbek |
--magpie-max-frames | 500 | Twarde wieczko na ramie kodekowe (~ 23 s) |
--magpie-min-frames | 4 | Minimalne ramy przed dopuszczeniem EOS |
--magpie-prephonemized | wyłączony | Treat input as IPA / phoneme stream; skip per- language G2P |
--language | english | Wybiera gazociąg do tokenizera |
--stream | wyłączony | Emit AsyncStream<AudioChunk> zamiast pojedynczego WAV |
--seed | — | Odtwarzalne pobieranie próbek Gumbel |
Japońskie wejścia dłuższe niż jedno słowo potrzebują stochastycznego dekodowania (--magpie-temperature 0.6 --magpie-top-k 80 --seed 42 lusterka NeMo 's reference test). Greedy utknął na pierwszym zdaniu, ponieważ heurystyczny heurystyk Heiban-akcent odbiega od per- słowo prawdy.
Klonowanie głosu - nieobsługiwane
Magpie nie ma zero-shot głośnik kondycjonowanie w modelu; tylko 5 pieczone tożsamości statku w pakiecie. CLI odrzuca wspólne --voice-sample, --speakeroraz --instruct flagi z możliwym do podjęcia błędem wskazując użytkowników na --magpie-speaker flaga lub silniki, które obsługują klonowanie (Podstawa Qwen3-TTS, CosyVoice3, VoxCPM2).
Wydajność (M4 Pro)
| Ustawienie | Audio | Ściana | RTF |
|---|---|---|---|
| Nr serii, INT4, chciwy, krótki czas | 2.8 s | 0.88 s | 0.32 |
| Nr serii, INT4, chciwy, zdanie | 5.8 s | 1,35 s | 0.23 |
| Seria, INT4, pobrana próbka, wyjście 23 | 23 s | 5.6 s | 0.24 |
| Streaming, INT4, pobrane próbki | 23 s | 21.6 s | 0.93 |
W trybie streamingu latencja pakietów first- package jest po załadowaniu modelu X120 ms. Streaming RTF jest wyższy, ponieważ kodek jest ponownie wywoływany na pełnym buforze kodowym przy każdej emisji fragmentów (przyszła wersja może buforować stan kodeka).
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
}
Wtyczka CoreML (--engine magpie-coreml)
Oprócz pakietu MLX, Magpie wysyła pakiet CoreML (aufklarer / Magpie-TTS-Multilingual-357M-CoreML-8bit342 MB INT8). .mlmodelc opakowania - text_encoder, decoder_prefill, decoder_step, nanocodec_decoder - uruchomiony na ANE / GPU; odwrotny Swift- side FSQ zamienia kody z próbki w 32- dim latenty kodekowe.
# 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:
- Hybrydowy rurociąg. W 1-warstwa LocalTransformer (rzeczywisty Codebook próbkowania głowy NeMo pociągów) i 8 tabele osadzania dźwięku nie są wysyłane wewnątrz CoreML wiązka. Na pierwszej syntezie CoreML silnik lazy- ładuje MLX INT4 wiązka do napędzania obu części. ASR rund- trip jest bit- for- bit identyczny z MLX oparcie; różnica polega na tym, że ten silnik ciągnie w MLX To też jest pudło. CoreML Ścieżka tylko dla ANE iOS rozmieszczenie wymaga pakietu do statku
local_transformer/*.npy+audio_embedding_*.npyoraz Swift Accelerate LT (śledzone działania następcze). - Żadnego strumieniowania.
nanocodec_decoder.mlmodelcjest śledzony w stałym oknie 64- frame. Oddzielamy dłuższe sekwencje wewnętrznie, ale pierwszy pakiet latencja będzie ~ 3 s, jeśli emitujemy na granicach kawałka.--streamjest odrzucany z błędem podlegającym zaskarżeniu. - Żadnego japońskiego tokenizera. Pakiet CoreML nie wysyła jeszcze JSON tokenizera JA.
--language jaz tym silnikiem auto-falls-back do oparcia MLX.
Zamówienie głośnika pasuje do pakietu CoreML speaker_info.json (0=John, 1=Sofia, 2=Aria, 3=Jason, 4=Leo - różni się od MLX), a głośnik enum mapuje wewnętrznie tak, że nazwy CLI działają dla obu silników.
Notatki wykonawcze
Trzy błędy warto wiedzieć, czy jesteś w stylu NeMo- wielojęzyczny TTS:
- Podział podłogi FSQ - MLX- swift 's
/jest podziałem rzeczywistym (mlx_divide); odwrotność FSQ NeMo wykorzystuje Python//Użyj.MLX.floorDivide(...)lub każde gniazdo FSQ odkodowuje się od ułamkowych offsetów i kodek rozprasza dźwięk. - Offsety sub- wokab - NeMo.
AggregatedTTSTokenizerkonkatenat perjęzycznych wokali z offsetami. Naiwna globalna pierwsza mapa zdarzeń zawsze ląduje w regionie angielskim i produkuje nonsens audio dla innych języków. - Hindi ostatnio wygrywa. —
HindiCharsTokenizeremituje duplikaty wpisów Devanagari (CHARSET pokrywa się z PUNCT _ LIST). Pythonjest{l: i for i, l in enumerate(tokens)}dictic- comp zachowuje ostatnie zadanie; odzwierciedla to, nie pierwsze zdarzenie.
Wszystkie trzy poprawki są udokumentowane inline w Moduł Swift.
Źródło
- Wagi w górę strumienia: nvidia / magpie_tts_multilingual_357m (NVIDIA Open Model License)
- Codec: nvidia / nemo-nano-codec-22khz-1.89kbps-21.5fps
- Papier: NanoCodec: W kierunku wysokiej jakości Ultra Szybki Speech LLM (2025)
- Port odniesienia CoreML: FluidInference / mobius
- Moduły Swift: MagpieTTS (MLX) + MagpieTTSCoreML (CoreML)
- CoreML: aufklarer / Magpie-TTS-Multilingual-357M-CoreML-8bit
Licencja
- Wagi modelu: NVIDIA Open Model License (dozwolone do użytku komercyjnego; zobacz powiązany PDF na stronie HuggingFace)
- Port Swift + połączone słowniki IPA / pinyin: takie same jak w górnym biegu NeMo (Apache 2.0 dla słowników, NVIDIA OML dla modelu)