فاز 6 · درس 3

طبقه‌بندی صدا از k-NN روی MFCC تا AST و BEATs

نوع
ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 6 · درس 02 (طیف‌نگارها و مقیاس مل)، فاز 3 · درس 06 (شبکه‌های کانولوشنی CNN)، فاز 5 · درس 08 (شبکه‌های CNN و RNN برای متن)
یک طیف‌نگار صوتی رنگی با خطوط فرکانسی موازی که به سه بلوک طبقه‌بندی تبدیل می‌شود
فهرست مطالب
  1. صورت مسئله
  2. مفاهیم پایه
  3. چالش اصلی: عدم‌توازن کلاس‌ها
  4. ارزیابی
  5. پیاده‌سازی از صفر
  6. مرحله‌ی 1: استخراج ویژگی
  7. مرحله‌ی 2: بردار خلاصه با طول ثابت
  8. مرحله‌ی 3: مدل k-NN
  9. مرحله‌ی 4: ارتقا به CNN روی log-mel
  10. مرحله‌ی 5: فاین‌تیونینگ یک ترنسفورمر صوتی پیش‌آموزش‌دیده (با نمایش AST)
  11. استفاده از ابزارهای واقعی
  12. خروجی این درس
  13. تمرین‌ها
  14. اصطلاحات کلیدی
  15. برای مطالعه‌ی بیشتر

تشخیص رویدادهای محیطی، شناسایی زبان، تفکیک فرمان‌های صوتی و تحلیل احساسات گوینده همگی زیرمجموعه‌ی مساله‌ی طبقه‌بندی صدا (audio classification) هستند. اگر در توسعه‌ی نرم‌افزارهای ایرانی با پردازش داده‌های گفتاری یا سیگنال‌های صوتی روبه‌رو شده باشید، احتمالاً می‌دانید که برخلاف حوزه‌ی تصویر یا متن، چالش اصلی لزوماً معماری مدل نیست؛ بلکه نویز محیط، توزیع نامتوازن کلاس‌ها و نحوه‌ی استخراج ویژگی‌های طیفی تعیین‌کننده است.

در این درس یاد می‌گیرید چطور از یک خط پایه‌ی بسیار سبک و بدون نیاز به GPU مثل k-NN روی ویژگی‌های MFCC شروع کنید، به معماری‌های کانولوشنی 2D روی طیف‌نگارهای log-mel برسید و در نهایت مدل‌های ترنسفورمر قدرتمندی مانند AST و BEATs را روی تسک صوتی خود فاین‌تیون کنید.

برای اجرای کدهای پایه، استخراج ضرایب و حتی آموزش مدل‌های سبک به کارت گرافیک‌های گران‌قیمت خارجی نیاز ندارید و روی CPU یا پردازنده‌های معمولی نیز قابل پیاده‌سازی هستند. البته برای دانلود وزن‌های اولیه‌ی مدل‌ها از مخازنی مانند Hugging Face Hub، با توجه به ناپایداری‌های معمول شبکه در ایران، ممکن است استفاده از ابزارهای مدیریت دانلود یا تنظیم میرور کمکتان کند.

از «پارس سگ در برابر آژیر خطر» گرفته تا «این چه زبانی است»، همگی در حوزه‌ی طبقه‌بندی صدا (audio classification) قرار می‌گیرند. ویژگی‌ها از جنس مقیاس مِل (mel) هستند. معماری‌ها با هر دهه تغییر می‌کنند، اما معیارهای ارزیابی دست‌نخورده باقی می‌مانند: AUC، F1 و بازخوانی به ازای هر کلاس.

صورت مسئله

یک کلیپ صوتی 10 ثانیه‌ای دریافت می‌کنید و می‌خواهید بدانید: «این چیست؟» صدای شهری (آژیر، دریل، سگ)، فرمان صوتی (بله/خیر/توقف)، تشخیص زبان (en/es/ar)، حس‌وحال گوینده (عصبانی/خنثی) یا صدای محیطی (فضای بسته/باز، هم‌همه‌ی جمعیت). همه‌ی این‌ها مصداق طبقه‌بندی صدا هستند، و در سال 2026 معماری پایه‌ی استاندارد کاملاً جا افتاده است: تبدیل log-mel ← شبکه عصبی کانولوشنی (CNN) یا ترنسفورمر ← سافت‌مکس.

