VibeVoice
Microsoft VibeVoice ist ein Langform-/Multi-Speaker-TTS-Modell für Englisch und Chinesisch. Anders als TTS für kurze Äußerungen ist es darauf ausgelegt, podcastlange Dialoge, Hörbuchnarration und Multi-Speaker-Szenen in einem einzigen Durchgang zu erzeugen — bis zu 90 Minuten mit bis zu 4 verschiedenen Stimmen und durchgängig konsistenter Identität. Zwei Varianten sind verfügbar: Realtime-0.5B für latenzarmes Streaming und 1.5B für Flaggschiff-Qualität in Langform.
Was es ist
- Langform in einem Durchgang — bis zu 90 Minuten Audio mit konsistenten Stimmen über die gesamte Ausgabe; keine Übergabe pro Satz
- Multi-Speaker-Dialog — 4 verschiedene Sprecher gleichzeitig, jeder konditioniert durch seinen eigenen Voice-Cache
- Englisch + Chinesisch — die Trainings-Audiodaten sind nur EN/ZH; andere Sprachen werden nicht unterstützt (der Tokenizer akzeptiert sie, die Ausgabe ist jedoch unverständlich)
- 24-kHz-Mono-Ausgabe — Float32-PCM, drop-in für
AudioCommon.WAVWriterundStreamingAudioPlayer - MIT-Lizenz — Modellgewichte und unser Swift-Port sind beide MIT; INT4-quantisierte Ableitungen sind zulässig
Architektur
Vier zusammenarbeitende Komponenten erzeugen Audio jeweils ein 7,5-Hz-Latent zur Zeit:
| Komponente | Beschreibung |
|---|---|
| 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. |
Stimmklonen über Voice-Cache
Die Sprecheridentität kommt zur Generierungszeit nicht aus einer Referenzwellenform. Stattdessen wird jede Stimme als vorberechneter .safetensors-Voice-Cache ausgeliefert, der die Konditionierungs-KV-Caches und Hidden-States für einen bestimmten Sprecher enthält — erzeugt durch Offline-Durchlauf des Referenzaudios durch den Encoder. Das Laden eines Voice-Cache ist zur Laufzeit instantan; eine Modellinstanz kann zwischen Generierungen kostengünstig die Stimme wechseln.
Beispiel-Voice-Caches (MIT-lizenziert): mzbac/vibevoice.swift/voice_cache — 7 englische Stimmen inklusive Carter, Davis, Emma, Frank, Grace, Mike und dem indisch akzentuierten Samuel.
Modell
| Bundle | Quantisierung | Größe | 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 | Qwen2 INT4 | ~1 GB | aufklarer/VibeVoice-1.5B-MLX-INT4 |
Die Quantisierung erzeugt models/vibevoice/export/convert.py mit MLX-gruppenweiser affiner Quantisierung (32er-Gruppen). Embeddings, Normalisierungen, Acoustic-Tokenizer-Faltungen und der EOS-Klassifikator behalten ihren ursprünglichen Dtype.
Schnellstart
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
Langform-1.5B-Preset
let config = VibeVoiceTTSModel.Configuration.longForm1_5B
let tts = try await VibeVoiceTTSModel.fromPretrained(configuration: config)
try tts.loadVoice(from: "voices/narrator.safetensors")
let pcm = try await tts.generate(text: longTranscript) // up to ~90 min
Das Preset longForm1_5B hebt maxSpeechTokens auf 4000 und cfgScale auf 1.5 für höhere Klangtreue im Langform-Output an.
Stimmen zwischen Generierungen wechseln
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
audio vibevoice "Hello world." \
--voice-cache voice_cache/en-Mike_man.safetensors \
--output hello.wav
# Langform 1.5B
audio vibevoice "Long paragraph ..." \
--voice-cache voices/narrator.safetensors \
--long-form \
--max-tokens 4000 \
--output episode.wav
Flags: --steps (DPM-Solver-Schritte), --cfg (Guidance), --model / --tokenizer zum Überschreiben der HuggingFace-IDs, --long-form für das 1.5B-Preset, --verbose für Zeitmessung.
Auswahl unter den TTS-Modulen von speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Parameter | 82M | 7B | 7B | 500M | 1.5B |
| Backend | CoreML (ANE) | MLX | MLX | MLX | MLX |
| Sprachen | 8 | 10+ | 10+ | EN/ZH | EN/ZH |
| Stimmklonen | Feste Presets | ICL-Referenz | Zero-Shot-Referenz | Voice-Cache | Voice-Cache |
| Langform | Kurz/Mittel | Streaming | Streaming | Streaming | Bis zu 90 Min. / 4 Sprecher |
…du Langform-, Multi-Speaker- oder Podcast-/Hörbuch-Output in Englisch oder Chinesisch benötigst, mit konsistenter Stimmidentität über minutenlanges Audio. Für mehrsprachiges Kurzform-TTS passen Qwen3-TTS oder CosyVoice3 besser. Für iOS-native Kurzäußerungen ist Kokoro die kleinste Option.