CosyVoice3

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

지원 언어

언어코드
중국어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비트, 8비트, 8-bit-full(int8 LLM + int8 DiT), bf16(양자화 없음) — 을 제공하며 --cosyvoice-variant로 호출마다 선택할 수 있습니다.

파라미터
레이어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

모델 웨이트

변형LLMDiT크기HuggingFace
4bit (기본값)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

모든 번들에는 LLM, DiT 플로우 매칭 디코더, HiFi-GAN 보코더, 그리고 zero-shot 음성 복제에 필요한 S3-Tokenizer 참조 인코더가 포함됩니다. 다운로드/디스크 공간이 작은 번들을 선호하거나, LLM/DiT 양자화 노이즈가 문제일 때(긴 형식 합성, 음성 복제 충실도)는 bf16을 선택하세요.

CLI 사용법

.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav

예제

# 영어
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav

# 중국어
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav

# 스페인어
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav

# 프랑스어
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav

음성 복제

--voice-sample 플래그를 사용하여 짧은 레퍼런스 오디오 샘플에서 어떤 음성이든 복제할 수 있습니다. CosyVoice3는 CAM++ 화자 인코더를 사용하여 192차원 임베딩을 추출하고 이를 DiT 플로우 모델에 조건으로 전달합니다.

# 음성 복제
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav

# 교차 언어: 음성은 복제하고 독일어로 발화
.build/release/speech 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/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav

# 세 명의 화자
.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

태그의 화자 이름은 대소문자를 구분하지 않으며 매핑 키와 매치됩니다. 턴 사이에 구성 가능한 침묵 간격(기본값 0.2초)이 삽입됩니다.

옵션기본값설명
--speakers화자 매핑: s1=file.wav,s2=file.wav
--turn-gap0.2턴 사이의 침묵 (초)
--crossfade0.0턴 간의 크로스페이드 오버랩 (초)

감정 및 스타일 태그

인라인 감정 태그를 사용하여 세그먼트별 발화 스타일을 제어합니다. CosyVoice3는 <|endofprompt|> 토큰 앞의 텍스트 접두사를 스타일 지시로 사용합니다 — 감정 태그는 이 접두사를 대체하는 자연어 지시로 매핑됩니다.

# 감정 태그
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
    --engine cosyvoice -o emotion.wav

# 화자와 결합
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav

# 자유형 지시를 태그로 사용
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
    --engine cosyvoice -o pirate.wav

# 전역 지시 (감정 태그가 없는 모든 세그먼트에 적용)
.build/release/speech 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)와 같은 표현도 그대로 동작합니다.

모델 제어 토큰 (fl_ 토큰)

내부적으로 CosyVoice3 LLM은 fl_로 시작하는 특수 제어 토큰을 사용하여 모드(제로샷 클로닝, 지시문 합성, 화자 저장 등) 사이를 전환합니다. 이 토큰은 상위 FunAudioLLM 토크나이저의 일부이며, Soniqo 런타임은 사용하는 CLI 플래그나 Swift API 호출에 따라 적절한 토큰을 자동으로 발행하므로 수동으로 작성할 필요가 없습니다.

제어 토큰모드Soniqo에서 호출하는 방법
<|fl_speaker_clone|>참조 오디오 샘플로부터 제로샷 음성 클로닝CLI에서 --voice-sample reference.wav를 전달하거나 Swift API에서 voiceSample:을 설정합니다.
<|fl_speaker_instruct|>기본 음성으로 지시 또는 스타일 조건부 합성--voice-sample 없이 --cosy-instruct "Speak cheerfully"를 전달하거나 인라인 (happy) 태그를 사용합니다.
<|fl_speaker_instruct2|>복제된 참조 음성과 결합된 지시 합성같은 호출에서 --voice-sample reference.wav--cosy-instruct "..."(또는 인라인 감정 태그)를 결합합니다.
<|fl_save_speaker|>참조 오디오를 호출마다 다시 인코딩하지 않고 화자 임베딩을 지속화Soniqo CLI에 직접 노출되지 않음 — 임베딩은 호출마다 계산됩니다. 캐시하려면 화자 임베딩 모듈을 통해 직접 192차원 CAM++ 벡터를 추출하여 전달하세요.
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, …상위 토크나이저가 사용하는 언어별 제로샷 클로닝 힌트--voice-sample--language german|spanish|chinese|...과 결합합니다. Soniqo는 --language 플래그에서 올바른 언어 힌트를 선택합니다.
FunAudioLLM/CosyVoice에서 포팅하는 경우

위 표는 각 상위 fl_ 제어 토큰을 Soniqo의 동등한 항목에 매핑합니다. fl_ 토큰을 프롬프트에 직접 삽입할 필요가 없습니다 — 고수준 CLI 플래그 또는 Swift API 인수를 전달하면 런타임이 올바른 시퀀스(clone → instruct → instruct2 → save_speaker)를 발행합니다.

샘플링

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으로 절반으로 줄입니다.