Traduzione automatica · Originale inglese
VibeVoice
Microsoft VibeVoice è un modello di testo-to-speech multi-speaker di lunga data per l'inglese e il cinese. TTS, è progettato per generare dialogo podcast-lunghezza, narrazione audiolibro, e scene multi-speaker in un unico passaggio — fino a 90 minuti fino a raggiungere 4 voci distinte e identità coerente in tutto. Due varianti nave: Realtime-0.5B per lo streaming a bassa latenza e 1.5 per la qualità del flagship di lunga data.
Che cosa è
- Forma lunga in un unico passaggio — fino a 90 minuti di audio con voci coerenti in tutta l'output; nessun handoff di per-sentence
- Multi-speaker dialogo — 4 altoparlanti distinti contemporaneamente, ciascuno condizionato dalla propria cache vocale
- Inglese + Cinese — dati audio formati è solo EN/ZH; altre lingue non sono supportate (il tokenizer li accetta ma l'output è intelligibile)
- Uscita mono 24 kHz — Float32 PCM, drop-in per
AudioCommon.WAVWritereStreamingAudioPlayer - Licenza MIT — i pesi del modello e la nostra porta Swift sono entrambi MIT; sono consentiti derivati quantizzati INT4
Architettura
Quattro componenti cooperanti producono audio un 7,5 Hz latente alla volta:
| Componenti | Designazione |
|---|---|
| Spalato Qwen2 | 24- strato Qwen2.5 decodificatore (896 nascosto, GQA 14/2 per Realtime-0.5B). Il modello è diviso: il più basso 4 strati formano un testo LM, la parte superiore 20 gli strati funzionano come TTS LM. Finestre di testo (5 token alla volta) scorrere attraverso entrambi; i latticini generati del discorso fluiscono solo attraverso il TTS LM. |
| Tokenizzatore acustico σ-VAE | Streaming conv stack che codifica audio 24 kHz ad un latente di 64-dim a 7,5 Hz (3200× downsample temporale) e decodifica latenti di nuovo alla forma d'onda. |
| Testa di diffusione | Testa DDPM a 4 strati con modulazione adaLN. Campioni ogni latente del discorso tramite DPM-Solver a 20 gradi con guida senza classificatori (cfg = 1.3 default per Realtime-0.5B, 1.5 for 1.5B). |
| Classificatore EOS | Classificatore binario per passo sull'ultimo stato nascosto di TTS LM. Quando la probabilità sigmoide supera 0,5, la generazione si ferma. |
Lingue
Per le schede di modello di Microsoft: Realtime-0.5B è l'inglese solo (la demo a monte invia nove prompt vocali non-EN come esplorativo; la qualità non è garantita). 1.5B supporta l'inglese e il cinese ; altre lingue possono produrre audio plausibile-suono ma infedele e devono essere considerate sperimentali.
Identità vocale — due percorsi distinti
Le due varianti prendono approcci molto diversi per il condizionamento dell'altoparlante, e ogni percorso ha vincoli che vale la pena conoscere in anticipo.
Realtime-0.5B — cache vocali pre-costruite
L'identità del diffusore proviene da una cache vocale precomputata .safetensors
Il checkpoint Realtime-0.5B è distribuito solo inferenza — Microsoft non spedisce l'encoder acustico, quindi le cache vocali non possono essere coniate dall'audio grezzo contro questo modello. Microsoft pre-costruito .pt cache vocali (Carter, Davis, Emma, Frank, Grace, Mike, Samuel for English, plus exploratory de/fr/it/jp/kr/nl/pl/pt voices), appiattito in .safetensors layout questo caricatore si aspetta.
1.5B lunga forma — clonazione vocale dall'audio grezzo
Il punto di controllo 1.5B does spedisce l'encoder acustico, in modo da poter clonare un altoparlante arbitrario da una forma d'onda di riferimento + trascrizione in un solo colpo. La codifica è inlineata su ogni chiamata di sintesi - non c'è nessun file vocale-cache separato da gestire.
speech vibevoice-encode-voice è gatedLa superficie CLI per la creazione offline di voice-cache contro Realtime-0.5B fallirà velocemente con un puntatore al flusso di lavoro raw-audio 1.5B, poiché i pesi encoder non sono presenti nel checkpoint 0.5b. Fino a quando Microsoft non li spedirà, questo è l'unico percorso end-to-end per clonare un altoparlante personalizzato.
Modello
| Bundle | Quantificazione | Dimensione | HuggingFace |
|---|---|---|---|
| Realtime-0.5B | BF16 (fonte) | ~ 1 GB | microsoft/VibeVoice-Realtime-0.5B |
| Realtime-0.5B INT4 | Qwen2 INT4 tokenizer + diffusione FP16 | ~ 350 MB | aufklarer/VibeVoice-Realtime-0.5B-MLX-INT4 |
| Realtime-0.5B INT8 | Qwen2 INT8 | ~ 570 MB | aufklarer/VibeVoice-Realtime-0.5B-MLX-INT8 |
| Forma lunga 1,5B | BF16 (fonte) | ~ 3 GB | microsoft/VibeVoice-1.5B |
| 1.5B INT4 (produzione) | Qwen2 INT4 + doppio codificatore | ~ 1 GB | aufklarer/VibeVoice-1.5B-MLX-INT4 |
La quantizzazione utilizza quantità MLX group-wise (32-group). Embeddings, norme, convoluzioni acustiche-tokenizer e il classifier EOS rimangono nel loro dtype sorgente.
Avvio rapido
import VibeVoiceTTS
let tts = try await VibeVoiceTTSModel.fromPretrained()
try tts.loadVoice(from: "/path/to/voice_cache/en-Mike_man.safetensors")
let pcm = try await tts.generate(text: "Hello world.")
// pcm: [Float] at 24 kHz mono
Forma lunga 1,5B (diverso API)
1.5B ha un'architettura diversa (unificata Qwen2 LM, doppio codificatore, campionamento di token LM) in modo che navi come classe separata — VibeVoice15BTTSModel. audio di riferimento + testo vada in una sola chiamata:
let tts = try await VibeVoice15BTTSModel.fromPretrained()
let pcm = try await tts.generate(
text: "Long English script.",
referenceAudio: refSamples, // [Float] mono speech, any rate
referenceTranscript: "",
sampleRate: 24000
)
Nessuna cache vocale necessaria — il modello codifica l'audio di riferimento attraverso entrambi acoustic_tokenizer (64-dim) e semantic_tokenizer (128-dim, ASR-trained) e li riassume in posizioni di messaggio audio. <speech_diffusion> / <speech_end> / testo — diffonde un latente acustico solo quando il LM emette il token del discorso.
ASR-verified su M2 Max INT4 (RTFx 1.48): per l'ingresso "Ciao mondo. Questo è il punto cinque miliardi VibeVoice variante del testo Microsoft al modello di parola.", Nemotron trascritto l'output come "Hello world, questo è l'unico punto cinque miliardi attraverso la variante vocale del modello di discorso di microsoft texas" — ogni parola di contenuto abbinata, solo sostituzioni acustiche sono VibeVoice → via voce e testo a → texas.
Voci tra le generazioni
try tts.loadVoice(from: "en-Mike_man.safetensors")
let a = try await tts.generate(text: "First speaker line.")
try tts.loadVoice(from: "en-Emma_woman.safetensors")
let b = try await tts.generate(text: "Second speaker line.")
CLI
Realtime-0.5B con una cache vocale Microsoft convertita (inglese):
speech vibevoice "Hello world." \
--voice-cache voice_cache/en-Mike_man.safetensors \
--output hello.wav
forma lunga 1,5B con audio di riferimento grezzo + trascrizione (chiusura di un altoparlante arbitrario, inglese o cinese):
speech vibevoice "Long paragraph ..." \
--long-form \
--reference-audio voice.wav \
--reference-transcript "what was actually said in voice.wav" \
--max-tokens 4000 \
--output episode.wav
Bandiere: --steps (passi di MPM-Solver), --cfg (guida) --model / --tokenizer override HuggingFace ID, --long-form per passare alla preimpostazione 1.5B, --verbose per tempismo.
Picking tra moduli speech-swift TTS
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Params | 82M | 7B | 7B | 500M | 1.5B |
| Indietro | CoreML (ANE) | MLX | MLX | MLX | MLX |
| Lingue | 8 | 10+ | 10+ | EN solo | EN + ZH |
| Clonazione vocale | Preimpostazioni fisse | Riferimento ICL | Riferimento zero-shot | Solo cache vocali pre-costruite | Audio crudo + trascrizione |
| Forma lunga | Breve/medio | Streaming | Streaming | Streaming | Fino a 90 min / 4 altoparlanti |
...è necessario una forma lunga, multi-speaker, o podcast/audiobook in inglese o in cinese, con coerente identità vocale tra i minuti audio. TTS, Qwen3-TTS o CosyVoice3 sono meglio si adatta. Per i brevi proferimenti iOS-native, Kokoro è l'opzione più piccola.