CosyVoice v3 is zero-shot multilingual speech synthesis
CosyVoice2에서는 S3 tokenizer + LLM + chunk-aware Flow Matching module을 사용했다. 성능이 좋다고 생각한 chatterbox가 이 구조라서 관심이 갔다.
하지만 다양한 언어, 도메인, 데이터 양, 텍스트 포맷, post-training이 부족했다.
그래서 3가지를 했다.
- novel speech tokenizer
by supervised multi-tasks. 기존의 S3 tokenizer는 ASR을 위해서만 학습했다면 이번에는 다양한 태스크로 학습해서 token의 능력을 높였다.
- new differentiable reward model for post-training
for discrete-token based TTS (DiffRO)
- Scaling
- Dataset Size : 몇만 시간 → 백만시간, 다양한 언어와 text formats
- Model size : 0.5B → 1.5B
그리고 CV3-Eval benchmark도 만들었다.
- speaker similarity는 WavLM embedding끼리 cosine similarity로 계산한다.
CosyVoice3

1. Speech Tokenizer via Supervised Multi-task training
CosyVoice2에서는 SenseVoice-Large ASR model의 encoder를 쓰고 그 뒤에 FSQ 모듈을 추가했는데, 3에서는 MinMo를 썼다.
MinMo는 ASR 모델이 아니라 여러 태스크(감정 분류, asr, 언어 감지 등)로 학습한 multimodal LLM이다.
여기에 530,000시간으로 추가학습했다.
Tasks : muntilingual ASR, 언어 감지, 감정 recognition, audio event detection, speaker analysis
Audio → [Voice Encoder1(12개 transformer blocks) → FSQ] → rest of MinMo modules for training. 앞 두개가 Speech tokenizer로 사용됨
25Hz로 압축(초당 25개의 토큰이 나온다.)

2. RL with Differentiable Reward Optimization
Recent TTS systems [26, 37] have demonstrated that reinforcement learning (RL) is effective in enhancing the quality of generated speech.
- 26 : Seed-tts: A family of high-quality versatile speech generation models
- 37 : F5r-tts: Improving flow matching based text-to-speech with group relative policy optimization
하지만 NLP의 LLM과 다르게 여기는 최종 output까지 LLM + CFM + vocoder를 거쳐서 이 구조에서 탐색된 좋은 RL 방식은 아직 없다.
컴퓨팅도 많이 들고, 최종 출력이 각 inference마다 비슷해서 리워드 모델을 위해 pos/neg 쌍을 만들기도 힘들다(GRPO, DPO 등 LLM RL 방식들은 이게 필요한데)
그래서 DiffRO를 제시 : 전체 오디오가 아니라 speech token output만으로 바로 최적화가능한 RL 방식
- 우선 ASR처럼 Token2Text model을 따로 학습하고, 여기의 posterior probability를 리워드로 학습한다.. 단순하구만!
원래 tokenizer 학습할 때 만든 decoder 파트가 token2text를 하니까, 거기서 추가 학습을 하면 된다.
speech LLM에서 speech token을 생성하면 이걸 사전에 학습한 Token2text에 태운 뒤 입력 script와 비교해서 리워드를 계산한다.
- 거기다 학습 단순화를 위해 llm output에서 token sampling을 할 때 Gumbel-Softmax operation을 사용해서 back propagation을 사용할 수 있게 한다.
→ 사실 RL이 아니고, 미분가능하게 만들었기 때문에 DiffRO라고 부름
LM의 출력은 토큰당 확률 분포이고 여기서 샘플링해서 output을 만드는 순간 discrete한 계산이 되기 때문에 미분 계산이 안되는데, Gumbel-Softmax로 continuous하게 이산 샘플링을 근사한다.
따지면 reward를 쓰지만 RL 방식은 아닌것!


