CosyVoice3
Fun-CosyVoice3-0.5B는 9개 언어를 지원하는 스트리밍 텍스트-음성 변환 모델입니다. LLM 토큰 생성, DiT 플로우 매칭, HiFi-GAN 보코딩의 3단계 파이프라인을 사용하여 텍스트 입력으로부터 자연스러운 24 kHz 음성을 생성합니다.
지원 언어
| 언어 | 코드 |
|---|---|
| 중국어 | chinese |
| 영어 | english |
| 일본어 | japanese |
| 한국어 | korean |
| 독일어 | german |
| 스페인어 | spanish |
| 프랑스어 | french |
| 이탈리아어 | italian |
| 러시아어 | russian |
파이프라인
CosyVoice3는 3단계로 음성을 합성합니다:
- LLM — Qwen2.5-0.5B 백본이 텍스트로부터 FSQ(Finite Scalar Quantization) 음성 토큰을 생성
- DiT 플로우 매칭 — 22 레이어 Diffusion Transformer가 Euler ODE 적분을 통해 음성 토큰을 멜 스펙트로그램으로 변환
- HiFi-GAN — Neural Source Filter 보코더가 멜 스펙트로그램을 24 kHz 파형으로 변환
아키텍처
LLM (Qwen2.5-0.5B)
언어 모델은 4비트로 양자화되어 있으며 이산 음성 토큰을 자동 회귀적으로 생성합니다.
| 파라미터 | 값 |
|---|---|
| 레이어 | 24 |
| 은닉 차원 | 896 |
| Query 헤드 | 14 |
| Key/Value 헤드 | 2 (GQA) |
| FSQ 어휘 | 6561 |
| 양자화 | 4비트 |
DiT 플로우 매칭
Diffusion Transformer는 classifier-free guidance와 함께 조건부 플로우 매칭을 사용하여 음성 토큰을 멜 스펙트로그램으로 정제합니다.
| 파라미터 | 값 |
|---|---|
| 레이어 | 22 |
| 차원 | 1024 |
| 어텐션 헤드 | 16 |
| 컨디셔닝 | AdaLN (Adaptive Layer Norm) |
| ODE 솔버 | Euler, 10 스텝 |
| CFG 비율 | 0.7 |
HiFi-GAN 보코더
멜 스펙트로그램을 파형으로 변환하는 Neural Source Filter(NSF) 보코더입니다.
| 파라미터 | 값 |
|---|---|
| 하모닉스 | 8 |
| 업샘플 비율 | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| 출력 샘플 레이트 | 24 kHz |
모델 웨이트
| 모델 | 크기 | HuggingFace |
|---|---|---|
| CosyVoice3-0.5B (4비트 LLM) | 1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
LLM(4비트 양자화), DiT 플로우 매칭, HiFi-GAN 보코더 웨이트를 포함합니다.
CLI 사용법
.build/release/audio speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
예제
# 영어
.build/release/audio speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# 중국어
.build/release/audio speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# 스페인어
.build/release/audio speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# 프랑스어
.build/release/audio speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
음성 복제
--voice-sample 플래그를 사용하여 짧은 레퍼런스 오디오 샘플에서 어떤 음성이든 복제할 수 있습니다. CosyVoice3는 CAM++ 화자 인코더를 사용하여 192차원 임베딩을 추출하고 이를 DiT 플로우 모델에 조건으로 전달합니다.
# 음성 복제
.build/release/audio speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# 교차 언어: 음성은 복제하고 독일어로 발화
.build/release/audio speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
동작 원리
- CAM++ 화자 인코더는 CoreML(Neural Engine)을 통해 레퍼런스 오디오에서 192차원 임베딩을 추출
- 아핀 투영 (192 → 80)은 타깃 음성에 맞춰 DiT 플로우 매칭 디코더를 조건화
- HiFi-GAN 보코더는 화자로 조건화된 멜 스펙트로그램을 24 kHz 오디오로 변환
화자 인코더
| 속성 | 값 |
|---|---|
| 모델 | CAM++ (Context-Aware Masking++) |
| 임베딩 | 192차원 |
| 백엔드 | CoreML (Neural Engine, FP16) |
| 크기 | 약 14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
CAM++ 모델은 --voice-sample을 처음 사용할 때 자동으로 다운로드됩니다. 레퍼런스 오디오 팁과 Swift API는 음성 복제 가이드를 참조하세요.
다화자 대화
인라인 화자 태그를 사용하여 여러 화자 간의 대화를 합성합니다. 각 화자는 --speakers 플래그를 통해 레퍼런스 오디오 파일에서 음성이 할당됩니다.
# 음성 복제가 포함된 두 화자 대화
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# 세 명의 화자
.build/release/audio 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
태그의 화자 이름은 대소문자를 구분하지 않으며 매핑 키와 매치됩니다. 턴 사이에 구성 가능한 침묵 간격(기본값 0.2초)이 삽입됩니다.
| 옵션 | 기본값 | 설명 |
|---|---|---|
--speakers | 화자 매핑: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | 턴 사이의 침묵 (초) |
--crossfade | 0.0 | 턴 간의 크로스페이드 오버랩 (초) |
감정 및 스타일 태그
인라인 감정 태그를 사용하여 세그먼트별 발화 스타일을 제어합니다. CosyVoice3는 <|endofprompt|> 토큰 앞의 텍스트 접두사를 스타일 지시로 사용합니다 — 감정 태그는 이 접두사를 대체하는 자연어 지시로 매핑됩니다.
# 감정 태그
.build/release/audio speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# 화자와 결합
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# 자유형 지시를 태그로 사용
.build/release/audio speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# 전역 지시 (감정 태그가 없는 모든 세그먼트에 적용)
.build/release/audio speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
내장 감정 태그
| 태그 | 지시 |
|---|---|
happy / excited | Speak happily and with excitement. |
sad | Speak sadly with a melancholic tone. |
angry | Speak with anger and intensity. |
whispers / whispering | Speak in a soft, gentle whisper. |
laughs / laughing | Speak while laughing. |
calm | Speak calmly and peacefully. |
surprised | Speak with surprise and amazement. |
serious | Speak in a serious, formal tone. |
알 수 없는 태그는 자유형 지시로 통과되므로 (Speak in a slow, dramatic voice)와 같은 표현도 그대로 동작합니다.
샘플링
LLM 단계는 다음 샘플링 구성을 사용합니다:
| 파라미터 | 값 |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| 반복 인지 샘플링 | 활성화 (window=10, tau_r=0.1) |
VALL-E 2에서 도입된 반복 인지 샘플링(RAS)은 최근 생성된 10개 토큰에 등장한 토큰에 페널티를 부여합니다. 이는 반복적인 오디오 아티팩트를 방지하고 출력 안정성을 개선합니다.
성능
M2 Max에서 CosyVoice3는 약 0.5의 RTF를 달성합니다 — 실시간보다 빠릅니다.
| 단계 | 지연 시간 |
|---|---|
| LLM (컴파일됨) | 약 13 ms/토큰 |
| DiT 플로우 매칭 | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
LLM 단계는 자동 회귀 루프에 compile(shapeless: true)를 사용하여, 다양한 시퀀스 길이에 걸친 재컴파일 오버헤드를 제거합니다. 배치 더블링된 CFG는 DiT 포워드 패스 횟수를 20에서 10으로 절반으로 줄입니다.