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:

  1. 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.
  2. 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

Panorama de cuatro codecs: EnCodec, DAC, SNAC (multi-escala), Mimi (semantico+acustico)

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

  1. Facil. Ejecuta code/main.py. Implementa un cuantizador escalar + residual de juguete y mide el error de reconstruccion a medida que agregas codebooks.
  2. Medio. Instala encodec y compara 1, 4, 8, 32 codebooks en un clip de habla reservado para prueba. Grafica PESQ o MSE vs bitrate.
  3. 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

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).