چالش اصلی ساختار شبکه نیست؛ داده است. دیتاست‌های صوتی با عدم‌توازن کلاس‌ها (class imbalance) شدید، جابه‌جایی شدید دامنه داده‌ها (داده‌ی تمیز در برابر نویزی) و برچسب‌های آلوده و مبهم (چه کسی مرز بین «هم‌همه‌ی شهری» و «صدای رستوران» را تعیین کرده؟) روبه‌رو هستند. 80 درصد کار، جمع‌آوری داده، افزایش داده (augmentation) و ارزیابی است؛ نه صرفاً جایگزین کردن CNN با ترنسفورمر.

مفاهیم پایه

نردبان طبقه‌بندی صدا: از k-NN روی MFCC تا AST و BEATs

الگوریتم k-NN روی MFCCها (خط پایه‌ی دهه‌ی 1990). ضرایب کپسترال فرکانس مل (MFCC) را برای هر کلیپ تخت (flatten) کنید، شباهت کسینوسی آن را نسبت به یک بانک نمونه‌های برچسب‌دار بسنجید و رأی اکثریت K همسایه‌ی نزدیک را برگردانید. این روش روی دیتاست‌های تمیز و کوچک (مثل Speech Commands یا ESC-50) خروجی شگفت‌آوری دارد و بدون نیاز به GPU اجرا می‌شود.

شبکه 2D CNN روی ویژگی‌های log-mel (سال‌های 2015 تا 2019). تنسور (T, n_mels) حاصل از log-mel را مانند یک تصویر در نظر بگیرید. یک معماری از نوع ResNet-18 یا سبک VGG روی آن پیاده کنید. روی محور زمان میانگین‌گیری سراسری (global mean pool) انجام دهید و سپس با سافت‌مکس روی کلاس‌ها خروجی بگیرید. این رویکرد در سال 2026 هنوز در بیشتر مسابقات Kaggle خط پایه‌ی اصلی به حساب می‌آید.

ترنسفورمر طیف‌نگار صوتی، AST (سال‌های 2021 تا 2024). ماتریس log-mel را به پچ‌های کوچک (مثلاً 16×16) تقسیم کنید، امبدینگ‌های موقعیت مکانی (position embeddings) را به آن بیفزایید و خروجی را به یک ViT بدهید. این روش در یادگیری نظارت‌شده (supervised learning) روی دیتاست AudioSet به پیشرفته‌ترین نتیجه (mAP معادل 0.485) رسید.

مدل‌های BEATs و WavLM-base (سال‌های 2024 تا 2026). پیش‌آموزش خودنظارتی (self-supervised) روی میلیون‌ها ساعت داده‌ی صوتی. سپس برای تسک مدنظر خود، آن را تنها با 1 تا 10 درصد از داده‌های نظارت‌شده‌ای که در گذشته نیاز بود فاین‌تیون کنید. در سال 2026 این روش نقطه‌ی شروع پیش‌فرض برای صداهای غیرگفتاری است. مدل BEATs-iter3 با مصرف تنها یک‌چهارم توان پردازشی، در AudioSet به میزان 1 تا 2 واحد mAP بهتر از AST عمل می‌کند.

انکودر Whisper به عنوان یک بک‌بون منجمد (2024). انکودر مدل Whisper را بردارید، دیکودر آن را کنار بگذارید و یک طبقه‌بند خطی به آن وصل کنید. این ساختار در تشخیص زبان و طبقه‌بندی رویدادهای صوتی ساده، حتی بدون هیچ‌گونه افزایش داده، عملکردی نزدیک به بهترین مدل‌های روز (near-SOTA) ارائه می‌دهد؛ یک گزینه‌ی پایه‌ی بسیار کم‌هزینه و پربازده.

چالش اصلی: عدم‌توازن کلاس‌ها

دیتاست ESC-50 شامل 50 کلاس و 40 کلیپ برای هر کدام است؛ کاملاً متوازن و ساده. دیتاست UrbanSound8K شامل 10 کلاس است، با نسبت عدم‌توازن 10 به 1. دیتاست AudioSet شامل 632 کلاس با دنباله‌ی طولانی (long tail) و نسبت 100,000 به 1 است. تکنیک‌هایی که واقعاً نتیجه می‌دهند:

  • نمونه‌برداری متوازن در مرحله‌ی آموزش (نه در مرحله‌ی ارزیابی).
  • روش Mixup: ترکیب خطی دو کلیپ صوتی (و برچسب‌های متناظرشان) به عنوان تکنیک افزایش داده.
  • روش SpecAugment: ماسک کردن تصادفی بازه‌های زمانی و فرکانسی؛ ساده ولی حیاتی.

