Phase 06: Speech & Audio

Ses sınıflandırması MFCC'ler üzerindeki k-NN'den AST ve BEAT'lere

"Köpek kışkırtması vs siren"den "bu hangi dil"e kadar her şey ses sınıflandırmasıdır. Özellikleri erimiş. Arsitektir her on yılda hareket eder. Değerlendirme AUC, F1 ve sınıf başına hatırlanmaya kalır.

Type: Build

Languages: Python

Prerequisites: Phase 6 · 02 (Spectrograms & Mel), Phase 3 · 06 (CNNs), Phase 5 · 08 (CNNs & RNNs for Text)

Time: ~75 minutes

Sorun

10 saniyelik bir klip alırsınız. Bilmek istiyorsunuz: "Ne?" Şehir ses (siren, egzersiz, köpek), konuşma komutu (evet/hayır/durma), dil kimliği (en/es/ar), konuşmacı duygu (gürültülü/ayrı taraflı), veya çevresel ses (özel) Bunlar ses sınıflandırması ve 2026 yılında temel mimarlık olgunlaşmıştır: log-mel → CNN veya Transformer → softmax.

Ana zorluk ağ değil. Veriler. Ses verilerinin vahşi sınıf dengesizliği, güçlü etki alanı değişimi (temiz vs gürültülü) ve etiket gürültüsü vardır (kim "şehirli gürültü" vs. "restaurant gürültüsü" karar verdi). Sorunun %80'i CNN'i Transformer ile değiştirmek değil, kurasyon, büyütme ve değerlendirme.

Anlaşım

!Audio classification ladder: k-NN on MFCCs to AST to BEATs

k-NN on MFCCs (the 1990s baseline).Her klip için düz MFCC'ler, etiketlenmiş bir banka ile cosine benzerliği hesaplamak, üst K'nin çoğunluk oyunu geri vermek. Temiz, küçük veri kümeleri (Speech Commands, ESC-50) üzerinde şaşırtıcı derecede güçlü.

2D CNN on log-mels (2015-2019).- Yapabilirsin .(T, n_mels)ResNet-18 veya VGG tarzı uygulayın. Küresel ortalama zaman ekseni birleştirir. Sınıflar üzerinde yumuşaklık. 2026 kaggle yarışlarının çoğu için hâlâ temel çizgi.

Audio Spectrogram Transformer, AST (2021-2024).Log-mel'i (örneğin 16×16 patch) yapıştırın, pozisyon yerleştirmelerini ekleyin, bir ViT'ye girin.

BEATs and WavLM-base (2024-2026).Kendi kendine denetimli ön eğitim milyonlarca saat. İhtiyacınız olan denetimli verilerin %1-10'u ile görevinizi inceleme. 2026 yılında bu konuşma dışı ses için varsayılan başlangıç noktasıdır. BEATs-iter3 hesaplama kullanırken AudioSet'te AST'yi 1-2 mAP'ye yener.

Whisper-encoder as a frozen backbone (2024).Whisper'in kodlayıcısını alın, dekodörü bırakın, bir çizgi sınıflandırıcı ekleyin.

Sınıf dengesizliği gerçek bir zorluk

ESC-50: 50 sınıf, her biri 40 klip dengeli, kolay. UrbanSound8K: 10 sınıf, denge dışı 10:1. AudioSet: 632 sınıf, 100.000:1 uzun kuyruğu. Çalışan teknikler:

  • Eğitim sırasında dengeli örnekleme (değerlendirme sırasında değil).
  • Karıştırma: iki klip (ve etiketleri) büyütme olarak doğrusal olarak interpolasyon.
  • SpecAugment: rastgele zaman ve frekans bantlarını maske.

Değerlendirme

  • Çok sınıflı özel (Söz Komutları): üst-1 doğruluk, üst-5 doğruluk.
  • Çok sınıflı çok etiket (AudioSet, UrbanSound tarzı): ortalama doğruluk (mAP).
  • Büyük ölçüde dengesiz: sınıf başına geri çağırma + makro F1.

