Phase 06 - Lesson 03

Classificação de Áudio — De k-NN sobre MFCCs ao AST e ao BEATs

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Tudo, desde "cachorro latindo vs. sirene" até "qual idioma é este", é classificação de áudio. As features são mels. A arquitetura muda a cada década. A avaliação continua sendo AUC, F1 e recall por classe.

Tipo: Build Linguagens: Python Pré-requisitos: Fase 6 · 02 (Espectrogramas e Mel), Fase 3 · 06 (CNNs), Fase 5 · 08 (CNNs e RNNs para Texto) Tempo: ~75 minutos

O Problema

Você recebe um clipe de 10 segundos. Você quer saber: "o que é isto?" Som urbano (sirene, furadeira, cachorro), comando de fala (sim/não/parar), identificação de idioma (en/es/ar), emoção do falante (irritado/neutro) ou som ambiente (interno/externo, burburinho). Tudo isso é classificação de áudio, e em 2026 a arquitetura de referência está madura: log-mel → CNN ou Transformer → softmax.

A dificuldade central não é a rede. São os dados. Os conjuntos de dados de áudio têm desbalanceamento brutal de classes, forte mudança de domínio (limpo vs. ruidoso) e ruído de rótulo (quem decidiu o que é "burburinho urbano" vs. "ruído de restaurante"?). Os 80% do problema estão na curadoria, na augmentação e na avaliação, não em trocar a CNN pelo Transformer.

O Conceito

Escada da classificação de áudio: k-NN sobre MFCCs ao AST ao BEATs

k-NN sobre MFCCs (a baseline dos anos 1990). Achate os MFCCs por clipe, calcule a similaridade de cosseno em relação a um banco rotulado e retorne o voto majoritário dos K mais próximos. Surpreendentemente forte em conjuntos de dados limpos e pequenos (Speech Commands, ESC-50). Roda sem GPU.

CNN 2D sobre log-mels (2015-2019). Trate o log-mel (T, n_mels) como uma imagem. Aplique ResNet-18 ou estilo VGG. Faça global mean pool no eixo do tempo. Softmax sobre as classes. Ainda é a baseline na maioria das competições do kaggle em 2026.

Audio Spectrogram Transformer, AST (2021-2024). Divida o log-mel em patches (por exemplo, patches 16×16), adicione embeddings de posição e alimente um ViT. Estado da arte no AudioSet (mAP 0,485) para aprendizado supervisionado.

BEATs e WavLM-base (2024-2026). Pré-treinamento autossupervisionado em milhões de horas. Faça fine-tune na sua tarefa com 1-10% dos dados supervisionados que você teria precisado. Em 2026 este é o ponto de partida padrão para áudio não relacionado a fala. O BEATs-iter3 supera o AST em 1-2 mAP no AudioSet usando 1/4 do poder computacional.

Encoder do Whisper como backbone congelado (2024). Pegue o encoder do Whisper, descarte o decoder e acople um classificador linear. Próximo do SOTA em identificação de idioma e classificação simples de eventos com zero augmentação de áudio. A baseline do "almoço grátis".

O desbalanceamento de classes é o desafio real

ESC-50: 50 classes, 40 clipes cada — balanceado, fácil. UrbanSound8K: 10 classes, desbalanceado 10:1. AudioSet: 632 classes com uma cauda longa de 100.000:1. Técnicas que funcionam:

  • Amostragem balanceada durante o treinamento (não na avaliação).
  • Mixup: interpole linearmente dois clipes (e seus rótulos) como augmentação.
  • SpecAugment: mascare faixas aleatórias de tempo e frequência. Simples; crítico.

Avaliação

  • Multiclasse exclusiva (Speech Commands): acurácia top-1, acurácia top-5.
  • Multiclasse multirrótulo (AudioSet, estilo UrbanSound): mean average precision (mAP).
  • Fortemente desbalanceada: recall por classe + macro F1.

Números de 2026 que você deve conhecer:

Benchmark Baseline SOTA 2026 Fonte
ESC-50 82% (AST) 97,0% (BEATs-iter3) Artigo do BEATs (2024)
AudioSet mAP 0,485 (AST) 0,548 (BEATs-iter3) HEAR leaderboard 2026
Speech Commands v2 98% (CNN) 99,0% (Audio-MAE) Resultados HEAR v2

Mãos à Obra

Passo 1: featurização

def featurize_mfcc(signal, sr, n_mfcc=13, n_mels=40, frame_len=400, hop=160):
    mag = stft_magnitude(signal, frame_len, hop)
    fb = mel_filterbank(n_mels, frame_len, sr)
    mels = apply_filterbank(mag, fb)
    log = log_transform(mels)
    return [dct_ii(frame, n_mfcc) for frame in log]

Passo 2: resumo de comprimento fixo

