VibeVoice

⚠ Tradução desatualizada

A versão em inglês foi atualizada em 2026-05-10 com o escopo de idiomas e os fluxos de clonagem de voz; a tradução será feita em seguida. Consulte a versão em inglês para o conteúdo mais atual.

Microsoft VibeVoice é um modelo de síntese de fala de formato longo e multi-locutor para inglês e chinês. Ao contrário de TTS de enunciados curtos, foi projetado para gerar diálogos de duração de podcast, narração de audiolivros e cenas multi-locutor em uma única passagem — até 90 minutos, com até 4 vozes distintas e identidade consistente em toda a saída. Duas variantes são distribuídas: Realtime-0.5B para streaming de baixa latência e 1.5B para qualidade carro-chefe em formato longo.

O que é

Arquitetura

Quatro componentes cooperam para produzir áudio um latente de 7,5 Hz por vez:

ComponenteDescrição
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.

Clonagem de voz via voice-cache

A identidade do locutor não vem de uma forma de onda de referência no momento da geração. Em vez disso, cada voz é distribuída como um voice cache pré-calculado em .safetensors contendo os caches KV de condicionamento e os estados ocultos para um locutor específico — produzidos ao executar o áudio de referência pelo caminho do encoder offline. Carregar um voice cache é instantâneo em runtime; uma instância do modelo pode trocar de voz a baixo custo entre gerações.

Voice caches de exemplo (licença MIT): mzbac/vibevoice.swift/voice_cache — 7 vozes em inglês, incluindo Carter, Davis, Emma, Frank, Grace, Mike e Samuel com sotaque indiano.

Modelo

BundleQuantizaçãoTamanhoHuggingFace
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

A quantização usa quantização afim por grupos do MLX (grupo 32). Embeddings, normalizações, convoluções do acoustic-tokenizer e o classificador EOS mantêm o dtype original.

Início 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.

Trocar vozes entre gerações

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 longo 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 (passos do DPM-Solver), --cfg (guidance), --model / --tokenizer para substituir IDs do HuggingFace, --long-form para alternar para a predefinição 1.5B, --verbose para tempos.

Escolhendo entre os módulos TTS do speech-swift

Kokoro-82MQwen3-TTSCosyVoice3VibeVoice RealtimeVibeVoice 1.5B
Parâmetros82M7B7B500M1.5B
BackendCoreML (ANE)MLXMLXMLXMLX
Idiomas810+10+EN/ZHEN/ZH
Clonagem de vozPredefinições fixasReferência ICLReferência zero-shotVoice cacheVoice cache
Formato longoCurto/médioStreamingStreamingStreamingAté 90 min / 4 locutores
Escolha VibeVoice quando…

…você precisar de saída em formato longo, multi-locutor ou podcast/audiolivro em inglês ou chinês, com identidade de voz consistente ao longo de minutos de áudio. Para TTS multilíngue curto, Qwen3-TTS ou CosyVoice3 servem melhor. Para enunciados curtos nativos em iOS, Kokoro é a opção mais leve.