CosyVoice3

Fun-CosyVoice3-0.5B는 9개 언어를 지원하는 스트리밍 텍스트-음성 변환 모델입니다. LLM 토큰 생성, DiT 플로우 매칭, HiFi-GAN 보코딩의 3단계 파이프라인을 사용하여 텍스트 입력으로부터 자연스러운 24 kHz 음성을 생성합니다.

지원 언어

언어코드
중국어chinese
영어english
일본어japanese
한국어korean
독일어german
스페인어spanish
프랑스어french
이탈리아어italian
러시아어russian

파이프라인

CosyVoice3는 3단계로 음성을 합성합니다:

  1. LLM — Qwen2.5-0.5B 백본이 텍스트로부터 FSQ(Finite Scalar Quantization) 음성 토큰을 생성
  2. DiT 플로우 매칭 — 22 레이어 Diffusion Transformer가 Euler ODE 적분을 통해 음성 토큰을 멜 스펙트로그램으로 변환
  3. 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)
ISTFTn_fft=16, hop=4
출력 샘플 레이트24 kHz

모델 웨이트

모델크기HuggingFace
CosyVoice3-0.5B (4비트 LLM)1.2 GBaufklarer/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

동작 원리

  1. CAM++ 화자 인코더는 CoreML(Neural Engine)을 통해 레퍼런스 오디오에서 192차원 임베딩을 추출
  2. 아핀 투영 (192 → 80)은 타깃 음성에 맞춰 DiT 플로우 매칭 디코더를 조건화
  3. HiFi-GAN 보코더는 화자로 조건화된 멜 스펙트로그램을 24 kHz 오디오로 변환

화자 인코더

속성
모델CAM++ (Context-Aware Masking++)
임베딩192차원
백엔드CoreML (Neural Engine, FP16)
크기약 14 MB
HuggingFaceaufklarer/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-gap0.2턴 사이의 침묵 (초)
--crossfade0.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 / excitedSpeak happily and with excitement.
sadSpeak sadly with a melancholic tone.
angrySpeak with anger and intensity.
whispers / whisperingSpeak in a soft, gentle whisper.
laughs / laughingSpeak while laughing.
calmSpeak calmly and peacefully.
surprisedSpeak with surprise and amazement.
seriousSpeak in a serious, formal tone.

알 수 없는 태그는 자유형 지시로 통과되므로 (Speak in a slow, dramatic voice)와 같은 표현도 그대로 동작합니다.

샘플링

LLM 단계는 다음 샘플링 구성을 사용합니다:

파라미터
Top-k25
Top-p0.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-GAN50 - 170 ms
컴파일

LLM 단계는 자동 회귀 루프에 compile(shapeless: true)를 사용하여, 다양한 시퀀스 길이에 걸친 재컴파일 오버헤드를 제거합니다. 배치 더블링된 CFG는 DiT 포워드 패스 횟수를 20에서 10으로 절반으로 줄입니다.