ارزیابی

  • چندکلاسی انحصاری (Speech Commands): دقت برتر (top-1 accuracy) و دقت top-5.
  • چندکلاسی چندبرچسبی (AudioSet و سبک UrbanSound): میانگین دقت متوسط (mAP).
  • دیتاست‌های به‌شدت نامتوازن: بازخوانی به ازای هر کلاس + معیار macro F1.

آمارهای کلیدی سال 2026 که باید بدانید:

بنچ‌مارک خط پایه SOTA در 2026 منبع
ESC-50 82% (AST) 97.0% (BEATs-iter3) مقاله BEATs (2024)
AudioSet mAP 0.485 (AST) 0.548 (BEATs-iter3) جدول رده‌بندی HEAR 2026
Speech Commands v2 98% (CNN) 99.0% (Audio-MAE) نتایج HEAR v2
پایپ‌لاین MFCCتعداد ضرایب را بکشید
MFCC PIPELINEMFCCs run a fixed pipeline: take the spectrogram, warp it onto mel-spaced filters, take the log to mimic loudness perception, then apply a DCT. The DCT packs the smooth spectral envelope into the first few coefficients, so keeping only the lowest 12-13 captures the vocal-tract shape that distinguishes phonemes while discarding pitch and noise in the higher coefficients.اسپکتروگرام→بانک فیلتر مل→log→DCT→MFCCضرایب کپسترال: آبی حفظ‌شده، خاکستری دورریخته (مجموع 40)
MFCCها یک پایپ‌لاین ثابت را اجرا می‌کنند: دریافت اسپکتروگرام، نگاشت آن روی فیلترهای مقیاس مل، اعمال لگاریتم برای شبیه‌سازی ادراک بلندی صدا و سپس اعمال DCT. تبدیل DCT پوش طیفی هموار را در چند ضریب اول فشرده می‌کند؛ بنابراین نگه‌داشتن تنها 12 تا 13 ضریب اولیه، شکل مجرای صوتی را که واج‌ها را متمایز می‌سازد حفظ کرده و زیروبمی صدا و نویز را در ضرایب بالاتر دور می‌ریزد.

پیاده‌سازی از صفر

مرحله‌ی 1: استخراج ویژگی

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]

مرحله‌ی 2: بردار خلاصه با طول ثابت

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

ساده اما کارآمد: ترکیب میانگین و واریانس در طول زمان، برای یک MFCC با 13 ضریب، یک امبدینگ ثابت 26 بعدی می‌سازد. فوراً اجرا می‌شود و تا همین سال 2017 در بنچ‌مارک ESC-50 مدل‌های پایه‌ی شبکه‌های عصبی مدرن را شکست می‌داد.

مرحله‌ی 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]

مرحله‌ی 4: ارتقا به CNN روی log-mel

پیاده‌سازی در 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))

با 3 میلیون پارامتر، روی دیتاست ESC-50 با یک کارت گرافیک RTX 4090 در حدود 10 دقیقه آموزش می‌بیند و به دقت بالای 80 درصد می‌رسد.

مرحله‌ی 5: فاین‌تیونینگ یک ترنسفورمر صوتی پیش‌آموزش‌دیده (با نمایش AST)

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

این مثال، مدل AST را از Hugging Face Hub فاین‌تیون می‌کند. مدل BEATs که استاندارد سال 2026 است، روی Hugging Face Hub قرار ندارد: یک چک‌پوینت از صفحه‌ی رسمی BEATs در ریپوی microsoft/unilm دانلود کنید و آن را با کلاس‌های BEATs و BEATsConfig همان ریپوزیتوری لود نمایید؛ ساختار حلقه‌ی فاین‌تیونینگ به همین شکل باقی می‌ماند.

استفاده از ابزارهای واقعی

پشته‌ی فناوری در سال 2026:

شرایط مسئله گزینه‌ی شروع
دیتاست بسیار کوچک (کمتر از 1000 کلیپ) الگوریتم k-NN روی میانگین MFCC (خط پایه‌ی اولیه) + افزایش داده‌ی صوتی
دیتاست متوسط (1K تا 100K) فاین‌تیونینگ BEATs یا AST
دیتاست بزرگ (بیشتر از 100K) آموزش مدل از صفر یا فاین‌تیونینگ انکودر Whisper
بی‌درنگ (Real-time) و دستگاه‌های لبه (Edge) مدل CNN با 40 ضریب MFCC، کوانتیزه‌شده به int8 (سبک KWS)
چندبرچسبی (AudioSet) مدل BEATs-iter3 با تابع زیان (loss) از نوع BCE + روش Mixup + روش SpecAugment
تشخیص زبان مدل MMS-LID یا خط پایه‌ی VoxLingua107 در SpeechBrain

