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ữ
Tiếng Trungchinese
Tiếng Anhenglish
Tiếng Nhậtjapanese
Tiếng Hànkorean
Tiếng Đứcgerman
Tiếng Tây Ban Nhaspanish
Tiếng Phápfrench
Tiếng Ýitalian
Tiếng Ngarussian

Pipeline

CosyVoice3 tổng hợp giọng nói theo ba giai đoạn:

  1. LLM — Backbone Qwen2.5-0.5B sinh ra token giọng nói FSQ (Finite Scalar Quantization) từ văn bản
  2. 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
  3. 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ớp24
Chiều ẩn896
Đầu query14
Đầu key/value2 (GQA)
Từ vựng FSQ6561
Lượng tử hóa4-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ớp22
Chiều1024
Đầu attention16
Điều kiện hóaAdaLN (Adaptive Layer Norm)
Solver ODEEuler, 10 bước
Tỉ lệ CFG0.7

Vocoder HiFi-GAN

Vocoder Neural Source Filter (NSF) chuyển mel spectrogram thành dạng sóng.

Tham sốGiá trị
Harmonic8
Tỉ lệ upsample480x (8 x 5 x 3 x ISTFT 4)
ISTFTn_fft=16, hop=4
Tần số lấy mẫu đầu ra24 kHz

Trọng số mô hình

Phiên bảnLLMDiTKích thướcHuggingFace
4bit (mặc định)int4, group=64bf16~1.2 GBaufklarer/CosyVoice3-0.5B-MLX-4bit
8bitint8, group=64bf16~1.4 GBaufklarer/CosyVoice3-0.5B-MLX-8bit
8bit-fullint8, group=64int8, group=64~1.6 GBaufklarer/CosyVoice3-0.5B-MLX-8bit-full
bf16bf16bf16~2.1 GBaufklarer/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

  1. Speaker encoder CAM++ trích xuất một embedding 192 chiều từ âm thanh tham chiếu qua CoreML (Neural Engine)
  2. Phép chiếu affine (192 → 80) điều kiện hóa bộ giải mã DiT flow matching theo giọng đích
  3. 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ínhGiá trị
Mô hìnhCAM++ (Context-Aware Masking++)
Embedding192 chiều
BackendCoreML (Neural Engine, FP16)
Kích thước~14 MB
HuggingFaceaufklarer/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ọnMặc địnhMô tả
--speakersÁnh xạ người nói: s1=file.wav,s2=file.wav
--turn-gap0.2Khoảng im lặng giữa các lượt (giây)
--crossfade0.0Khoả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 / excitedNói vui vẻ và đầy hứng khởi.
sadNói buồn bã với giọng điệu u sầu.
angryNói với sự tức giận và mạnh mẽ.
whispers / whisperingNói thì thầm nhẹ nhàng và dịu dàng.
laughs / laughingVừa nói vừa cười.
calmNói bình tĩnh và an yên.
surprisedNói với sự ngạc nhiên và kinh ngạc.
seriousNó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ểnChế độ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ếuTruyề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 địnhTruyề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ảnKế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ọiKhô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ụngKết hợp --voice-sample với --language german|spanish|chinese|.... Soniqo chọn gợi ý ngôn ngữ đúng từ flag --language.
Nếu bạn đang port từ FunAudioLLM/CosyVoice

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-k25
Top-p0.8
Repetition Aware SamplingBậ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 Matching370 - 520 ms
HiFi-GAN50 - 170 ms
Biên dịch

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.