VibeVoice
Microsoft VibeVoice là một mô hình văn bản sang giọng nói định dạng dài, nhiều người nói cho tiếng Anh và tiếng Trung. Khác với TTS phát ngôn ngắn, mô hình được thiết kế để tạo ra hội thoại dài cỡ podcast, lồng tiếng sách nói và các cảnh nhiều người nói trong một lượt duy nhất — lên đến 90 phút với tối đa 4 giọng nói riêng biệt và bản sắc nhất quán xuyên suốt. Có hai biến thể: Realtime-0.5B cho streaming độ trễ thấp và 1.5B cho chất lượng đầu bảng ở định dạng dài.
Đặc điểm
- Định dạng dài trong một lượt — lên đến 90 phút âm thanh với giọng nói nhất quán trên toàn bộ đầu ra; không bàn giao theo từng câu
- Hội thoại nhiều người nói — 4 người nói khác biệt cùng lúc, mỗi người được điều kiện hóa bởi voice cache riêng
- Tiếng Anh + tiếng Trung — dữ liệu âm thanh huấn luyện chỉ là EN/ZH; các ngôn ngữ khác không được hỗ trợ (tokenizer chấp nhận nhưng đầu ra không thể hiểu được)
- Đầu ra mono 24 kHz — PCM Float32, sẵn sàng cắm vào
AudioCommon.WAVWritervàStreamingAudioPlayer - Giấy phép MIT — trọng số mô hình và port Swift của chúng tôi đều theo MIT; cho phép các phái sinh lượng tử hóa INT4
Kiến trúc
Bốn thành phần phối hợp tạo ra âm thanh, mỗi lần một latent 7,5 Hz:
| Thành phần | Mô tả |
|---|---|
| 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. |
Ngôn ngữ
Theo thẻ mô hình của Microsoft: Realtime-0.5B chỉ hỗ trợ tiếng Anh (demo gốc đi kèm 9 voice prompt phi tiếng Anh mang tính thử nghiệm; chất lượng không được đảm bảo). 1.5B hỗ trợ tiếng Anh và tiếng Trung; các ngôn ngữ khác có thể tạo ra âm thanh nghe có vẻ hợp lý nhưng không trung thực và nên được coi là thử nghiệm.
Bản sắc giọng nói — hai con đường riêng biệt
Hai biến thể tiếp cận việc điều kiện hóa người nói theo cách rất khác nhau, và mỗi con đường có các ràng buộc đáng biết trước.
Realtime-0.5B — voice cache dựng sẵn
Bản sắc người nói đến từ một voice cache .safetensors tính trước, chứa các KV cache điều kiện và trạng thái ẩn cho một người nói cụ thể. Tải một cache là tức thì; một instance mô hình có thể đổi giọng nói với chi phí thấp giữa các lần tạo.
Checkpoint Realtime-0.5B được phân phối ở chế độ chỉ suy luận — Microsoft không cung cấp acoustic encoder, vì vậy voice cache không thể được tạo từ âm thanh thô đối với mô hình này. Nguồn được hỗ trợ là một trong các .pt voice cache dựng sẵn của Microsoft (Carter, Davis, Emma, Frank, Grace, Mike, Samuel cho tiếng Anh, cùng các giọng de/fr/it/jp/kr/nl/pl/pt mang tính thử nghiệm), được làm phẳng vào bố cục .safetensors mà loader này yêu cầu.
1.5B long-form — nhân bản giọng nói từ âm thanh thô
Checkpoint 1.5B có đi kèm acoustic encoder, vì vậy nó có thể nhân bản một người nói tùy ý từ dạng sóng tham chiếu + bản chép lại trong một lượt duy nhất. Việc mã hóa được thực hiện inline trên mỗi lần gọi tổng hợp — không có tệp voice cache riêng để quản lý.
speech vibevoice-encode-voice bị chặnBề mặt CLI cho việc tạo voice cache offline đối với Realtime-0.5B sẽ thất bại nhanh kèm con trỏ dẫn đến quy trình âm thanh thô của 1.5B, vì trọng số encoder không có trong checkpoint 0.5B. Cho đến khi Microsoft cung cấp chúng, đây là con đường end-to-end duy nhất để nhân bản một người nói tùy chỉnh.
Mô hình
| Bundle | Lượng tử hóa | Kích thước | 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 |
Lượng tử hóa sử dụng group-wise affine quant của MLX (nhóm 32). Embedding, norm, các convolution của acoustic tokenizer và EOS classifier giữ nguyên dtype gốc.
Bắt đầu nhanh
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 khác)
1.5B có kiến trúc khác (Qwen2 LM hợp nhất, hai encoder, lấy mẫu token LM) nên được phát hành dưới dạng một lớp riêng — VibeVoice15BTTSModel. Âm thanh tham chiếu + văn bản đi trong một lời gọi duy nhất:
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
)
Không cần voice cache — mô hình mã hóa âm thanh tham chiếu qua cả acoustic_tokenizer (64-dim) lẫn semantic_tokenizer (128-dim, huấn luyện ASR) rồi cộng chúng tại các vị trí audio prompt. Việc sinh chạy lấy mẫu token LM rẽ nhánh trên <speech_diffusion> / <speech_end> / văn bản — chỉ khuếch tán một latent acoustic khi LM phát ra token speech.
Đã kiểm chứng bằng ASR trên M2 Max INT4 (RTFx 1,48): với đầu vào "Hello world. This is the one point five billion VibeVoice variant of the Microsoft text to speech model.", Nemotron chép lại đầu ra thành "hello world, this is the one point five billion via voice variant of the microsoft texas speech model" — tất cả các từ nội dung khớp, chỉ có thay thế âm học là VibeVoice → via voice và text to → texas.
Đổi giọng nói giữa các lần tạo
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 với voice cache đã chuyển đổi của Microsoft (tiếng Anh):
speech vibevoice "Hello world." \
--voice-cache voice_cache/en-Mike_man.safetensors \
--output hello.wav
1.5B long-form với âm thanh tham chiếu thô + bản chép lại (nhân bản một người nói tùy ý, tiếng Anh hoặc tiếng Trung):
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
Các cờ: --steps (số bước DPM-Solver), --cfg (guidance), --model / --tokenizer để ghi đè ID HuggingFace, --long-form để chuyển sang preset 1.5B, --verbose để xem thời gian.
Chọn giữa các module TTS của speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VibeVoice Realtime | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Tham số | 82M | 7B | 7B | 500M | 1.5B |
| Backend | CoreML (ANE) | MLX | MLX | MLX | MLX |
| Ngôn ngữ | 8 | 10+ | 10+ | Chỉ EN | EN + ZH |
| Nhân bản giọng nói | Preset cố định | Tham chiếu ICL | Tham chiếu zero-shot | Chỉ voice cache dựng sẵn | Âm thanh thô + bản chép lại |
| Định dạng dài | Ngắn/trung bình | Streaming | Streaming | Streaming | Lên đến 90 phút / 4 người nói |
…bạn cần đầu ra định dạng dài, nhiều người nói, hoặc podcast/sách nói bằng tiếng Anh hoặc tiếng Trung, với bản sắc giọng nói nhất quán xuyên suốt nhiều phút âm thanh. Đối với TTS đa ngôn ngữ định dạng ngắn, Qwen3-TTS hoặc CosyVoice3 phù hợp hơn. Đối với phát ngôn ngắn bản địa trên iOS, Kokoro là lựa chọn nhỏ nhất.