- 기존 RL에서처럼 reference model에서 크게 벗어나지 않게 하기위해 KLD를 사용한다.
대신 RL 메소드와 다르게, KL divergence를 sequence 단위 probability가 아니라 토큰 단위 logits로 계산한다. 즉, KLD 계산을 token 샘플링 이전의 logit 출력단에서 계산한다.(Reward는 토큰으로 하는것과 다르게)
3. Pronounciation Inpainting
LLM-based TTS 시스템들은 보통 BPE Tokenizer를 쓴다(raw text를 그대로 모델 입력으로 사용하는). phoneme을 안쓰기 때문에 처음보는 토큰 조합이 들어왔을 때 발음하기 오히려 어려워할 수 있다.(특히 특정 industry의 전문 용어 등)
그래서 일부 텍스트를 음소로 대체한 auxiliary 데이터셋을 만들어서 토큰 + phoneme을 섞어서 학습했다.
그럼 처음보는 단어가 들어와도, 그걸 phoneme으로 바꿔서 모델에 넣으면 발음할 수 있게 된다.
4. Self-training for Text Normalization
기존 TTS에서는 inference 때 숫자, symbols를 읽을 수 있는 텍스트로 변환시키는 과정이 있다. ex) 2015 → 이천십오, , → 콤마, AI → A I
근데 이건 직접 규칙을 만들어서 적용해야하는데, 특수 케이스가 너무 많다.
→ Text Normalization 태스크 자체를 모델에 학습시킨다.
임의로 pair 데이터셋을 만들고(raw text, audio), 그걸 학습에 사용한다.
- LLM과 rule-based Text normalization을 사용해서 2015 → 이천십오 로 변경된 텍스트를 만든다.
- 이걸 CosyVoice2에 넣어서 오디오를 만든다.
- 그럼 2015, “이천십오”로 읽은 오디오가 생긴다. 이 pair를 바로 학습에 사용한다.
(근데 원래 데이터셋이 이렇게 되어있는거 아닌가?)
이렇게 학습된 모델은
- raw text를 그대로 입력받아도 synthesize 가능
- 숫자 / 기호 / 단위 / 이상한 문법 등 특수 상황에서 더 robust
- Rule-based TN 없이 end-to-end TTS 달성
5. Instructed Speech Generation
controllability와 expressiveness를 강화하기 위해 학습 데이터를 더 다양하게 구성하고(1500 시간 → 5000 시간) 각 태그? instruction?도 만들었다.

이렇게 앞에 들어가거나, 특정 단어를 <strong> 씌우거나, [laughs] 같은 특수 토큰도 만들었다. 어떻게 만들었다는건지가 궁금한게 나와있지 않다.
데이터 전처리 파이프라인
영어-중국어와 달리 다른 언어들은 데이터셋이 크지 않기 때문에, 인터넷의 오디오북, 영상, 팟캐스트 등 in-the-wild 상황에서의 음성 데이터를 수집했다.
- 음성 검출 및 세분화(Speech detection and segmentation)
- speaker diarization, VAD, 오디오 이벤트 감지 모듈 순서대로 태워서 30초 미만의 오디오를 만든다.
- 노이즈 제거
- MossFormer2 사용
- 단어를 말하다가 비정상적으로 잘린 오디오를 지우고, 앞뒤 무음을 제거한다.
- ASR 전사
- FasterWhisper Large-V3로 언어 감지
- 여러개의 ASR 모델을 사용한다. (Faster-Whisper Large-V3, NVIDIA NeMo Canary-1B [41], Meta FAIR seamlessM4T-V2-large)
- 그리고 모델들간에 출력이 비슷한 것들(WER이 15%이하)만 사용한다.
정확해야 한다.
일종의 앙상블이네 이게 모델 성능이 충분히 좋지만 inference 때 비용-속도를 좀 희생하더라도 정확도를 높이고 싶을 때 가장 좋은 방법인 것 같긴하다.
- 구두점 보정(punctuation adjustment)
Montreal Forced Aligner를 사용하여 ASR 모델이 구두점을 찍었지만 pause가 50ms이하인 경우는 제거라고, 없지만 300ms 이상인 경우에는 쉼표를 넣는다.
- volume standardization : 간단한 정규화
- 오디오–텍스트 길이 비율이 비정상적인 데이터 필터링
- 하위 1% (오디오는 짧은데 텍스트가 길때)
- 상위 5% (오디오는 긴데 텍스트가 짧을때)
를 제거한다. 과감하게 없애버림! 상위는 5%인 이유는 아마 저기 해당하는게 더 많아서 그런 것 같음
간단 성능 비교표

성능

Seed-TTS도 LLM + Diffusion + vocder구조이다. RL도 썼다.
0.5B도 RL을 적용한 뒤 성능이 충분히 좋다. 근데 ASR으로만 RL을 적용한 경우 prosody가 내려간다는 실험결과를 본적이 있어, 실제로 듣기 얼마나 좋은지는 봐야한다.
RL이 0.5B와 1.5B 사이의 gap을 많이 줄여줬다.
Share article