VibeVoice
La version anglaise a été mise à jour le 2026-05-10 avec la portée linguistique du modèle et les workflows de clonage vocal ; la traduction suivra. Voir la version anglaise pour le contenu à jour.
Microsoft VibeVoice est un modèle de synthèse vocale long format et multi-locuteurs pour l'anglais et le chinois. Contrairement aux TTS d'énoncés courts, il est conçu pour générer en une seule passe des dialogues de la durée d'un podcast, de la narration de livres audio et des scènes multi-locuteurs — jusqu'à 90 minutes avec jusqu'à 4 voix distinctes et une identité cohérente sur l'ensemble. Deux variantes sont disponibles : Realtime-0.5B pour le streaming à faible latence et 1.5B pour la qualité phare en long format.
Présentation
- Long format en une seule passe — jusqu'à 90 minutes d'audio avec des voix cohérentes sur toute la sortie ; pas de relais phrase par phrase
- Dialogue multi-locuteurs — 4 locuteurs distincts simultanément, chacun conditionné par son propre voice cache
- Anglais + chinois — les données audio d'entraînement sont uniquement EN/ZH ; les autres langues ne sont pas prises en charge (le tokenizer les accepte mais la sortie est inintelligible)
- Sortie mono à 24 kHz — PCM Float32, prêt à brancher sur
AudioCommon.WAVWriteretStreamingAudioPlayer - Licence MIT — les poids du modèle et notre portage Swift sont tous deux MIT ; les dérivés quantifiés en INT4 sont autorisés
Architecture
Quatre composants coopèrent pour produire l'audio un latent à 7,5 Hz à la fois :
| Composant | Description |
|---|---|
| Split Qwen2 backbone | 24-layer Qwen2.5 decoder (896 hidden, GQA 14/2 for Realtime-0.5B). The model is split: the lower 4 layers form a text LM, the upper 20 layers run as the TTS LM. Text windows (5 tokens at a time) flow through both; generated speech latents flow only through the TTS LM. |
| σ-VAE acoustic tokenizer | Streaming conv stack that encodes 24 kHz audio to a 64-dim latent at 7.5 Hz (3200× temporal downsample) and decodes latents back to waveform. Used for both voice-cache creation and final audio decode. |
| Diffusion head | Small 4-layer DDPM head with adaLN modulation. Samples each speech latent via 20-step DPM-Solver with classifier-free guidance (cfg = 1.3 default for Realtime-0.5B, 1.5 for 1.5B). |
| EOS classifier | Per-step binary classifier on the TTS LM's last hidden state. When sigmoid probability exceeds 0.5, generation stops. |
Clonage vocal via voice-cache
L'identité du locuteur ne provient pas d'une forme d'onde de référence au moment de la génération. À la place, chaque voix est livrée sous la forme d'un voice cache .safetensors précalculé contenant les caches KV de conditionnement et les états cachés pour un locuteur donné — produits hors ligne en faisant passer l'audio de référence dans le chemin de l'encodeur. Charger un voice cache est instantané à l'exécution ; une même instance du modèle peut changer de voix à faible coût entre les générations.
Exemples de voice caches (licence MIT) : mzbac/vibevoice.swift/voice_cache — 7 voix anglaises dont Carter, Davis, Emma, Frank, Grace, Mike et Samuel à accent indien.
Modèle
| Bundle | Quantification | Taille | HuggingFace |
|---|---|---|---|
| Realtime-0.5B | BF16 (source) | ~1 GB | microsoft/VibeVoice-Realtime-0.5B |
| Realtime-0.5B INT4 | Qwen2 INT4, tokenizer + diffusion 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 |
| 1.5B long-form | BF16 (source) | ~3 GB | microsoft/VibeVoice-1.5B |
| 1.5B INT4 (production) | Qwen2 INT4 + dual encoders | ~1 GB | aufklarer/VibeVoice-1.5B-MLX-INT4 |
La quantification utilise la quantification affine par groupes de MLX (groupe 32). Les embeddings, normalisations, convolutions de l'acoustic-tokenizer et le classifieur EOS conservent leur dtype d'origine.
Démarrage rapide
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
Long-form 1.5B (different API)
1.5B has a different architecture (unified Qwen2 LM, dual encoders, LM token sampling) so it ships as a separate class — VibeVoice15BTTSModel. Reference audio + text go in a single call:
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
)
No voice cache needed — the model encodes the reference audio through both acoustic_tokenizer (64-dim) and semantic_tokenizer (128-dim, ASR-trained) and sums them at audio prompt positions. Generation runs LM token sampling branched on <speech_diffusion> / <speech_end> / text — diffuses an acoustic latent only when the LM emits the speech token.
ASR-verified on M2 Max INT4 (RTFx 1.48): for input "Hello world. This is the one point five billion VibeVoice variant of the Microsoft text to speech model.", Nemotron transcribed the output as "hello world, this is the one point five billion via voice variant of the microsoft texas speech model" — every content word matched, only acoustic substitutions are VibeVoice → via voice and text to → texas.
Changer de voix entre les générations
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
speech vibevoice "Hello world." \
--voice-cache voice_cache/en-Mike_man.safetensors \
--output hello.wav
# Long format 1.5B
speech vibevoice "Long paragraph ..." \
--long-form \
--reference-audio reference_speech.wav \
--reference-transcript "exact transcript of the reference" \
--max-tokens 500 --steps 20 \
--output episode.wav
Options : --steps (étapes du DPM-Solver), --cfg (guidance), --model / --tokenizer pour surcharger les IDs HuggingFace, --long-form pour basculer sur le préréglage 1.5B, --verbose pour les temps.
Choisir parmi les modules TTS de speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Paramètres | 82M | 7B | 7B | 500M | 1.5B |
| Backend | CoreML (ANE) | MLX | MLX | MLX | MLX |
| Langues | 8 | 10+ | 10+ | EN/ZH | EN/ZH |
| Clonage vocal | Préréglages fixes | Référence ICL | Référence zero-shot | Voice cache | Voice cache |
| Long format | Court/moyen | Streaming | Streaming | Streaming | Jusqu'à 90 min / 4 locuteurs |
…vous avez besoin d'une sortie long format, multi-locuteurs ou podcast/livre audio en anglais ou chinois, avec une identité vocale cohérente sur plusieurs minutes d'audio. Pour du TTS multilingue court, Qwen3-TTS ou CosyVoice3 conviennent mieux. Pour des énoncés courts natifs iOS, Kokoro est l'option la plus légère.