Bilmen gereken 2026 numarası:

BenchmarkBaselineSOTA 2026Source
ESC-5082% (AST)97.0% (BEATs-iter3)BEATs paper (2024)
AudioSet mAP0.485 (AST)0.548 (BEATs-iter3)HEAR leaderboard 2026
Speech Commands v298% (CNN)99.0% (Audio-MAE)HEAR v2 results

Yapın

Adım 1: Featurization

pythondef 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]

Adım 2: Sıkı bir uzunluklı özet

pythondef 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

Basit ama güçlü: ortalama + zaman aralığı 13 kovan MFCC için 26 boyutlu sabit bir yerleşim sağlar. Anında çalışır. ESC-50'de son zamanlarda 2017 yılında en son NN temel çizgileri yenir.

Adım 3: k-NN

pythondef 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]

Dördüncü adım: Log-Mels'e CNN'e yükselt

PyTorch'te:

pythonimport 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 parametreleri. ESC-50'de tek bir RTX 4090 ile 10 dakika içinde trenler.

Adım 5: önceden eğitilmiş bir ses transformatörünü ince ayarlayın (AST gösterildi)

pythonfrom 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

Örnek, Hub'dan AST'yi ince ayarlar. BEATs, 2026 varsayılan, Hugging Face Hub'da bulunmuyor:BEATs release in microsoft/unilmVe onu o repo ile yükle.BEATsve BEATsConfigsınıflar; ince ayarlama döngüsü aynı şekli korur.

Kullan

2026'da:

SituationStart with
Tiny dataset (<1000 clips)k-NN on MFCC means (your baseline) + audio augmentation
Medium dataset (1K–100K)BEATs or AST fine-tune
Large dataset (>100K)Train from scratch or fine-tune Whisper-encoder
Real-time, edge40-MFCC CNN, quantized to int8 (KWS-style)
Multi-label (AudioSet)BEATs-iter3 with BCE loss + mixup + SpecAugment
Language IDMMS-LID, SpeechBrain VoxLingua107 baseline

Karar kuralları: start with a frozen backbone, not a fresh modelBeats'in kafasını ince ayarlamak, bir kaç hafta değil, saatler içinde %95 SOTA elde eder.

Gönder

  • Kaydet .outputs/skill-classifier-designer.md. Verilen ses sınıflandırma görevi için mimari, artırmalar, sınıf dengesi stratejisi ve değerlendirme metriklerini seçin.

Egzersizler

  1. Easy.Çık .code/main.py.K-NN MFCC temel çizgisini 4 sınıf sentetik veri kümesi (farklı tonlarda saf tonlar) üzerine eğitir.
  2. Medium.Değiştir summarize4 anlık birleştirme aynı sentetik veri kümesindeki ortalama + var'ı çarpıyor mu?
  3. Hard.KullanımtorchaudioESC-50 katında 2 boyutlu bir CNN eğitimi 1. 5 katlı çapraz doğrulama doğruluğunu bildirin. SpecAugment (zaman maskesi = 20, frekans maskesi = 10) ekleyin ve delta raporunu yapın.

Anahtar Terimler

TermWhat people sayWhat it actually means
AudioSetThe ImageNet of audioGoogle's 2M-clip, 632-class weakly-labeled YouTube dataset.
ESC-50Small classification benchmark50 classes × 40 clips of environmental sounds.
ASTAudio Spectrogram TransformerViT on log-mel patches; 2021 SOTA.
BEATsSelf-supervised audioMicrosoft model, iter3 leads AudioSet as of 2026.
MixupPair augmentationx = λ·x1 + (1-λ)·x2; y = λ·y1 + (1-λ)·y2.
SpecAugmentMask-based augmentationZero-out random time and frequency bands of the spectrogram.
mAPMain multi-label metricMean average precision across classes and thresholds.

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.