def summarize(mfcc_frames):
    n = len(mfcc_frames[0])
    mean = [sum(f[i] for f in mfcc_frames) / len(mfcc_frames) for i in range(n)]
    var = [
        sum((f[i] - mean[i]) ** 2 for f in mfcc_frames) / len(mfcc_frames) for i in range(n)
    ]
    return mean + var

Simples, mas forte: média + variância ao longo do tempo dão um embedding fixo de 26 dimensões para um MFCC de 13 coeficientes. Roda instantaneamente. Superou baselines de NN estado da arte no ESC-50 tão recentemente quanto 2017.

Passo 3: k-NN

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a)) or 1e-12
    nb = math.sqrt(sum(x * x for x in b)) or 1e-12
    return dot / (na * nb)

def knn_classify(q, bank, labels, k=5):
    sims = sorted(range(len(bank)), key=lambda i: -cosine(q, bank[i]))[:k]
    votes = Counter(labels[i] for i in sims)
    return votes.most_common(1)[0][0]

Passo 4: evolua para uma CNN sobre log-mels

Em PyTorch:

import torch.nn as nn

class AudioCNN(nn.Module):
    def __init__(self, n_mels=80, n_classes=50):
        super().__init__()
        self.body = nn.Sequential(
            nn.Conv2d(1, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
            nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(),
            nn.AdaptiveAvgPool2d(1),
        )
        self.head = nn.Linear(128, n_classes)

    def forward(self, x):  # x: (B, 1, T, n_mels)
        return self.head(self.body(x).flatten(1))

3M de parâmetros. Treina em ~10 min no ESC-50 com uma única RTX 4090. Mais de 80% de acurácia.

Passo 5: o padrão de 2026 — fine-tune do BEATs

from transformers import ASTFeatureExtractor, ASTForAudioClassification

ext = ASTFeatureExtractor.from_pretrained("MIT/ast-finetuned-audioset-10-10-0.4593")
model = ASTForAudioClassification.from_pretrained(
    "MIT/ast-finetuned-audioset-10-10-0.4593",
    num_labels=50,
    ignore_mismatched_sizes=True,
)

inputs = ext(audio, sampling_rate=16000, return_tensors="pt")
logits = model(**inputs).logits

Para o BEATs, use microsoft/BEATs-base por meio da biblioteca beats; a API do transformers tem o mesmo formato.

Use na Prática

A stack de 2026:

Situação Comece com
Conjunto de dados minúsculo (<1000 clipes) k-NN sobre médias de MFCC (sua baseline) + augmentação de áudio
Conjunto de dados médio (1K–100K) fine-tune do BEATs ou AST
Conjunto de dados grande (>100K) Treinar do zero ou fazer fine-tune do encoder do Whisper
Tempo real, edge CNN de 40-MFCC, quantizada para int8 (estilo KWS)
Multirrótulo (AudioSet) BEATs-iter3 com loss BCE + mixup + SpecAugment
Identificação de idioma MMS-LID, baseline SpeechBrain VoxLingua107

Regra de decisão: comece com um backbone congelado, não com um modelo novo. Fazer fine-tune de uma cabeça do BEATs leva você a 95% do SOTA em horas, não em semanas.

Entregue

Salve como outputs/skill-classifier-designer.md. Escolha a arquitetura, as augmentações, a estratégia de balanceamento de classes e a métrica de avaliação para uma dada tarefa de classificação de áudio.

Exercícios

  1. Fácil. Execute o code/main.py. Ele treina a baseline k-NN MFCC em um conjunto de dados sintético de 4 classes (tons puros em diferentes alturas). Reporte a matriz de confusão.
  2. Médio. Substitua summarize por [média, variância, assimetria, curtose]. O pooling de 4 momentos supera média+variância no mesmo conjunto de dados sintético?
  3. Difícil. Usando torchaudio, treine uma CNN 2D no fold 1 do ESC-50. Reporte a acurácia de validação cruzada com 5 folds. Adicione o SpecAugment (máscara de tempo = 20, máscara de frequência = 10) e reporte o delta.

Termos-Chave

Termo O que as pessoas dizem O que realmente significa
AudioSet O ImageNet do áudio Conjunto de dados do YouTube da Google, com 2M de clipes, 632 classes e rótulos fracos.
ESC-50 Pequeno benchmark de classificação 50 classes × 40 clipes de sons ambientes.
AST Audio Spectrogram Transformer ViT sobre patches de log-mel; SOTA de 2021.
BEATs Áudio autossupervisionado Modelo da Microsoft; o iter3 lidera o AudioSet em 2026.
Mixup Augmentação por pares x = λ·x1 + (1-λ)·x2; y = λ·y1 + (1-λ)·y2.
SpecAugment Augmentação baseada em máscaras Zera faixas aleatórias de tempo e frequência do espectrograma.
mAP Principal métrica multirrótulo Mean average precision ao longo de classes e thresholds.

Leitura Adicional

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