VibeVoice
英語版はモデルの言語範囲とボイスクローニングのワークフローについて 2026-05-10 に更新されました。翻訳は後日反映されます。最新情報は 英語版 をご覧ください。
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 (production) | Qwen2 INT4 + dual encoders | ~1 GB | aufklarer/VibeVoice-1.5B-MLX-INT4 |
量子化は 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
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.
生成間で音声を切り替える
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
# 長尺 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
フラグ: --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 をどうぞ。