VibeVoice
Microsoft VibeVoice เป็นโมเดลข้อความเป็นเสียงพูดแบบยาวหลายผู้พูดสำหรับภาษาอังกฤษและจีน ต่างจาก TTS แบบประโยคสั้น โมเดลนี้ออกแบบมาเพื่อสร้างบทสนทนาความยาวระดับพอดแคสต์ การบรรยายหนังสือเสียง และฉากหลายผู้พูดในรอบเดียว — สูงสุด 90 นาที พร้อมเสียงที่แตกต่างกันถึง 4 เสียงและคงเอกลักษณ์ตลอดทั้งเรื่อง มีสองรุ่นย่อย: Realtime-0.5B สำหรับการสตรีมหน่วงต่ำ และ 1.5B สำหรับคุณภาพระดับเรือธงในรูปแบบยาว
คืออะไร
- รูปแบบยาวในรอบเดียว — เสียงสูงสุด 90 นาทีพร้อมเสียงที่สม่ำเสมอตลอดเอาต์พุตทั้งหมด; ไม่มีการส่งต่อระหว่างประโยค
- บทสนทนาหลายผู้พูด — 4 ผู้พูดที่แตกต่างกันในเวลาเดียวกัน แต่ละคนถูกกำหนดเงื่อนไขด้วย voice cache ของตนเอง
- อังกฤษ + จีน — ข้อมูลเสียงสำหรับฝึกเป็น EN/ZH เท่านั้น; ภาษาอื่นไม่รองรับ (tokenizer ยอมรับแต่เอาต์พุตไม่สามารถเข้าใจได้)
- เอาต์พุตโมโน 24 kHz — Float32 PCM พร้อมใช้กับ
AudioCommon.WAVWriterและStreamingAudioPlayer - สัญญาอนุญาต MIT — น้ำหนักโมเดลและพอร์ต Swift ของเราเป็น MIT ทั้งคู่; อนุญาตให้ทำอนุพันธ์ที่ลดความละเอียดเป็น INT4
สถาปัตยกรรม
สี่ส่วนทำงานร่วมกันเพื่อสร้างเสียงทีละ 1 latent ที่ 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 | Streaming 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. |
ภาษา
ตามการ์ดโมเดลของ Microsoft: Realtime-0.5B รองรับเฉพาะภาษาอังกฤษ (เดโมต้นทางมาพร้อมกับ voice prompt ที่ไม่ใช่ภาษาอังกฤษ 9 ตัวสำหรับการสำรวจ คุณภาพไม่ได้รับการรับประกัน) 1.5B รองรับภาษาอังกฤษและจีน; ภาษาอื่นอาจสร้างเสียงที่ฟังดูสมเหตุสมผลแต่ไม่ตรงตามต้นฉบับและควรถือเป็นการทดลอง
เอกลักษณ์เสียง — สองเส้นทางที่แตกต่างกัน
สองรุ่นย่อยใช้วิธีการกำหนดเงื่อนไขผู้พูดที่ต่างกันมาก และแต่ละเส้นทางมีข้อจำกัดที่ควรทราบล่วงหน้า
Realtime-0.5B — voice cache สำเร็จรูป
เอกลักษณ์ผู้พูดมาจาก voice cache .safetensors ที่คำนวณไว้ล่วงหน้า ซึ่งประกอบด้วย KV cache สำหรับการกำหนดเงื่อนไขและสถานะซ่อนสำหรับผู้พูดเฉพาะ การโหลด cache เป็นไปอย่างทันที; โมเดลหนึ่งอินสแตนซ์สามารถสลับเสียงระหว่างการสร้างได้ในต้นทุนต่ำ
checkpoint Realtime-0.5B ถูกแจกจ่ายในโหมด inference เท่านั้น — Microsoft ไม่ได้แจกจ่าย acoustic encoder ดังนั้นจึงไม่สามารถสร้าง voice cache จากเสียงดิบสำหรับโมเดลนี้ได้ แหล่งที่รองรับคือหนึ่งใน .pt voice cache สำเร็จรูปของ Microsoft (Carter, Davis, Emma, Frank, Grace, Mike, Samuel สำหรับภาษาอังกฤษ บวกกับเสียง de/fr/it/jp/kr/nl/pl/pt เชิงสำรวจ) ที่ถูกแปลงเป็นรูปแบบ .safetensors ที่ loader นี้ต้องการ
1.5B long-form — การโคลนเสียงจากเสียงดิบ
checkpoint 1.5B มี acoustic encoder มาด้วย จึงสามารถโคลนผู้พูดใดก็ได้จากคลื่นเสียงอ้างอิง + บทถอดความในรอบเดียว การเข้ารหัสถูกทำแบบ inline ในการเรียกสังเคราะห์ทุกครั้ง — ไม่มีไฟล์ voice cache แยกที่ต้องจัดการ
speech vibevoice-encode-voice ถูกบล็อกหน้าต่าง CLI สำหรับการสร้าง voice cache แบบออฟไลน์สำหรับ Realtime-0.5B จะล้มเหลวอย่างรวดเร็วพร้อมตัวชี้ไปยังเวิร์กโฟลว์เสียงดิบของ 1.5B เพราะน้ำหนัก encoder ไม่อยู่ใน checkpoint 0.5B จนกว่า Microsoft จะปล่อยออกมา นี่คือเส้นทาง end-to-end เดียวสำหรับการโคลนผู้พูดที่กำหนดเอง
โมเดล
| Bundle | การลดความละเอียด | ขนาด | 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 |
การลดความละเอียดใช้ group-wise affine quant ของ MLX (กลุ่ม 32) Embedding, norm, convolution ของ acoustic tokenizer และ EOS classifier ยังคงเป็น 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 (API ต่างกัน)
1.5B มีสถาปัตยกรรมที่ต่างกัน (Qwen2 LM แบบรวม dual encoder การสุ่มตัวอย่าง LM token) จึงถูกปล่อยออกมาเป็นคลาสแยก — VibeVoice15BTTSModel เสียงอ้างอิง + ข้อความเข้าด้วยกันในการเรียกครั้งเดียว:
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
)
ไม่ต้องใช้ voice cache — โมเดลเข้ารหัสเสียงอ้างอิงผ่านทั้ง acoustic_tokenizer (64-dim) และ semantic_tokenizer (128-dim ฝึกแบบ ASR) แล้วรวมเข้าด้วยกันที่ตำแหน่ง audio prompt การสร้างทำการสุ่มตัวอย่าง LM token แตกแขนงตาม <speech_diffusion> / <speech_end> / ข้อความ — แพร่ acoustic latent เมื่อ LM ปล่อย speech token เท่านั้น
ตรวจสอบด้วย ASR บน M2 Max INT4 (RTFx 1.48): สำหรับอินพุต "Hello world. This is the one point five billion VibeVoice variant of the Microsoft text to speech model.", Nemotron ถอดเอาต์พุตเป็น "hello world, this is the one point five billion via voice variant of the microsoft texas speech model" — คำเนื้อหาทุกคำตรงกัน มีเพียงการแทนที่ทางเสียงคือ VibeVoice → via voice และ 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
Realtime-0.5B พร้อม voice cache ของ Microsoft ที่แปลงแล้ว (ภาษาอังกฤษ):
speech vibevoice "Hello world." \
--voice-cache voice_cache/en-Mike_man.safetensors \
--output hello.wav
1.5B long-form พร้อมเสียงอ้างอิงดิบ + บทถอดความ (โคลนผู้พูดใดก็ได้ ภาษาอังกฤษหรือจีน):
speech vibevoice "Long paragraph ..." \
--long-form \
--reference-audio voice.wav \
--reference-transcript "what was actually said in voice.wav" \
--max-tokens 4000 \
--output episode.wav
แฟล็ก: --steps (จำนวนสเต็ป DPM-Solver), --cfg (guidance), --model / --tokenizer เพื่อเขียนทับ ID ของ HuggingFace, --long-form เพื่อเปลี่ยนไปใช้ preset 1.5B, --verbose สำหรับดูเวลา
เลือกระหว่างโมดูล TTS ของ speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| พารามิเตอร์ | 82M | 7B | 7B | 500M | 1.5B |
| Backend | CoreML (ANE) | MLX | MLX | MLX | MLX |
| ภาษา | 8 | 10+ | 10+ | EN เท่านั้น | EN + ZH |
| การโคลนเสียง | Preset คงที่ | ICL อ้างอิง | อ้างอิงแบบ zero-shot | เฉพาะ voice cache สำเร็จรูป | เสียงดิบ + บทถอดความ |
| รูปแบบยาว | สั้น/กลาง | Streaming | Streaming | Streaming | สูงสุด 90 นาที / 4 ผู้พูด |
…คุณต้องการเอาต์พุตแบบยาว หลายผู้พูด หรือพอดแคสต์/หนังสือเสียงในภาษาอังกฤษหรือจีน โดยมีเอกลักษณ์เสียงสม่ำเสมอตลอดเสียงหลายนาที สำหรับ TTS หลายภาษาแบบสั้น Qwen3-TTS หรือ CosyVoice3 เหมาะกว่า สำหรับประโยคสั้นแบบเนทีฟบน iOS Kokoro เป็นตัวเลือกที่เล็กที่สุด