Phase 06 - Lesson 13
Codecs de Audio Neurais — EnCodec, SNAC, Mimi, DAC e a Divisao Semantica-Acustica
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
A geracao de audio em 2026 e quase toda baseada em tokens. EnCodec, SNAC, Mimi e DAC transformam formas de onda continuas em sequencias discretas que um transformer consegue prever. A divisao entre tokens semanticos e acusticos — primeiro codebook como semantico, o resto como acustico — e a mudanca arquitetural mais importante desde o Transformer para audio.
Tipo: Aprender Linguagens: Python Pre-requisitos: Fase 6 · 02 (Espectrogramas), Fase 10 · 11 (Quantizacao), Fase 5 · 19 (Tokenizacao de Subpalavras) Tempo: ~60 minutos
O Problema
Modelos de linguagem trabalham com tokens discretos. Audio e continuo. Se voce quer um modelo no estilo LLM para fala / musica — MusicGen, Moshi, Sesame CSM, VibeVoice, Orpheus — voce precisa primeiro de um codec de audio neural: um encoder aprendido que discretiza o audio em um pequeno vocabulario de tokens, e um decoder correspondente que reconstroi a forma de onda.
Duas familias surgiram:
- Codecs focados em reconstrucao — EnCodec, DAC. Otimizam a qualidade perceptual do audio. Os tokens sao "acusticos" — capturam tudo, incluindo identidade do locutor, timbre, ruido de fundo.
- Codecs focados em semantica — Mimi (Kyutai), SpeechTokenizer. Forcam o primeiro codebook a codificar conteudo linguistico / fonetico (muitas vezes por destilacao a partir do WavLM). Os codebooks seguintes sao detalhe acustico.
A descoberta de 2024-2026: um codec puramente de reconstrucao gera fala borrada quando voce tenta gerar a partir de texto. O LLM sobre tokens do codec tem que aprender tanto a estrutura da linguagem QUANTO a estrutura acustica no mesmo codebook, o que nao escala. Separa-las — codebook semantico 0, codebooks acusticos 1-N — e o que faz o Moshi e o Sesame CSM funcionarem.
O Conceito
O truque central: Quantizacao Vetorial Residual (RVQ)
Em vez de um unico codebook gigante (que precisaria de milhoes de codigos para boa qualidade), todos os codecs de audio modernos usam RVQ: uma cascata de codebooks pequenos. O primeiro codebook quantiza a saida do encoder; o segundo quantiza o residuo; e assim por diante. Cada codebook tem 1024 codigos. 8 codebooks = vocabulario efetivo de 1024^8 = 10^24.
No momento da inferencia, o decoder soma todos os codigos escolhidos por frame para reconstruir.
Os quatro codecs que importam em 2026
EnCodec (Meta, 2022). A linha de base. Encoder-decoder sobre a forma de onda, gargalo RVQ. 24 kHz, ate 32 codebooks possiveis, padrao de 4 codebooks @ 1.5 kbps. Usa a arquitetura 1D conv + transformer + 1D conv. Usado pelo MusicGen.
DAC (Descript, 2023). RVQ com codebooks normalizados por L2, funcoes de ativacao periodicas, perdas aprimoradas. A maior fidelidade de reconstrucao de qualquer codec aberto — as vezes indistinguivel da fala original com 12 codebooks. Banda completa de 44.1 kHz.
SNAC (Hubert Siuzdak, 2024). RVQ multi-escala — os codebooks grossos operam a uma taxa de frames menor que os finos. Modela o audio de forma hierarquica: um "esboco" grosso a ~12 Hz mais detalhe a 50 Hz. Usado pelo Orpheus-3B porque a estrutura hierarquica se encaixa bem na geracao baseada em LM.
Mimi (Kyutai, 2024). O divisor de aguas de 2026. Taxa de frames de 12.5 Hz (extremamente baixa), 8 codebooks @ 4.4 kbps. O codebook 0 e destilado do WavLM — treinado para prever as features de conteudo de fala do WavLM. Os codebooks 1-7 sao residuos acusticos. Essa divisao alimenta o Moshi (Licao 15) e o Sesame CSM.
Taxas de frames importam para modelagem de linguagem
Taxa de frames menor = sequencia mais curta = LM mais rapido.
| Codec | Taxa de frames | 1 s = N frames | Bom para |
|---|---|---|---|
| EnCodec-24k | 75 Hz | 75 | musica, audio geral |
| DAC-44.1k | 86 Hz | 86 | musica de alta fidelidade |
| SNAC-24k (grosso) | ~12 Hz | 12 | eficiente para AR-LM |
| Mimi | 12.5 Hz | 12.5 | fala em streaming |
A 12.5 Hz, uma fala de 10 segundos tem apenas 125 frames de codec — um transformer consegue preve-los 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 no Mimi). Codifica o que foi dito — fonemas, palavras, conteudo. Destilado do WavLM via uma perda auxiliar de predicao.
- Tokens acusticos (codebooks 1-7). Codificam timbre, identidade do locutor, prosodia, ruido de fundo, detalhe fino.
Um LM autoregressivo preve primeiro o token semantico (condicionado ao texto), depois preve os tokens acusticos (condicionados ao semantico + referencia do locutor). Essa fatoracao e o motivo de o TTS moderno conseguir clonar vozes em zero-shot: o modelo semantico cuida do conteudo; o modelo acustico cuida do timbre.
Qualidade de reconstrucao em 2026 (bits por segundo, menor bitrate e melhor)
| 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 |
Codecs tradicionais como o Opus ainda vencem por bit em qualidade perceptual. Codecs neurais vencem em tokens discretos (que o Opus nao produz) e em qualidade para modelos generativos (o que o LM consegue fazer com esses tokens).
Construa
Passo 1: codificar com 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 vai de 0 a 1023 (10 bits).
Passo 2: decodificar e medir a reconstrucao
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()
Passo 3: a divisao 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:]
O codebook semantico 0 esta alinhado ao WavLM. Voce pode treinar um transformer de texto-para-semantico — vocabulario muito menor do que ir direto para audio. Depois, um decoder separado de acustico-para-forma-de-onda se condiciona a uma referencia do locutor.
Passo 4: por que o LM autoregressivo sobre tokens do codec funciona
Para um clipe de fala de 10 s a 12.5 Hz × 8 codebooks do Mimi:
N_tokens = 10 * 12.5 * 8 = 1000 tokens
1000 tokens e um contexto trivial para um transformer. Um transformer de 256M de parametros consegue gerar 10 segundos de fala em milissegundos em uma GPU moderna.
Use
Mapeie o problema → codec:
| Tarefa | Codec |
|---|---|
| Geracao geral de musica | EnCodec-24k |
| Reconstrucao de maxima fidelidade | DAC-44.1k |
| LM autoregressivo sobre fala (TTS) | SNAC ou Mimi |
| Fala full-duplex em streaming | Mimi (12.5 Hz) |
| Biblioteca de efeitos sonoros com texto | EnCodec + condicao T5 |
| Edicao de audio de grao fino | DAC + inpainting |
Regra geral: se voce esta construindo um modelo generativo, comece com Mimi ou SNAC. Se voce esta construindo um pipeline de compressao, use Opus.
Armadilhas
- Codebooks demais. Adicionar codebooks aumenta a fidelidade linearmente, mas tambem aumenta o comprimento da sequencia do LM linearmente. Pare em 8-12.
- Incompatibilidade de taxa de frames. Treinar o LM em Mimi a 12.5 Hz e depois fazer fine-tuning em EnCodec a 50 Hz falha silenciosamente.
- Supor que todos os codebooks sao iguais. No Mimi, o codebook 0 carrega o conteudo; perde-lo destroi a inteligibilidade. Perder o codebook 7 e quase imperceptivel.
- Usar a qualidade de reconstrucao como unica metrica. Um codec pode ter otima reconstrucao mas ser inutil para geracao baseada em LM se a estrutura semantica for ruim.
Entregue
Salve como outputs/skill-codec-picker.md. Escolha um codec para uma dada tarefa de geracao ou compressao.
Exercicios
- Facil. Rode
code/main.py. Ele implementa um quantizador escalar + residual de brinquedo e mede o erro de reconstrucao conforme voce adiciona codebooks. - Medio. Instale
encodece compare 1, 4, 8, 32 codebooks em um clipe de fala separado para teste. Plote PESQ ou MSE vs bitrate. - Dificil. Carregue o Mimi. Codifique um clipe. Substitua o codebook 0 por inteiros aleatorios; decodifique. Depois substitua o codebook 7 da mesma forma. Compare as duas corrupcoes — a corrupcao do codebook 0 deve destruir a inteligibilidade; a corrupcao do codebook 7 quase nao deve mudar nada.
Termos-chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| RVQ | Quantizacao residual | Cascata de codebooks pequenos; cada um quantiza o residuo anterior. |
| Taxa de frames | Velocidade do codec | Quantos frames-token por segundo. Menor = LM mais rapido. |
| Codebook semantico | Codebook 0 (Mimi) | Codebook destilado de features SSL; codifica conteudo. |
| Codebooks acusticos | Todo o resto | Timbre, prosodia, ruido, detalhe fino. |
| PESQ / ViSQOL | Qualidade perceptual | Metricas objetivas que se correlacionam com o MOS. |
| EnCodec | Codec da Meta | A linha de base RVQ; usado pelo MusicGen. |
| Mimi | Codec da Kyutai | Taxa de frames de 12.5 Hz; divisao semantica-acustica; alimenta o Moshi. |
Leitura Complementar
- Défossez et al. (2023). EnCodec — a linha de base RVQ.
- Kumar et al. (2023). Descript Audio Codec (DAC) — a maior fidelidade entre os abertos.
- Siuzdak (2024). SNAC — RVQ multi-escala.
- Kyutai (2024). Mimi codec — divisao semantica-acustica, destilacao do WavLM.
- Borsos et al. (2023). AudioLM — o paradigma de dois estagios semantico/acustico.
- Zeghidour et al. (2021). SoundStream — o codec RVQ streamable original.