VibeVoice

Microsoft VibeVoice は英語と中国語向けの長尺・マルチスピーカー TTS モデルです。短い発話用の TTS と異なり、ポッドキャスト級の対話、オーディオブックのナレーション、マルチスピーカーシーンを 1 度の生成で出力するよう設計されており——最長 90 分、最大 4 つの異なる音声、出力全体で一貫したアイデンティティを保持します。2 つのバリアントがあります: 低レイテンシのストリーミング向け Realtime-0.5B、長尺フラッグシップ品質の 1.5B

概要

アーキテクチャ

4 つのコンポーネントが連携し、7.5 Hz のレイテントを一つずつ音声に変換します:

コンポーネント説明
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 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 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.

voice-cache による音声クローン

生成時、話者のアイデンティティは参照音声から直接取得しません。代わりに、各音声は事前計算された .safetensors 形式の voice cache として配布されます。これは特定話者の条件 KV キャッシュと隠れ状態を含み、参照音声をエンコーダ経路に通すことでオフラインで生成されます。ランタイムで voice cache を読み込むのは瞬時で、1 つのモデルインスタンスが生成間で音声を低コストに切り替えられます。

サンプル voice cache(MIT ライセンス): mzbac/vibevoice.swift/voice_cache —— Carter、Davis、Emma、Frank、Grace、Mike、インドアクセントの Samuel を含む 7 種の英語ボイス。

モデル

バンドル量子化サイズHuggingFace
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 INT4Qwen2 INT4~1 GBaufklarer/VibeVoice-1.5B-MLX-INT4

量子化は models/vibevoice/export/convert.py による MLX グループ単位アフィン量子化(32 グループ)で生成されます。Embeddings、ノルム、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(ガイダンス強度)、--model / --tokenizer で HuggingFace ID を上書き、--long-form で 1.5B プリセットに切替、--verbose で計測値を表示。

speech-swift の TTS モジュール選択

Kokoro-82MQwen3-TTSCosyVoice3VibeVoice RealtimeVibeVoice 1.5B
パラメータ82M7B7B500M1.5B
バックエンドCoreML (ANE)MLXMLXMLXMLX
言語810+10+EN/ZHEN/ZH
音声クローン固定プリセットICL 参照音声ゼロショット参照voice cachevoice cache
長尺短〜中ストリーミングストリーミングストリーミング最長 90 分 / 4 話者
VibeVoice を選ぶべきとき……

……英語や中国語で長尺・マルチスピーカー・ポッドキャスト/オーディオブック出力が必要で、数分間にわたって一貫した音声アイデンティティを保ちたいとき。短尺の多言語 TTS には Qwen3-TTSCosyVoice3 が適しています。iOS ネイティブの短発話には最小の選択肢である Kokoro をどうぞ。