VibeVoice
Microsoft VibeVoice — это модель синтеза речи для длинных форм и многих голосов, поддерживающая английский и китайский. В отличие от TTS для коротких реплик, она спроектирована, чтобы за один проход создавать диалоги длиной с подкаст, нарративы аудиокниг и сцены с несколькими спикерами — до 90 минут, до 4 разных голосов, с сохранением единой идентичности на всём отрезке. Доступны две версии: Realtime-0.5B для потокового режима с низкой задержкой и 1.5B для флагманского качества длинных форм.
Что это
- Длинная форма за один проход — до 90 минут аудио с согласованными голосами на всём выводе; без передачи между предложениями
- Многоголосый диалог — 4 разных спикера одновременно, каждый — со своим voice cache в качестве условия
- Английский + китайский — обучающие аудиоданные только EN/ZH; другие языки не поддерживаются (токенайзер их принимает, но вывод нечленораздельный)
- Моно-вывод 24 кГц — Float32 PCM, готов к подаче в
AudioCommon.WAVWriterиСтримингAudioPlayer - Лицензия MIT — веса модели и наш Swift-порт оба под MIT; INT4-квантованные производные разрешены
Архитектура
Четыре взаимодействующих компонента производят аудио по одному латенту 7,5 Гц за шаг:
| Компонент | Описание |
|---|---|
| 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 | Стриминг 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. |
Клонирование голоса через voice-cache
Личность спикера во время генерации не берётся из эталонной волны. Вместо этого каждый голос поставляется как заранее посчитанный .safetensors voice cache, содержащий условные KV-кэши и скрытые состояния для конкретного спикера — он создаётся офлайн, прогоняя эталонное аудио через энкодер. Загрузка voice cache в рантайме мгновенна; один экземпляр модели может дешево переключать голоса между генерациями.
Примеры voice cache (лицензия MIT): mzbac/vibevoice.swift/voice_cache — 7 английских голосов, включая Carter, Davis, Emma, Frank, Grace, Mike и Samuel с индийским акцентом.
Модель
| Бандл | Квантизация | Размер | 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 |
Квантизация производится models/vibevoice/export/convert.py с помощью групповой аффинной квантизации MLX (группа 32). Эмбеддинги, нормализации, свёртки acoustic-tokenizer и EOS-классификатор остаются в исходном dtype.
Быстрый старт
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
Пресет 1.5B для длинных форм
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
Пресет longForm1_5B увеличивает maxSpeechTokens до 4000 и cfgScale до 1,5 ради более качественного вывода в длинных формах.
Смена голосов между генерациями
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
# Длинная форма 1.5B
audio vibevoice "Long paragraph ..." \
--voice-cache voices/narrator.safetensors \
--long-form \
--max-tokens 4000 \
--output episode.wav
Флаги: --steps (шаги DPM-Solver), --cfg (guidance), --model / --tokenizer для переопределения HuggingFace ID, --long-form для переключения на пресет 1.5B, --verbose — тайминги.
Выбор между TTS-модулями speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Параметры | 82M | 7B | 7B | 500M | 1.5B |
| Бэкенд | CoreML (ANE) | MLX | MLX | MLX | MLX |
| Языки | 8 | 10+ | 10+ | EN/ZH | EN/ZH |
| Клонирование голоса | Фиксированные пресеты | ICL-референс | Zero-shot референс | Voice cache | Voice cache |
| Длинная форма | Коротко/средне | Стриминг | Стриминг | Стриминг | До 90 мин / 4 спикера |
…вам нужен длинный, многоголосый или подкаст/аудиокнижный вывод на английском или китайском, с согласованной голосовой идентичностью на протяжении минут аудио. Для коротких многоязычных TTS лучше подойдут Qwen3-TTS или CosyVoice3. Для нативных коротких реплик на iOS самый компактный вариант — Kokoro.