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

IdiomaCodigo
Chineschinese
Inglesenglish
Japonesjapanese
Coreanokorean
Alemaogerman
Espanholspanish
Francesfrench
Italianoitalian
Russorussian

Pipeline

CosyVoice3 sintetiza fala em tres estagios:

  1. LLM — o backbone Qwen2.5-0.5B gera tokens de fala FSQ (Finite Scalar Quantization) a partir de texto
  2. DiT Flow Matching — um Diffusion Transformer de 22 camadas converte tokens de fala em espectrogramas mel via integracao ODE de Euler
  3. 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.

ParametroValor
Camadas24
Dimensao oculta896
Cabecas de query14
Cabecas de key/value2 (GQA)
Vocabulario FSQ6561
Quantizacao4 bits

DiT Flow Matching

O Diffusion Transformer refina tokens de fala em espectrogramas mel usando flow matching condicional com guia livre de classificador.

ParametroValor
Camadas22
Dimensao1024
Cabecas de atencao16
CondicionamentoAdaLN (Adaptive Layer Norm)
Solver ODEEuler, 10 passos
Taxa CFG0.7

Vocoder HiFi-GAN

Um vocoder Neural Source Filter (NSF) que converte espectrogramas mel em formas de onda.

ParametroValor
Harmonicos8
Razao de upsample480x (8 x 5 x 3 x ISTFT 4)
ISTFTn_fft=16, hop=4
Taxa de amostragem de saida24 kHz

Pesos do modelo

VarianteLLMDiTTamanhoHuggingFace
4bit (padrão)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

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

  1. O codificador de falante CAM++ extrai um embedding de 192 dimensoes do audio de referencia via CoreML (Neural Engine)
  2. A projecao afim (192 → 80) condiciona o decodificador DiT flow matching na voz-alvo
  3. O vocoder HiFi-GAN converte o espectrograma mel condicionado pelo falante em audio a 24kHz

Codificador de falante

PropriedadeValor
ModeloCAM++ (Context-Aware Masking++)
Embedding192 dimensoes
BackendCoreML (Neural Engine, FP16)
Tamanho~14 MB
HuggingFaceaufklarer/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.

OpcaoPadraoDescricao
--speakersMapeamento de locutores: s1=file.wav,s2=file.wav
--turn-gap0.2Silencio entre turnos (segundos)
--crossfade0.0Sobreposicao 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

TagInstrucao
happy / excitedFala feliz e com entusiasmo.
sadFala triste com tom melancolico.
angryFala com raiva e intensidade.
whispers / whisperingFala em um sussurro suave e gentil.
laughs / laughingFala rindo.
calmFala calma e tranquila.
surprisedFala com surpresa e admiracao.
seriousFala 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 controleModoComo invocar do Soniqo
<|fl_speaker_clone|>Clonagem de voz zero-shot a partir de uma amostra de áudio de referênciaPasse --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ãoPasse --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 clonadaCombine --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 chamadaNã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 upstreamCombine --voice-sample com --language german|spanish|chinese|.... O Soniqo seleciona a dica de idioma correta a partir da flag --language.
Se você está portando de FunAudioLLM/CosyVoice

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:

ParametroValor
Top-k25
Top-p0.8
Repetition Aware SamplingHabilitado (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.

EstagioLatencia
LLM (compilado)~13 ms/token
DiT Flow Matching370 - 520 ms
HiFi-GAN50 - 170 ms
Compilacao

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.