VibeVoice

⚠ Traducción obsoleta

La versión en inglés se actualizó el 2026-05-10 con el alcance de idiomas del modelo y los flujos de clonación de voz; la traducción llegará en un seguimiento. Consulta la versión en inglés para el contenido más reciente.

Microsoft VibeVoice es un modelo de síntesis de voz de formato largo y múltiples hablantes para inglés y chino. A diferencia del TTS de enunciados cortos, está diseñado para generar diálogos de duración de podcast, narración de audiolibros y escenas multi-hablante en una sola pasada — hasta 90 minutos con hasta 4 voces distintas y una identidad consistente en toda la salida. Se distribuyen dos variantes: Realtime-0.5B para streaming de baja latencia y 1.5B para calidad insignia de formato largo.

Qué es

Arquitectura

Cuatro componentes colaboran para producir audio un latente de 7.5 Hz a la vez:

ComponenteDescripción
Split Qwen2 backbone24-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 tokenizerStreaming 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 headSmall 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 classifierPer-step binary classifier on the TTS LM's last hidden state. When sigmoid probability exceeds 0.5, generation stops.

Clonación de voz mediante voice-cache

La identidad del hablante no proviene de una forma de onda de referencia en el momento de la generación. En su lugar, cada voz se distribuye como un voice cache precalculado en .safetensors que contiene las cachés KV de condicionamiento y los estados ocultos para un hablante específico, producidos al ejecutar el audio de referencia por la ruta del codificador de forma offline. Cargar un voice cache es instantáneo en tiempo de ejecución; una instancia del modelo puede cambiar de voz a bajo coste entre generaciones.

Voice caches de ejemplo (licencia MIT): mzbac/vibevoice.swift/voice_cache — 7 voces en inglés que incluyen Carter, Davis, Emma, Frank, Grace, Mike y Samuel con acento indio.

Modelo

BundleCuantizaciónTamañoHuggingFace
Realtime-0.5BBF16 (source)~1 GBmicrosoft/VibeVoice-Realtime-0.5B
Realtime-0.5B INT4Qwen2 INT4, tokenizer + diffusion FP16~350 MBaufklarer/VibeVoice-Realtime-0.5B-MLX-INT4
Realtime-0.5B INT8Qwen2 INT8~570 MBaufklarer/VibeVoice-Realtime-0.5B-MLX-INT8
1.5B long-formBF16 (source)~3 GBmicrosoft/VibeVoice-1.5B
1.5B INT4 (production)Qwen2 INT4 + dual encoders~1 GBaufklarer/VibeVoice-1.5B-MLX-INT4

La cuantización usa cuantización afín por grupos de MLX (grupo 32). Los embeddings, normalizaciones, convoluciones del acoustic-tokenizer y el clasificador EOS conservan su dtype original.

Inicio rápido

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.

Intercambiar voces entre generaciones

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

# Formato largo 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

Flags: --steps (pasos del DPM-Solver), --cfg (guía), --model / --tokenizer para sobrescribir los IDs de HuggingFace, --long-form para cambiar al preset 1.5B, --verbose para tiempos.

Elegir entre los módulos TTS de speech-swift

Kokoro-82MQwen3-TTSCosyVoice3VibeVoice RealtimeVibeVoice 1.5B
Parámetros82M7B7B500M1.5B
BackendCoreML (ANE)MLXMLXMLXMLX
Idiomas810+10+EN/ZHEN/ZH
Clonación de vozPresets fijosReferencia ICLReferencia zero-shotVoice cacheVoice cache
Formato largoCorto/medioStreamingStreamingStreamingHasta 90 min / 4 hablantes
Elige VibeVoice cuando…

…necesites salida de formato largo, multi-hablante o podcast/audiolibro en inglés o chino, con identidad vocal consistente a lo largo de minutos de audio. Para TTS multilingüe de formato corto, Qwen3-TTS o CosyVoice3 encajan mejor. Para enunciados cortos nativos en iOS, Kokoro es la opción más pequeña.