قاعده‌ی تصمیم‌گیری: کار را با یک بک‌بون منجمد شروع کنید، نه یک مدل خام از صفر. فاین‌تیون کردن یک سر (head) روی مدل BEATs، شما را در عرض چند ساعت به 95 درصد کارایی بهترین مدل‌های روز می‌رساند، نه چند هفته.

خروجی این درس

این مستند را با نام outputs/skill-classifier-designer.md ذخیره کنید. در آن معماری، تکنیک‌های افزایش داده، استراتژی متوازن‌سازی کلاس‌ها و معیار ارزیابی را برای یک تسک طبقه‌بندی صدای مشخص تعیین نمایید.

تمرین‌ها

  1. ساده. فایل code/main.py را اجرا کنید. این اسکریپت خط پایه‌ی k-NN روی MFCC را روی یک دیتاست مصنوعی 4 کلاسی (تن‌های صوتی خالص با گام‌های فرکانسی مختلف) آموزش می‌دهد. ماتریس درهم‌ریختگی (confusion matrix) خروجی را گزارش کنید.
  2. متوسط. تابع summarize را تغییر دهید و مقادیر [mean, var, skew, kurtosis] را استخراج کنید. آیا ادغام 4 گشتاور آماری (4-moment pooling) در مقایسه با میانگین+واریانس روی همان دیتاست مصنوعی نتیجه‌ی بهتری می‌دهد؟
  3. پیشرفته. با استفاده از کتابخانه‌ی torchaudio، یک مدل 2D CNN را روی فولد 1 از دیتاست ESC-50 آموزش دهید. دقت حاصل از اعتبارسنجی متقاطع 5 برابری (5-fold cross-validation) را ثبت کنید. سپس روش SpecAugment را (با پارامترهای time mask = 20 و freq mask = 10) اضافه کنید و میزان تغییر عملکرد (دلتا) را گزارش دهید.

اصطلاحات کلیدی

اصطلاح در گفتار رایج معنای فنی دقیق
AudioSet ایمیج‌نت دنیای صوت دیتاست گوگل شامل 2 میلیون کلیپ یوتیوب با برچسب‌گذاری ضعیف در 632 کلاس.
ESC-50 بنچ‌مارک طبقه‌بندی کوچک 50 کلاس و در هر کدام 40 کلیپ از صداهای محیطی.
AST ترنسفورمر طیف‌نگار صوتی معماری ViT روی پچ‌های log-mel؛ بهترین مدل سال‌های 2021 تا 2024.
BEATs مدل صوتی خودنظارتی مدل مایکروسافت که نسخه‌ی iter3 آن از سال 2026 صدرنشین بنچ‌مارک AudioSet است.
Mixup افزایش داده جفتی ترکیب خطی دو ورودی و برچسب‌هایشان: x = λ·x1 + (1-λ)·x2; y = λ·y1 + (1-λ)·y2.
SpecAugment افزایش داده مبتنی بر ماسک صفر کردن تصادفی بخش‌هایی از باندهای زمانی و فرکانسی طیف‌نگار.
mAP معیار اصلی چندبرچسبی میانگین دقت متوسط در بین تمامی کلاس‌ها و آستانه‌ها.

برای مطالعه‌ی بیشتر

سؤالات متداول

ساده‌ترین مدل پایه برای طبقه‌بندی صدا بدون نیاز به کارت گرافیک چیست؟

استخراج ضرایب MFCC، محاسبه‌ی میانگین و واریانس در طول زمان برای رسیدن به یک امبدینگ ثابت، و سپس استفاده از الگوریتم k-NN؛ این ترکیب بدون GPU سریعاً اجرا شده و روی دیتاست‌های تمیز و کوچک بسیار قدرتمند است.

تفاوت مدل AST با BEATs در پردازش صوت چیست؟

مدل AST یک Vision Transformer (ViT) نظارت‌شده است که پچ‌های لاگ-مل را دریافت می‌کند؛ درحالی‌که BEATs با یادگیری خودنظارتی روی میلیون‌ها ساعت صوت پیش‌آموزش دیده و با داده‌های برچسب‌دار بسیار کمتر و توان محاسباتی پایین‌تر، دقت بالاتری ثبت می‌کند.

مهم‌ترین روش‌ها برای مقابله با عدم‌توازن شدید کلاس‌ها در داده‌های صوتی چیستند؟

نمونه‌برداری متوازن در مرحله‌ی آموزش، روش افزایش داده‌ی Mixup (ترکیب خطی نمونه‌ها و برچسب‌ها) و روش SpecAugment (ماسک کردن تصادفی زمان و فرکانس).

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.