Phase 06 - Lesson 13
Codecs de Audio Neuronales — EnCodec, SNAC, Mimi, DAC y la Division Semantica-Acustica
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
La generacion de audio en 2026 es casi toda basada en tokens. EnCodec, SNAC, Mimi y DAC convierten formas de onda continuas en secuencias discretas que un transformer puede predecir. La division entre tokens semanticos y acusticos — el primer codebook como semantico, el resto como acustico — es el cambio arquitectonico mas importante desde el Transformer para audio.
Tipo: Aprender Lenguajes: Python Requisitos previos: Fase 6 · 02 (Espectrogramas), Fase 10 · 11 (Cuantizacion), Fase 5 · 19 (Tokenizacion de Subpalabras) Tiempo: ~60 minutos
El Problema
Los modelos de lenguaje trabajan con tokens discretos. El audio es continuo. Si quieres un modelo al estilo LLM para habla / musica — MusicGen, Moshi, Sesame CSM, VibeVoice, Orpheus — primero necesitas un codec de audio neuronal: un encoder aprendido que discretiza el audio en un vocabulario pequeno de tokens, y un decoder correspondiente que reconstruye la forma de onda.
Han surgido dos familias:
- Codecs centrados en la reconstruccion — EnCodec, DAC. Optimizan la calidad perceptual del audio. Los tokens son "acusticos" — capturan todo, incluida la identidad del hablante, el timbre, el ruido de fondo.
- Codecs centrados en la semantica — Mimi (Kyutai), SpeechTokenizer. Obligan al primer codebook a codificar contenido linguistico / fonetico (a menudo mediante destilacion a partir de WavLM). Los codebooks siguientes son detalle acustico.
El hallazgo de 2024-2026: un codec puramente de reconstruccion genera habla borrosa cuando intentas generar a partir de texto. El LLM sobre los tokens del codec tiene que aprender tanto la estructura del lenguaje COMO la estructura acustica en el mismo codebook, lo cual no escala. Separarlas — codebook semantico 0, codebooks acusticos 1-N — es lo que hace que Moshi y Sesame CSM funcionen.
El Concepto
El truco central: Cuantizacion Vectorial Residual (RVQ)
En lugar de un unico codebook gigante (que necesitaria millones de codigos para buena calidad), todos los codecs de audio modernos usan RVQ: una cascada de codebooks pequenos. El primer codebook cuantiza la salida del encoder; el segundo cuantiza el residuo; etc. Cada codebook tiene 1024 codigos. 8 codebooks = vocabulario efectivo de 1024^8 = 10^24.
En el momento de la inferencia, el decoder suma todos los codigos elegidos por frame para reconstruir.
Los cuatro codecs que importan en 2026
EnCodec (Meta, 2022). La linea base. Encoder-decoder sobre la forma de onda, cuello de botella RVQ. 24 kHz, hasta 32 codebooks posibles, predeterminado de 4 codebooks @ 1.5 kbps. Usa la arquitectura 1D conv + transformer + 1D conv. Usado por MusicGen.
DAC (Descript, 2023). RVQ con codebooks normalizados por L2, funciones de activacion periodicas, perdidas mejoradas. La mayor fidelidad de reconstruccion de cualquier codec abierto — a veces indistinguible del habla original con 12 codebooks. Banda completa de 44.1 kHz.
SNAC (Hubert Siuzdak, 2024). RVQ multi-escala — los codebooks gruesos operan a una tasa de frames menor que los finos. Modela el audio de forma jerarquica: un "boceto" grueso a ~12 Hz mas detalle a 50 Hz. Usado por Orpheus-3B porque la estructura jerarquica encaja bien en la generacion basada en LM.
Mimi (Kyutai, 2024). El punto de inflexion de 2026. Tasa de frames de 12.5 Hz (extremadamente baja), 8 codebooks @ 4.4 kbps. El codebook 0 esta destilado de WavLM — entrenado para predecir las features de contenido de habla de WavLM. Los codebooks 1-7 son residuos acusticos. Esta division impulsa a Moshi (Leccion 15) y Sesame CSM.
Las tasas de frames importan para el modelado de lenguaje
Tasa de frames menor = secuencia mas corta = LM mas rapido.
| Codec | Tasa de frames | 1 s = N frames | Bueno para |
|---|---|---|---|
| EnCodec-24k | 75 Hz | 75 | musica, audio general |
| DAC-44.1k | 86 Hz | 86 | musica de alta fidelidad |
| SNAC-24k (grueso) | ~12 Hz | 12 | eficiente para AR-LM |
| Mimi | 12.5 Hz | 12.5 | habla en streaming |
A 12.5 Hz, un enunciado de 10 segundos tiene solo 125 frames de codec — un transformer puede predecirlos facilmente.
Tokens semanticos vs acusticos
frame_t → [semantic_token_t, acoustic_token_0_t, acoustic_token_1_t, ..., acoustic_token_6_t]
- Token semantico (codebook 0 en Mimi). Codifica lo que se dijo — fonemas, palabras, contenido. Destilado de WavLM mediante una perdida auxiliar de prediccion.
- Tokens acusticos (codebooks 1-7). Codifican timbre, identidad del hablante, prosodia, ruido de fondo, detalle fino.
Un LM autorregresivo predice primero el token semantico (condicionado al texto), luego predice los tokens acusticos (condicionados al semantico + referencia del hablante). Esta factorizacion es la razon por la que el TTS moderno puede clonar voces en zero-shot: el modelo semantico maneja el contenido; el modelo acustico maneja el timbre.
Calidad de reconstruccion en 2026 (bits por segundo, menor bitrate es mejor)
| Codec | Bitrate | PESQ | ViSQOL |
|---|---|---|---|
| Opus-20kbps | 20 kbps | 4.0 | 4.3 |
| EnCodec-6kbps | 6 kbps | 3.2 | 3.8 |
| DAC-6kbps | 6 kbps | 3.5 | 4.0 |
| SNAC-3kbps | 3 kbps | 3.3 | 3.8 |
| Mimi-4.4kbps | 4.4 kbps | 3.1 | 3.7 |
Los codecs tradicionales como Opus aun ganan por bit en calidad perceptual. Los codecs neuronales ganan en tokens discretos (que Opus no produce) y en calidad para modelos generativos (lo que el LM puede hacer con esos tokens).
Construyelo
Paso 1: codificar con EnCodec
from encodec import EncodecModel
import torch
model = EncodecModel.encodec_model_24khz()
model.set_target_bandwidth(6.0) # kbps
wav = torch.randn(1, 1, 24000)
with torch.no_grad():
encoded = model.encode(wav)
codes, scale = encoded[0]
# codes: (1, n_codebooks, n_frames), dtype=int64
n_codebooks=8 a 6 kbps. Cada codigo va de 0 a 1023 (10 bits).
Paso 2: decodificar y medir la reconstruccion
with torch.no_grad():
wav_recon = model.decode([(codes, scale)])
from torchaudio.functional import compute_deltas
import torch.nn.functional as F
mse = F.mse_loss(wav_recon[:, :, :wav.shape[-1]], wav).item()
Paso 3: la division semantica-acustica (estilo Mimi)
from moshi.models import loaders
mimi = loaders.get_mimi()
with torch.no_grad():
codes = mimi.encode(wav) # shape (1, 8, frames@12.5Hz)
semantic = codes[:, 0]
acoustic = codes[:, 1:]
El codebook semantico 0 esta alineado con WavLM. Puedes entrenar un transformer de texto-a-semantico — un vocabulario mucho mas pequeno que ir directo a audio. Luego, un decoder separado de acustico-a-forma-de-onda se condiciona a una referencia del hablante.
Paso 4: por que funciona el LM autorregresivo sobre tokens del codec
Para un clip de habla de 10 s a 12.5 Hz × 8 codebooks de Mimi:
N_tokens = 10 * 12.5 * 8 = 1000 tokens
1000 tokens es un contexto trivial para un transformer. Un transformer de 256M de parametros puede generar 10 segundos de habla en milisegundos en una GPU moderna.
Usalo
Mapea el problema → codec:
| Tarea | Codec |
|---|---|
| Generacion general de musica | EnCodec-24k |
| Reconstruccion de maxima fidelidad | DAC-44.1k |
| LM autorregresivo sobre habla (TTS) | SNAC o Mimi |
| Habla full-duplex en streaming | Mimi (12.5 Hz) |
| Biblioteca de efectos de sonido con texto | EnCodec + condicion T5 |
| Edicion de audio de grano fino | DAC + inpainting |
Regla general: si estas construyendo un modelo generativo, empieza con Mimi o SNAC. Si estas construyendo un pipeline de compresion, usa Opus.
Errores Comunes
- Demasiados codebooks. Agregar codebooks aumenta la fidelidad linealmente, pero tambien aumenta la longitud de la secuencia del LM linealmente. Detente en 8-12.
- Incompatibilidad de tasa de frames. Entrenar el LM en Mimi a 12.5 Hz y luego hacer fine-tuning en EnCodec a 50 Hz falla silenciosamente.
- Suponer que todos los codebooks son iguales. En Mimi, el codebook 0 lleva el contenido; perderlo destruye la inteligibilidad. Perder el codebook 7 es apenas perceptible.
- Usar la calidad de reconstruccion como unica metrica. Un codec puede tener una excelente reconstruccion pero ser inutil para la generacion basada en LM si la estructura semantica es mala.
Entregalo
Guardalo como outputs/skill-codec-picker.md. Elige un codec para una tarea dada de generacion o compresion.
Ejercicios
- Facil. Ejecuta
code/main.py. Implementa un cuantizador escalar + residual de juguete y mide el error de reconstruccion a medida que agregas codebooks. - Medio. Instala
encodecy compara 1, 4, 8, 32 codebooks en un clip de habla reservado para prueba. Grafica PESQ o MSE vs bitrate. - Dificil. Carga Mimi. Codifica un clip. Reemplaza el codebook 0 con enteros aleatorios; decodifica. Luego reemplaza el codebook 7 de la misma manera. Compara las dos corrupciones — la corrupcion del codebook 0 deberia destruir la inteligibilidad; la corrupcion del codebook 7 apenas deberia cambiar algo.
Terminos Clave
| Termino | Lo que la gente dice | Lo que realmente significa |
|---|---|---|
| RVQ | Cuantizacion residual | Cascada de codebooks pequenos; cada uno cuantiza el residuo anterior. |
| Tasa de frames | Velocidad del codec | Cuantos frames-token por segundo. Menor = LM mas rapido. |
| Codebook semantico | Codebook 0 (Mimi) | Codebook destilado de features SSL; codifica contenido. |
| Codebooks acusticos | Todo lo demas | Timbre, prosodia, ruido, detalle fino. |
| PESQ / ViSQOL | Calidad perceptual | Metricas objetivas que se correlacionan con el MOS. |
| EnCodec | Codec de Meta | La linea base RVQ; usado por MusicGen. |
| Mimi | Codec de Kyutai | Tasa de frames de 12.5 Hz; division semantica-acustica; impulsa a Moshi. |
Lecturas Adicionales
- Défossez et al. (2023). EnCodec — la linea base RVQ.
- Kumar et al. (2023). Descript Audio Codec (DAC) — la mayor fidelidad entre los abiertos.
- Siuzdak (2024). SNAC — RVQ multi-escala.
- Kyutai (2024). Mimi codec — division semantica-acustica, destilacion de WavLM.
- Borsos et al. (2023). AudioLM — el paradigma de dos etapas semantico/acustico.
- Zeghidour et al. (2021). SoundStream — el codec RVQ streamable original.