CosyVoice3
Fun-CosyVoice3-0.5B là mô hình tổng hợp giọng nói streaming hỗ trợ 9 ngôn ngữ. Nó sử dụng pipeline ba giai đoạn — sinh token bằng LLM, DiT flow matching và vocoder HiFi-GAN — để tạo ra giọng nói tự nhiên 24 kHz từ văn bản đầu vào. Mô hình — còn được viết là CosyVoice 3 — là phiên bản mới nhất trong dòng CosyVoice của FunAudioLLM.
Ngôn ngữ được hỗ trợ
| Ngôn ngữ | Mã |
|---|---|
| Tiếng Trung | chinese |
| Tiếng Anh | english |
| Tiếng Nhật | japanese |
| Tiếng Hàn | korean |
| Tiếng Đức | german |
| Tiếng Tây Ban Nha | spanish |
| Tiếng Pháp | french |
| Tiếng Ý | italian |
| Tiếng Nga | russian |
Pipeline
CosyVoice3 tổng hợp giọng nói theo ba giai đoạn:
- LLM — Backbone Qwen2.5-0.5B sinh ra token giọng nói FSQ (Finite Scalar Quantization) từ văn bản
- DiT Flow Matching — Một Diffusion Transformer 22 lớp chuyển token giọng nói thành mel spectrogram qua tích phân ODE Euler
- HiFi-GAN — Vocoder Neural Source Filter chuyển mel spectrogram thành dạng sóng 24 kHz
Kiến trúc
LLM (Qwen2.5-0.5B)
Mô hình ngôn ngữ tạo ra các token giọng nói rời rạc theo cách tự hồi quy. Runtime cung cấp bốn phiên bản lượng tử hóa — 4-bit, 8-bit, 8-bit-full (LLM int8 + DiT int8), và bf16 (không lượng tử hóa) — chọn theo mỗi lệnh gọi qua --cosyvoice-variant.
| Tham số | Giá trị |
|---|---|
| Số lớp | 24 |
| Chiều ẩn | 896 |
| Đầu query | 14 |
| Đầu key/value | 2 (GQA) |
| Từ vựng FSQ | 6561 |
| Lượng tử hóa | 4-bit |
DiT Flow Matching
Diffusion Transformer tinh chỉnh token giọng nói thành mel spectrogram bằng flow matching có điều kiện với classifier-free guidance.
| Tham số | Giá trị |
|---|---|
| Số lớp | 22 |
| Chiều | 1024 |
| Đầu attention | 16 |
| Điều kiện hóa | AdaLN (Adaptive Layer Norm) |
| Solver ODE | Euler, 10 bước |
| Tỉ lệ CFG | 0.7 |
Vocoder HiFi-GAN
Vocoder Neural Source Filter (NSF) chuyển mel spectrogram thành dạng sóng.
| Tham số | Giá trị |
|---|---|
| Harmonic | 8 |
| Tỉ lệ upsample | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Tần số lấy mẫu đầu ra | 24 kHz |
Trọng số mô hình
| Phiên bản | LLM | DiT | Kích thước | HuggingFace |
|---|---|---|---|---|
4bit (mặc định) | int4, group=64 | bf16 | ~1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
8bit | int8, group=64 | bf16 | ~1.4 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit |
8bit-full | int8, group=64 | int8, group=64 | ~1.6 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit-full |
bf16 | bf16 | bf16 | ~2.1 GB | aufklarer/CosyVoice3-0.5B-MLX-bf16 |
Mỗi bundle bao gồm LLM, bộ giải mã DiT flow matching, vocoder HiFi-GAN, và bộ mã hóa tham chiếu S3-Tokenizer cần thiết cho việc nhân bản giọng nói zero-shot. Chọn bundle nhỏ hơn để giảm tải xuống/dung lượng đĩa; chọn bf16 khi nhiễu lượng tử hóa LLM/DiT trở thành vấn đề (tổng hợp dài, độ trung thực nhân bản giọng).
Sử dụng CLI
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Ví dụ
# English
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinese
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanish
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# French
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Nhân bản giọng nói
Nhân bản bất kỳ giọng nào từ một clip âm thanh tham chiếu ngắn bằng flag --voice-sample. CosyVoice3 dùng speaker encoder CAM++ để trích xuất một embedding 192 chiều dùng để điều kiện hóa mô hình DiT flow.
# Voice cloning
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Cross-language: clone voice, speak in German
.build/release/speech speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
Cách hoạt động
- Speaker encoder CAM++ trích xuất một embedding 192 chiều từ âm thanh tham chiếu qua CoreML (Neural Engine)
- Phép chiếu affine (192 → 80) điều kiện hóa bộ giải mã DiT flow matching theo giọng đích
- Vocoder HiFi-GAN chuyển mel spectrogram đã điều kiện theo người nói thành âm thanh 24kHz
Speaker encoder
| Thuộc tính | Giá trị |
|---|---|
| Mô hình | CAM++ (Context-Aware Masking++) |
| Embedding | 192 chiều |
| Backend | CoreML (Neural Engine, FP16) |
| Kích thước | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
Mô hình CAM++ sẽ được tải tự động ở lần đầu tiên sử dụng --voice-sample. Xem hướng dẫn Nhân bản giọng nói để biết các mẹo về âm thanh tham chiếu và API Swift.
Hội thoại nhiều người nói
Tổng hợp các cuộc trò chuyện giữa nhiều người nói bằng thẻ người nói inline. Mỗi người nói được gán một giọng từ một file âm thanh tham chiếu qua flag --speakers.
# Two-speaker dialogue with voice cloning
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Three speakers
.build/release/speech speak "[A] Welcome. [B] Thanks! [C] Glad to be here." \
--engine cosyvoice --speakers a=host.wav,b=guest1.wav,c=guest2.wav -o panel.wav
Tên người nói trong thẻ không phân biệt hoa thường và được khớp với các khóa của bảng ánh xạ. Giữa các lượt nói được chèn một khoảng im lặng có thể cấu hình (mặc định 0.2s).
| Tùy chọn | Mặc định | Mô tả |
|---|---|---|
--speakers | Ánh xạ người nói: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Khoảng im lặng giữa các lượt (giây) |
--crossfade | 0.0 | Khoảng crossfade chồng lấp giữa các lượt (giây) |
Thẻ cảm xúc và phong cách
Điều khiển phong cách nói theo từng đoạn bằng thẻ cảm xúc inline. CosyVoice3 dùng phần văn bản tiền tố trước token <|endofprompt|> làm chỉ thị phong cách — các thẻ cảm xúc được ánh xạ thành chỉ thị bằng ngôn ngữ tự nhiên thay thế tiền tố này.
# Emotion tags
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combined with speakers
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Freeform instruction as tag
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Global instruction (applies to all segments without emotion tags)
.build/release/speech speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Thẻ cảm xúc có sẵn
| Thẻ | Chỉ thị |
|---|---|
happy / excited | Nói vui vẻ và đầy hứng khởi. |
sad | Nói buồn bã với giọng điệu u sầu. |
angry | Nói với sự tức giận và mạnh mẽ. |
whispers / whispering | Nói thì thầm nhẹ nhàng và dịu dàng. |
laughs / laughing | Vừa nói vừa cười. |
calm | Nói bình tĩnh và an yên. |
surprised | Nói với sự ngạc nhiên và kinh ngạc. |
serious | Nói với giọng điệu nghiêm túc và trang trọng. |
Các thẻ không xác định được truyền qua như chỉ thị tự do, do đó (Speak in a slow, dramatic voice) sẽ hoạt động đúng như vậy.
Token điều khiển mô hình (token fl_)
Bên trong, LLM của CosyVoice3 sử dụng các token điều khiển đặc biệt — có tiền tố fl_ — để chuyển đổi giữa các chế độ (nhân bản zero-shot, tổng hợp theo chỉ thị, lưu một người nói, v.v.). Các token này thuộc về tokenizer upstream của FunAudioLLM; runtime của Soniqo tự động phát ra token đúng dựa trên flag CLI hoặc lời gọi API Swift bạn sử dụng, nên bạn không bao giờ phải viết chúng bằng tay.
| Token điều khiển | Chế độ | Cách gọi từ Soniqo |
|---|---|---|
<|fl_speaker_clone|> | Nhân bản giọng nói zero-shot từ clip âm thanh tham chiếu | Truyền --voice-sample reference.wav trên CLI, hoặc đặt voiceSample: trên API Swift. |
<|fl_speaker_instruct|> | Tổng hợp có điều kiện theo chỉ thị hoặc phong cách với giọng mặc định | Truyền --cosy-instruct "Speak cheerfully" hoặc dùng thẻ inline (happy) mà không có --voice-sample. |
<|fl_speaker_instruct2|> | Tổng hợp theo chỉ thị kết hợp với giọng tham chiếu đã nhân bản | Kết hợp --voice-sample reference.wav với --cosy-instruct "..." (hoặc một thẻ cảm xúc inline) trong cùng một lời gọi. |
<|fl_save_speaker|> | Lưu trữ embedding của người nói để tái sử dụng mà không cần mã hóa lại âm thanh tham chiếu ở mỗi lời gọi | Không được expose trực tiếp trong CLI Soniqo — embedding được tính theo từng lời gọi. Để cache, tự trích xuất vector CAM++ 192 chiều qua module Embedding người nói rồi truyền tiếp. |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | Các gợi ý nhân bản zero-shot theo từng ngôn ngữ được tokenizer upstream sử dụng | Kết hợp --voice-sample với --language german|spanish|chinese|.... Soniqo chọn gợi ý ngôn ngữ đúng từ flag --language. |
Bảng phía trên ánh xạ mỗi token điều khiển upstream fl_ sang đối tác của nó trong Soniqo. Bạn không bao giờ cần chèn token fl_ vào prompt — chỉ cần truyền các flag CLI cấp cao hoặc các tham số API Swift và runtime sẽ phát ra chuỗi đúng: clone → instruct → instruct2 → save_speaker.
Sampling
Giai đoạn LLM dùng cấu hình sampling sau:
| Tham số | Giá trị |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | Bật (window=10, tau_r=0.1) |
Repetition Aware Sampling (RAS), từ VALL-E 2, phạt các token đã xuất hiện trong 10 token được sinh gần đây. Điều này tránh các artifact âm thanh lặp lại và cải thiện độ ổn định của đầu ra.
Hiệu năng
Trên M2 Max, CosyVoice3 đạt RTF khoảng 0.5 — nhanh hơn thời gian thực.
| Giai đoạn | Độ trễ |
|---|---|
| LLM (đã compile) | ~13 ms/token |
| DiT Flow Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
Giai đoạn LLM dùng compile(shapeless: true) cho vòng lặp tự hồi quy, qua đó loại bỏ chi phí biên dịch lại khi độ dài chuỗi thay đổi. CFG với batch nhân đôi giảm một nửa số lần forward pass của DiT, từ 20 xuống 10.