VoxCPM: cuando el TTS deja de sonar a TTS

Durante años hemos aceptado una idea casi como dogma en text-to-speech: para generar audio hay que discretizarlo. Da igual si hablamos de unidades fonéticas, tokens tipo HuBERT, VQ-VAE, EnCodec o similares. El pipeline casi siempre acaba convirtiendo una señal continua en algo discreto para que el modelo pueda manejarlo. Funciona, sí, pero introduce un cuello de botella evidente: estamos obligando a una señal rica, continua y altamente estructurada a pasar por una rejilla artificial.

VoxCPM parte de una premisa incómoda: ¿y si ese cuello de botella es precisamente la razón por la que el TTS sigue sonando “a TTS”?

El proyecto, desarrollado por OpenBMB, propone una arquitectura de modelado directo en espacio continuo, eliminando por completo la tokenización intermedia del audio. El resultado no es solo una mejora incremental: es un cambio de paradigma que se nota, especialmente en prosodia, microvariaciones y naturalidad general.

Repositorio oficial: https://github.com/OpenBMB/VoxCPM

La mayoría de sistemas TTS modernos siguen una estructura más o menos estándar:

  1. Texto → embeddings lingüísticos
  2. Audio → tokens discretos (VQ, RVQ, EnCodec…)
  3. Modelo aprende la correspondencia texto ↔ tokens
  4. Decoder reconstruye audio desde tokens

Este enfoque tiene ventajas claras: estabilidad, compresión, facilidad para entrenar modelos grandes. Pero también introduce pérdidas inevitables. Aunque los tokens sean “neural-friendly”, siguen siendo una aproximación discreta de algo que no lo es.

En la práctica, esto se traduce en:

  • Prosodia correcta pero plana
  • Emociones reconocibles pero poco orgánicas
  • Voces que suenan bien… hasta que escuchas a un humano justo después

VoxCPM decide no jugar ese juego. VoxCPM utiliza una arquitectura end-to-end diffusion autoregressive, modelando directamente la forma de onda (o representaciones continuas muy cercanas a ella) sin pasar por tokens intermedios. No es simplemente “diffusion para audio”, eso ya lo hemos visto. Lo interesante es la combinación de autoregresión para mantener coherencia temporal, diffusion para capturar variabilidad fina y naturalidad y espacio continuo, evitando cuantización:

Esto permite que el modelo capture micro-pausas, variaciones sutiles de tono, ritmo natural del habla y transiciones emocionales suaves. En otras palabras: cosas que los tokens tienden a aplastar.

Zero-shot voice cloning (de verdad)

Uno de los claims más repetidos últimamente es el zero-shot voice cloning. En muchos casos significa “suena parecido si no escuchas con atención”. En VoxCPM, con ~5 segundos de audio, el modelo no solo captura el timbre, sino el acento real (no caricaturizado), ritmo personal del hablante y tendencia emocional (más plano, más expresivo, etc.)

Esto es posible precisamente porque no está limitado por un codebook discreto. El condicionamiento por audio de referencia ocurre en un espacio mucho más expresivo.

Desde el punto de vista de ataque, esto ya debería levantar alguna ceja.

Además, VoxCPM fue entrenado con 1.8 millones de horas de audio bilingüe (inglés y chino). Esto no es un detalle menor: gran parte de la robustez del modelo viene de la diversidad masiva de locutores, contextos y estilos.

A diferencia de otros modelos que dependen de datasets extremadamente limpios y controlados, aquí se nota un enfoque más “foundation model” que “modelo de laboratorio”.

La versión VoxCPM 1.5 sube la apuesta:

  • 44.1 kHz sampling rate Esto importa. Mucho. Especialmente en fricativas, sibilantes y transitorios.
  • 800M parámetros Mejor estabilidad en generación larga, mayor fidelidad en voice cloning

Aquí ya no estamos hablando de “demo bonita”, sino de calidad claramente usable en producción.

Uso práctico: API y ejecución

El proyecto no se queda en el paper. La API es sorprendentemente simple:

pip install voxcpm

Ejemplo mínimo (simplificado):

from voxcpm import VoxCPM

model = VoxCPM.from_pretrained("openbmb/voxcpm-1.5")

audio = model.tts(
    text="Este es un ejemplo de síntesis de voz con VoxCPM",
    reference_audio="voice_sample.wav"
)

with open("output.wav", "wb") as f:
    f.write(audio)

Salida típica por consola durante inferencia:

[INFO] Loading VoxCPM-1.5 (800M params)
[INFO] Reference audio length: 4.8s
[INFO] Streaming synthesis enabled
[INFO] Generating audio @ 44.1kHz
[INFO] Done. Output length: 6.2s

Soporta además Streaming synthesis, fine-tuning completo y LoRA, lo que lo hace viable incluso con recursos moderados.

VoxCPM no es solo otro modelo TTS “un poco mejor”. Es un ejemplo claro de lo que pasa cuando dejamos de asumir que la discretización del audio es inevitable.

Desde una perspectiva ofensiva/defensiva:

  • El voice cloning realista con segundos de audio ya no es futuro
  • La detección basada en artefactos de TTS va a sufrir
  • El spoofing de voz entra en una nueva liga

Desde una perspectiva técnica:

  • El modelado continuo vuelve a ser viable
  • Diffusion + AR sigue dando sorpresas
  • El audio empieza a recibir el mismo trato “fundacional” que el texto

Y eso, para bien o para mal, cambia el tablero.


Comentarios