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

IdiomaCódigo
Chinochinese
Inglésenglish
Japonésjapanese
Coreanokorean
Alemángerman
Españolspanish
Francésfrench
Italianoitalian
Rusorussian

Pipeline

CosyVoice3 sintetiza voz en tres etapas:

  1. LLM — El backbone Qwen2.5-0.5B genera tokens de voz FSQ (Finite Scalar Quantization) a partir del texto
  2. DiT Flow Matching — Un Diffusion Transformer de 22 capas convierte los tokens de voz en espectrogramas mel mediante integración ODE de Euler
  3. 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ámetroValor
Capas24
Dimensión oculta896
Cabezas de consulta14
Cabezas de clave/valor2 (GQA)
Vocabulario FSQ6561
Cuantización4 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ámetroValor
Capas22
Dimensión1024
Cabezas de atención16
CondicionamientoAdaLN (Adaptive Layer Norm)
Solver ODEEuler, 10 pasos
Tasa CFG0.7

Vocoder HiFi-GAN

Un vocoder Neural Source Filter (NSF) que convierte espectrogramas mel en formas de onda.

ParámetroValor
Armónicos8
Ratio de upsample480x (8 x 5 x 3 x ISTFT 4)
ISTFTn_fft=16, hop=4
Frecuencia de muestreo de salida24 kHz

Pesos del modelo

ModeloTamañoHuggingFace
CosyVoice3-0.5B (LLM 4 bits)1.2 GBaufklarer/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

  1. El encoder de hablante CAM++ extrae un embedding de 192 dimensiones a partir del audio de referencia mediante CoreML (Neural Engine)
  2. Una proyección afín (192 → 80) condiciona el decodificador DiT flow matching con la voz objetivo
  3. El vocoder HiFi-GAN convierte el espectrograma mel condicionado al hablante en audio a 24 kHz

Encoder de hablante

PropiedadValor
ModeloCAM++ (Context-Aware Masking++)
Embedding192 dimensiones
BackendCoreML (Neural Engine, FP16)
Tamaño~14 MB
HuggingFaceaufklarer/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ónPor defectoDescripción
--speakersMapeo de hablantes: s1=file.wav,s2=file.wav
--turn-gap0.2Silencio entre turnos (segundos)
--crossfade0.0Solapamiento 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

EtiquetaInstrucción
happy / excitedHabla con alegría y entusiasmo.
sadHabla con tristeza y un tono melancólico.
angryHabla con enfado e intensidad.
whispers / whisperingHabla con un susurro suave y delicado.
laughs / laughingHabla mientras te ríes.
calmHabla con calma y serenidad.
surprisedHabla con sorpresa y asombro.
seriousHabla 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ámetroValor
Top-k25
Top-p0.8
Repetition Aware SamplingActivado (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.

EtapaLatencia
LLM (compilado)~13 ms/token
DiT Flow Matching370 - 520 ms
HiFi-GAN50 - 170 ms
Compilación

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.