VibeVoice

⚠ 翻訳が古い

英語版はモデルの言語範囲とボイスクローニングのワークフローについて 2026-05-10 に更新されました。翻訳は後日反映されます。最新情報は 英語版 をご覧ください。

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 INT4 (production)Qwen2 INT4 + dual encoders~1 GBaufklarer/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-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 をどうぞ。