CosyVoice3
Fun-CosyVoice3-0.5B e um modelo de texto para fala em streaming para 9 idiomas. Usa um pipeline de tres estagios — geracao de tokens por LLM, DiT flow matching e vocoding HiFi-GAN — para produzir fala natural a 24 kHz a partir de entrada de texto. O modelo — também escrito como CosyVoice 3 — é o mais recente da família CosyVoice da FunAudioLLM.
Idiomas suportados
| Idioma | Codigo |
|---|---|
| Chines | chinese |
| Ingles | english |
| Japones | japanese |
| Coreano | korean |
| Alemao | german |
| Espanhol | spanish |
| Frances | french |
| Italiano | italian |
| Russo | russian |
Pipeline
CosyVoice3 sintetiza fala em tres estagios:
- LLM — o backbone Qwen2.5-0.5B gera tokens de fala FSQ (Finite Scalar Quantization) a partir de texto
- DiT Flow Matching — um Diffusion Transformer de 22 camadas converte tokens de fala em espectrogramas mel via integracao ODE de Euler
- HiFi-GAN — vocoder Neural Source Filter converte espectrogramas mel em formas de onda a 24 kHz
Arquitetura
LLM (Qwen2.5-0.5B)
O modelo de linguagem gera tokens de fala discretos de forma autorregressiva. O runtime vem em quatro variantes de quantização — 4-bit, 8-bit, 8-bit-full (LLM int8 + DiT int8) e bf16 (sem quantização) — selecionáveis via --cosyvoice-variant.
| Parametro | Valor |
|---|---|
| Camadas | 24 |
| Dimensao oculta | 896 |
| Cabecas de query | 14 |
| Cabecas de key/value | 2 (GQA) |
| Vocabulario FSQ | 6561 |
| Quantizacao | 4 bits |
DiT Flow Matching
O Diffusion Transformer refina tokens de fala em espectrogramas mel usando flow matching condicional com guia livre de classificador.
| Parametro | Valor |
|---|---|
| Camadas | 22 |
| Dimensao | 1024 |
| Cabecas de atencao | 16 |
| Condicionamento | AdaLN (Adaptive Layer Norm) |
| Solver ODE | Euler, 10 passos |
| Taxa CFG | 0.7 |
Vocoder HiFi-GAN
Um vocoder Neural Source Filter (NSF) que converte espectrogramas mel em formas de onda.
| Parametro | Valor |
|---|---|
| Harmonicos | 8 |
| Razao de upsample | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Taxa de amostragem de saida | 24 kHz |
Pesos do modelo
| Variante | LLM | DiT | Tamanho | HuggingFace |
|---|---|---|---|---|
4bit (padrão) | int4, group=64 | bf16 | ~1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
8bit | int8, group=64 | bf16 | ~1.4 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit |
8bit-full | int8, group=64 | int8, group=64 | ~1.6 GB | aufklarer/CosyVoice3-0.5B-MLX-8bit-full |
bf16 | bf16 | bf16 | ~2.1 GB | aufklarer/CosyVoice3-0.5B-MLX-bf16 |
Cada bundle inclui o LLM, o decodificador DiT em flow matching, o vocoder HiFi-GAN e o codificador de referência S3-Tokenizer necessário para clonagem de voz zero-shot. Escolha bundles menores para menor download/disco; escolha bf16 quando o ruído de quantização do LLM/DiT for problema (síntese de forma longa, fidelidade da clonagem).
Uso do CLI
.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Exemplos
# Ingles
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chines
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Espanhol
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# Frances
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Clonagem de voz
Clone qualquer voz a partir de uma pequena amostra de audio de referencia usando a flag --voice-sample. CosyVoice3 usa o codificador de falante CAM++ para extrair um embedding de 192 dimensoes que condiciona o modelo DiT flow.
# Clonagem de voz
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Entre idiomas: clona a voz, fala em alemao
.build/release/speech speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
Como funciona
- O codificador de falante CAM++ extrai um embedding de 192 dimensoes do audio de referencia via CoreML (Neural Engine)
- A projecao afim (192 → 80) condiciona o decodificador DiT flow matching na voz-alvo
- O vocoder HiFi-GAN converte o espectrograma mel condicionado pelo falante em audio a 24kHz
Codificador de falante
| Propriedade | Valor |
|---|---|
| Modelo | CAM++ (Context-Aware Masking++) |
| Embedding | 192 dimensoes |
| Backend | CoreML (Neural Engine, FP16) |
| Tamanho | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
O modelo CAM++ e baixado automaticamente no primeiro uso de --voice-sample. Veja o guia de Clonagem de voz para dicas de audio de referencia e a API Swift.
Dialogo multi-locutor
Sintetize conversas entre varios locutores usando tags inline de locutor. Cada locutor recebe uma voz de um arquivo de audio de referencia atraves da flag --speakers.
# Dialogo de dois locutores com clonagem de voz
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Tres locutores
.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
Os nomes dos locutores nas tags sao insensiveis a maiusculas/minusculas e sao associados as chaves do mapeamento. Um intervalo de silencio configuravel (padrao 0.2s) e inserido entre turnos.
| Opcao | Padrao | Descricao |
|---|---|---|
--speakers | Mapeamento de locutores: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Silencio entre turnos (segundos) |
--crossfade | 0.0 | Sobreposicao com crossfade entre turnos (segundos) |
Tags de emocao e estilo
Controle o estilo de fala por segmento usando tags de emocao inline. CosyVoice3 usa o prefixo de texto antes do token <|endofprompt|> como instrucao de estilo — tags de emocao sao mapeadas para instrucoes em linguagem natural que substituem esse prefixo.
# Tags de emocao
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combinado com locutores
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Instrucao livre como tag
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Instrucao global (aplica-se a todos os segmentos sem tags de emocao)
.build/release/speech speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Tags de emocao integradas
| Tag | Instrucao |
|---|---|
happy / excited | Fala feliz e com entusiasmo. |
sad | Fala triste com tom melancolico. |
angry | Fala com raiva e intensidade. |
whispers / whispering | Fala em um sussurro suave e gentil. |
laughs / laughing | Fala rindo. |
calm | Fala calma e tranquila. |
surprised | Fala com surpresa e admiracao. |
serious | Fala em tom serio e formal. |
Tags desconhecidas sao passadas como instrucoes livres, entao (Speak in a slow, dramatic voice) funciona como esta.
Tokens de controle do modelo (tokens fl_)
Internamente, o LLM do CosyVoice3 usa tokens de controle especiais — com prefixo fl_ — para alternar entre modos (clonagem zero-shot, síntese com instrução, salvar um locutor, etc.). Esses tokens fazem parte do tokenizador upstream FunAudioLLM; o runtime do Soniqo emite o correto automaticamente com base na flag de CLI ou chamada da API Swift que você usa, então você nunca os escreve à mão.
| Token de controle | Modo | Como invocar do Soniqo |
|---|---|---|
<|fl_speaker_clone|> | Clonagem de voz zero-shot a partir de uma amostra de áudio de referência | Passe --voice-sample reference.wav na CLI, ou defina voiceSample: na API Swift. |
<|fl_speaker_instruct|> | Síntese condicionada por instrução ou estilo com voz padrão | Passe --cosy-instruct "Speak cheerfully" ou use uma tag inline (happy) sem --voice-sample. |
<|fl_speaker_instruct2|> | Síntese com instrução combinada com uma voz de referência clonada | Combine --voice-sample reference.wav com --cosy-instruct "..." (ou uma tag de emoção inline) na mesma chamada. |
<|fl_save_speaker|> | Persiste o embedding de um locutor para reutilização sem recodificar o áudio de referência a cada chamada | Não exposto diretamente na CLI do Soniqo — os embeddings são calculados por chamada. Para fazer cache, extraia o vetor CAM++ de 192 dimensões você mesmo via o módulo de Embeddings de locutor e passe-o adiante. |
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, … | Dicas de clonagem zero-shot específicas de idioma usadas pelo tokenizador upstream | Combine --voice-sample com --language german|spanish|chinese|.... O Soniqo seleciona a dica de idioma correta a partir da flag --language. |
A tabela acima mapeia cada token de controle upstream fl_ ao seu equivalente no Soniqo. Você nunca precisa inserir tokens fl_ no seu prompt — passe as flags de alto nível da CLI ou os argumentos da API Swift, e o runtime emitirá a sequência correta: clone → instruct → instruct2 → save_speaker.
Amostragem
O estagio LLM usa a seguinte configuracao de amostragem:
| Parametro | Valor |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | Habilitado (window=10, tau_r=0.1) |
Repetition Aware Sampling (RAS), do VALL-E 2, penaliza tokens que apareceram nos ultimos 10 tokens gerados. Isso previne artefatos de audio repetitivos e melhora a estabilidade da saida.
Desempenho
Em um M2 Max, o CosyVoice3 alcanca um RTF de aproximadamente 0.5 — mais rapido que tempo real.
| Estagio | Latencia |
|---|---|
| LLM (compilado) | ~13 ms/token |
| DiT Flow Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
O estagio LLM usa compile(shapeless: true) para o loop autoregressivo, o que elimina o overhead de recompilacao para comprimentos de sequencia variaveis. O CFG com batch duplicado reduz pela metade o numero de forward passes do DiT, de 20 para 10.