CosyVoice3
Fun-CosyVoice3-0.5B es un modelo de texto a voz con streaming en 9 idiomas. Utiliza un pipeline de tres etapas — generación de tokens con LLM, DiT flow matching y vocoder HiFi-GAN — para producir voz natural a 24 kHz a partir de una entrada de texto.
Idiomas soportados
| Idioma | Código |
|---|---|
| Chino | chinese |
| Inglés | english |
| Japonés | japanese |
| Coreano | korean |
| Alemán | german |
| Español | spanish |
| Francés | french |
| Italiano | italian |
| Ruso | russian |
Pipeline
CosyVoice3 sintetiza voz en tres etapas:
- LLM — El backbone Qwen2.5-0.5B genera tokens de voz FSQ (Finite Scalar Quantization) a partir del texto
- DiT Flow Matching — Un Diffusion Transformer de 22 capas convierte los tokens de voz en espectrogramas mel mediante integración ODE de Euler
- HiFi-GAN — Un vocoder Neural Source Filter convierte los espectrogramas mel en formas de onda a 24 kHz
Arquitectura
LLM (Qwen2.5-0.5B)
El modelo de lenguaje está cuantizado a 4 bits y genera tokens de voz discretos de forma autorregresiva.
| Parámetro | Valor |
|---|---|
| Capas | 24 |
| Dimensión oculta | 896 |
| Cabezas de consulta | 14 |
| Cabezas de clave/valor | 2 (GQA) |
| Vocabulario FSQ | 6561 |
| Cuantización | 4 bits |
DiT Flow Matching
El Diffusion Transformer refina los tokens de voz hasta obtener espectrogramas mel mediante flow matching condicional con classifier-free guidance.
| Parámetro | Valor |
|---|---|
| Capas | 22 |
| Dimensión | 1024 |
| Cabezas de atención | 16 |
| Condicionamiento | AdaLN (Adaptive Layer Norm) |
| Solver ODE | Euler, 10 pasos |
| Tasa CFG | 0.7 |
Vocoder HiFi-GAN
Un vocoder Neural Source Filter (NSF) que convierte espectrogramas mel en formas de onda.
| Parámetro | Valor |
|---|---|
| Armónicos | 8 |
| Ratio de upsample | 480x (8 x 5 x 3 x ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Frecuencia de muestreo de salida | 24 kHz |
Pesos del modelo
| Modelo | Tamaño | HuggingFace |
|---|---|---|
| CosyVoice3-0.5B (LLM 4 bits) | 1.2 GB | aufklarer/CosyVoice3-0.5B-MLX-4bit |
Incluye los pesos del LLM (cuantizado a 4 bits), DiT flow matching y el vocoder HiFi-GAN.
Uso de la CLI
.build/release/audio speak "Hallo Welt" --engine cosyvoice --language german -o output.wav
Ejemplos
# English
.build/release/audio speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav
# Chinese
.build/release/audio speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav
# Spanish
.build/release/audio speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav
# French
.build/release/audio speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav
Clonación de voz
Clona cualquier voz a partir de una muestra breve de audio de referencia usando el flag --voice-sample. CosyVoice3 utiliza el encoder de hablante CAM++ para extraer un embedding de 192 dimensiones que condiciona el modelo DiT flow.
# Voice cloning
.build/release/audio speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav
# Cross-language: clone voice, speak in German
.build/release/audio speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav
Cómo funciona
- El encoder de hablante CAM++ extrae un embedding de 192 dimensiones a partir del audio de referencia mediante CoreML (Neural Engine)
- Una proyección afín (192 → 80) condiciona el decodificador DiT flow matching con la voz objetivo
- El vocoder HiFi-GAN convierte el espectrograma mel condicionado al hablante en audio a 24 kHz
Encoder de hablante
| Propiedad | Valor |
|---|---|
| Modelo | CAM++ (Context-Aware Masking++) |
| Embedding | 192 dimensiones |
| Backend | CoreML (Neural Engine, FP16) |
| Tamaño | ~14 MB |
| HuggingFace | aufklarer/CamPlusPlus-Speaker-CoreML |
El modelo CAM++ se descarga automáticamente la primera vez que se usa --voice-sample. Consulta la guía de Clonación de voz para obtener consejos sobre el audio de referencia y la API de Swift.
Diálogo multi-hablante
Sintetiza conversaciones entre varios hablantes usando etiquetas de hablante en línea. A cada hablante se le asigna una voz a partir de un archivo de audio de referencia mediante el flag --speakers.
# Two-speaker dialogue with voice cloning
.build/release/audio speak "[S1] Hello there! [S2] Hey, how are you?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav
# Three speakers
.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
Los nombres de hablante en las etiquetas no distinguen entre mayúsculas y minúsculas y se emparejan con las claves del mapeo. Entre turnos se inserta un intervalo de silencio configurable (por defecto 0.2s).
| Opción | Por defecto | Descripción |
|---|---|---|
--speakers | Mapeo de hablantes: s1=file.wav,s2=file.wav | |
--turn-gap | 0.2 | Silencio entre turnos (segundos) |
--crossfade | 0.0 | Solapamiento de crossfade entre turnos (segundos) |
Etiquetas de emoción y estilo
Controla el estilo de habla por segmento mediante etiquetas de emoción en línea. CosyVoice3 utiliza el prefijo de texto anterior al token <|endofprompt|> como instrucción de estilo — las etiquetas de emoción se mapean a instrucciones en lenguaje natural que reemplazan este prefijo.
# Emotion tags
.build/release/audio speak "(excited) Wow, amazing! (sad) But I have to go..." \
--engine cosyvoice -o emotion.wav
# Combined with speakers
.build/release/audio speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
--engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav
# Freeform instruction as tag
.build/release/audio speak "(Speak like a pirate) Ahoy matey!" \
--engine cosyvoice -o pirate.wav
# Global instruction (applies to all segments without emotion tags)
.build/release/audio speak "Hello world" \
--engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav
Etiquetas de emoción integradas
| Etiqueta | Instrucción |
|---|---|
happy / excited | Habla con alegría y entusiasmo. |
sad | Habla con tristeza y un tono melancólico. |
angry | Habla con enfado e intensidad. |
whispers / whispering | Habla con un susurro suave y delicado. |
laughs / laughing | Habla mientras te ríes. |
calm | Habla con calma y serenidad. |
surprised | Habla con sorpresa y asombro. |
serious | Habla con un tono serio y formal. |
Las etiquetas desconocidas se pasan como instrucciones de formato libre, así que (Speak in a slow, dramatic voice) funciona tal cual.
Sampling
La etapa de LLM utiliza la siguiente configuración de sampling:
| Parámetro | Valor |
|---|---|
| Top-k | 25 |
| Top-p | 0.8 |
| Repetition Aware Sampling | Activado (window=10, tau_r=0.1) |
Repetition Aware Sampling (RAS), de VALL-E 2, penaliza los tokens que aparecieron entre los últimos 10 tokens generados. Esto evita artefactos de audio repetitivos y mejora la estabilidad de la salida.
Rendimiento
En un M2 Max, CosyVoice3 alcanza un RTF de aproximadamente 0.5 — más rápido que tiempo real.
| Etapa | Latencia |
|---|---|
| LLM (compilado) | ~13 ms/token |
| DiT Flow Matching | 370 - 520 ms |
| HiFi-GAN | 50 - 170 ms |
La etapa LLM usa compile(shapeless: true) para el bucle autorregresivo, lo que elimina la sobrecarga de recompilación al variar la longitud de la secuencia. El CFG con batch duplicado reduce a la mitad el número de pasadas forward del DiT, de 20 a 10.