VibeVoice
Microsoft VibeVoice は英語と中国語向けの長尺・マルチスピーカー TTS モデルです。短い発話用の TTS と異なり、ポッドキャスト級の対話、オーディオブックのナレーション、マルチスピーカーシーンを 1 度の生成で出力するよう設計されており——最長 90 分、最大 4 つの異なる音声、出力全体で一貫したアイデンティティを保持します。2 つのバリアントがあります: 低レイテンシのストリーミング向け Realtime-0.5B、長尺フラッグシップ品質の 1.5B。
概要
- 1 度の生成で長尺出力 — 最長 90 分の音声を、出力全体で声を保ちながら生成(文ごとの引き継ぎなし)
- マルチスピーカー対話 — 同時に 4 名の異なる話者を扱い、各話者は専用の voice cache で条件付け
- 英語 + 中国語 — 学習音声は EN/ZH のみ。他言語は非対応(トークナイザは受理しても出力は意味不明)
- 24 kHz モノラル出力 — Float32 PCM。
AudioCommon.WAVWriterやストリーミングAudioPlayerにそのまま投入可能 - MIT ライセンス — モデル重みと当方の Swift 移植は両方とも MIT。INT4 量子化派生も許可
アーキテクチャ
4 つのコンポーネントが連携し、7.5 Hz のレイテントを一つずつ音声に変換します:
| コンポーネント | 説明 |
|---|---|
| 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 を読み込むのは瞬時で、1 つのモデルインスタンスが生成間で音声を低コストに切り替えられます。
サンプル voice cache(MIT ライセンス): mzbac/vibevoice.swift/voice_cache —— Carter、Davis、Emma、Frank、Grace、Mike、インドアクセントの Samuel を含む 7 種の英語ボイス。
モデル
| バンドル | 量子化 | サイズ | 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 グループ)で生成されます。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-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 参照音声 | ゼロショット参照 | voice cache | voice cache |
| 長尺 | 短〜中 | ストリーミング | ストリーミング | ストリーミング | 最長 90 分 / 4 話者 |
……英語や中国語で長尺・マルチスピーカー・ポッドキャスト/オーディオブック出力が必要で、数分間にわたって一貫した音声アイデンティティを保ちたいとき。短尺の多言語 TTS には Qwen3-TTS や CosyVoice3 が適しています。iOS ネイティブの短発話には最小の選択肢である Kokoro をどうぞ。