فاز 6 · درس 1

مبانی پردازش صوت — شکل‌موج، نمونه‌برداری و تبدیل فوریه

نوع
مفهومی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 1 · بخش 06 (بردارها و ماتریس‌ها)، فاز 1 · بخش 14 (توزیع‌های احتمال)
نمایش بصری شکل‌موج صوتی آنالوگ پیوسته که به نقطه‌های نمونه‌برداری دیجیتال گسسته تبدیل شده و در پس‌زمینه به خطوط فرکانسی رنگی تجزیه می‌شود
فهرست مطالب
  1. صورت مسئله
  2. مفهوم
  3. پیاده‌سازی از صفر
  4. مرحله‌ی 1: خواندن یک فایل صوتی و رسم شکل موج
  5. مرحله‌ی 2: سنتز موج سینوسی از اصول اولیه
  6. مرحله‌ی 3: محاسبه‌ی تبدیل فوریه‌ی گسسته به صورت دستی
  7. مرحله‌ی 4: یافتن فرکانس غالب
  8. مرحله‌ی 5: مشاهده‌ی عینی الیاسینگ
  9. استفاده از ابزارهای واقعی
  10. خروجی این درس
  11. تمرین‌ها
  12. اصطلاحات کلیدی
  13. برای مطالعه‌ی بیشتر

بسیاری از مهندسانی که وارد حوزه‌ی پردازش صوت و یادگیری ماشین می‌شوند، مدل‌ها را بی‌نقص آموزش می‌دهند اما با خطاهای خاموش روبه‌رو می‌شوند؛ خطاهایی مانند دو برابر شدن نرخ خطای کلمات در مدل‌های تشخیص گفتار یا تولید نویزهای غیرعادی در مدل‌های تبدیل متن به گفتار. ریشه‌ی تمام این مشکلات به پیش‌پردازش سیگنال و درک نادرست از چگونگی تبدیل صدای پیوسته به داده‌های عددی بازمی‌گردد.

در این درس پایه‌ای، فاصله‌ی میان ارتعاشات فیزیکی هوا و تنسورهای مورد نیاز مدل‌های هوش مصنوعی را پر می‌کنیم. یاد می‌گیرید که نرخ نمونه‌برداری و عمق بیتی دقیقاً چه تاثیری روی داده دارند، چگونه با پدیده‌ی الیاسینگ مقابله کنید و چگونه با تبدیل فوریه، سیگنال صوتی را از حوزه‌ی زمان به فرکانس ببرید.

تمام کدهای این درس سبک هستند و برای پیاده‌سازی و اجرای آن‌ها به پردازنده‌های گرافیکی ابری یا ابزارهای پیچیده نیازی ندارید؛ محاسبات مستقیماً روی پردازنده‌ی استاندارد سیستم شخصی شما قابل اجراست.

شکل موج‌ها همان سیگنال خام هستند. طیف‌نگاشت‌ها (Spectrograms) بازنمایی آن به شمار می‌روند. ویژگی‌های مل (Mel features) نیز فرم سازگار با یادگیری ماشین هستند. هر پایپ‌لاین مدرن بازشناسی گفتار (ASR) و تبدیل متن به گفتار (TTS) از همین پله‌ها بالا می‌رود، و اولین پله، درک نمونه‌برداری و فوریه است.

صورت مسئله

میکروفون سیگنالی از تغییرات فشار بر حسب زمان تولید می‌کند؛ در حالی که شبکه‌ی عصبی شما تنسور مصرف می‌کند. میان این دو، مجموعه‌ای از قراردادها قرار دارد که اگر رعایت نشوند، به باگ خاموش ختم می‌شوند: مدل بدون خطا آموزش می‌بیند ولی نرخ خطای کلمات (WER) دو برابر می‌شود، صدای خروجی مدل TTS همراه با صدای «هیس» است، یا سیستم شبیه‌سازی صدا به جای ویژگی‌های گوینده، مشخصات آکوستیک میکروفون را حفظ می‌کند.

هر باگی در سیستم‌های صوتی در نهایت به یکی از این سه پرسش برمی‌گردد:

  1. داده‌ها با چه نرخ نمونه‌برداری ضبط شده‌اند و مدل چه نرخی را انتظار دارد؟
  2. آیا سیگنال دچار الیاسینگ (تداخل فرکانسی) شده است؟
  3. آیا محاسبات را روی نمونه‌های خام انجام می‌دهید یا روی بازنمایی فرکانسی؟

اگر این موارد را درست متوجه شوید، بقیه‌ی مسیر فاز 6 برایتان روان خواهد شد. اگر این مبانی را اشتباه متوجه شوید، حتی مدلی مثل Whisper-Large-v4 هم خروجی بی‌کیفیت و غیرقابل استفاده‌ای تولید خواهد کرد.

مفهوم

تصویرسازی شکل موج، نمونه‌برداری، تبدیل فوریه‌ی گسسته (DFT) و خانه‌های فرکانسی

شکل موج (Waveform). آرایه‌ای یک‌بعدی از اعداد اعشاری در بازه‌ی [-1.0, 1.0]. ایندکس‌های آن بر اساس شماره‌ی نمونه هستند. برای تبدیل به ثانیه، آن را بر نرخ نمونه‌برداری تقسیم می‌کنیم: t = n / sr. یک قطعه‌صوت 10 ثانیه‌ای با نرخ 16 kHz آرایه‌ای شامل 160,000 عدد اعشاری است.

نرخ نمونه‌برداری (Sampling rate یا sr). تعداد نمونه‌ها در هر ثانیه. نرخ‌های رایج در سال 2026:

نرخ کاربرد
8 kHz تلفن‌های قدیمی و سیستم‌های VOIP قدیمی. نایکویست در 4 kHz حروف بی‌صدا را از بین می‌برد؛ برای ASR مناسب نیست.
16 kHz استاندارد رایج ASR. مدل‌هایی مثل Whisper، Parakeet و SeamlessM4T v2 همگی از ورودی 16 kHz استفاده می‌کنند.
22.05 kHz آموزش ووکودر برای مدل‌های TTS قدیمی‌تر.
24 kHz مدل‌های مدرن TTS (مانند Kokoro، F5-TTS و xTTS v2).
44.1 kHz دیسک‌های صوتی CD و موسیقی.
48 kHz سینما، تجهیزات حرفه‌ای صدا، و مدل‌های TTS با وضوح بالا (مانند VALL-E 2 و NaturalSpeech 3).

نایکویست-شنون (Nyquist-Shannon). با نرخ نمونه‌برداری sr می‌توان فرکانس‌ها را دقیقاً تا سقف sr/2 بدون ابهام بازنمایی کرد. مرز sr/2 را فرکانس نایکویست می‌نامند. انرژی فرکانس‌های فراتر از نایکویست دچار الیاسینگ می‌شود — یعنی روی فرکانس‌های پایین‌تر تا می‌خورد — و سیگنال را خراب می‌کند. پیش از کاهش نرخ نمونه‌برداری، همیشه باید فیلتر پایین‌گذر اعمال کنید.

عمق بیتی (Bit depth). فرمت 16-bit PCM (عدد صحیح علامت‌دار 16 بیتی، با بازه‌ی ±32,767) فرمت استانداردی برای انتقال فایل صوتی است. عمق 24 بیتی برای موسیقی و اعشاری 32 بیتی برای پردازش سیگنال دیجیتال (DSP) در حافظه به کار می‌رود. کتابخانه‌هایی مانند soundfile داده‌ها را به صورت int16 می‌خوانند اما آن‌ها را در قالب آرایه‌های float32 در بازه‌ی [-1, 1] تحویل می‌دهند.

تبدیل فوریه (Fourier Transform). هر سیگنال متناهی از مجموع چند موج سینوسی با فرکانس‌های مختلف تشکیل می‌شود. تبدیل فوریه‌ی گسسته (DFT) برای N نمونه، N ضریب مختلط به دست می‌دهد؛ یعنی یک ضریب برای هر خانه‌ی فرکانسی. bin k به فرکانس k · sr / N هرتز نگاشت می‌شود. اندازه‌ی این ضریب بیانگر دامنه‌ی آن فرکانس و زاویه‌اش نشان‌دهنده‌ی فاز است.

تبدیل فوریه‌ی سریع (FFT). الگوریتمی با پیچیدگی O(N log N) برای محاسبه‌ی تبدیل فوریه‌ی گسسته (DFT) در شرایطی که N توانی از 2 باشد. تمام کتابخانه‌های صوتی در پشت‌صحنه از FFT استفاده می‌کنند. یک FFT با 1024 نمونه در نرخ 16 kHz، دقیقاً 512 خانه‌ی فرکانسی کاربردی در بازه‌ی 0 تا 8 kHz با وضوح 15.6 هرتز در اختیارتان می‌گذارد.

فریم‌بندی و پنجره‌گذاری (Framing + window). ما تبدیل فوریه را روی کل یک فایل صوتی به یک‌باره اعمال نمی‌کنیم. ابتدا صوت را به فریم‌های هم‌پوشان (معمولاً 25 میلی‌ثانیه‌ای با گام 10 میلی‌ثانیه) خرد می‌کنیم، هر فریم را در یک تابع پنجره (مثل Hann یا Hamming) ضرب می‌کنیم تا ناپیوستگی‌های لبه‌ها حذف شوند، و سپس روی هر فریم FFT می‌زنیم. این همان تبدیل فوریه‌ی کوتاه‌مدت (STFT) است. در درس 02 ادامه‌ی همین مسیر را پی می‌گیریم.

مقیاس ملفرکانس را بکشید
MEL SCALEHuman hearing resolves low frequencies finely and high ones coarsely. The mel scale bends linear Hz to match: it is near-linear below 1 kHz and compresses steeply above it, so a jump from 8 to 9 kHz spans far fewer mels than 200 to 300 Hz. Mel filterbanks spend their resolution where the ear actually cares.Hz →mel
شنوایی انسان فرکانس‌های پایین را با دقت بالا و فرکانس‌های بالا را با تقریب تفکیک می‌کند. مقیاس مل هرتزِ خطی را برای تطابق خم می‌کند: زیر 1 kHz تقریباً خطی است و بالاتر از آن با شیب تندی فشرده می‌شود؛ به‌طوری‌که جهش از 8 به 9 kHz مقادیر مل بسیار کمتری نسبت به 200 تا 300 Hz را در بر می‌گیرد. بانک‌های فیلتر مل تفکیک‌پذیری خود را جایی صرف می‌کنند که گوش واقعاً به آن اهمیت می‌دهد.

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

مرحله‌ی 1: خواندن یک فایل صوتی و رسم شکل موج

کد code/main.py تنها از ماژول استاندارد wave استفاده می‌کند تا وابستگی جانبی نداشته باشد. در محیط‌های پروداکشن، باید از soundfile یا torchaudio.load استفاده کنید (هر دو تاپل (waveform, sr) برمی‌گردانند):

import soundfile as sf
waveform, sr = sf.read("clip.wav", dtype="float32")  # shape (T,), sr=int

مرحله‌ی 2: سنتز موج سینوسی از اصول اولیه

import math

def sine(freq_hz, sr, seconds, amp=0.5):
    n = int(sr * seconds)
    return [amp * math.sin(2 * math.pi * freq_hz * i / sr) for i in range(n)]

یک موج سینوسی 440 هرتز (نت لا در اکتاو چهارم) با نرخ 16 kHz به مدت 1 ثانیه، 16,000 عدد اعشاری دارد. آن را با wave.open(..., "wb") و با کدگذاری 16-bit PCM ذخیره کنید.

مرحله‌ی 3: محاسبه‌ی تبدیل فوریه‌ی گسسته به صورت دستی

def dft(x):
    N = len(x)
    out = []
    for k in range(N):
        re = sum(x[n] * math.cos(-2 * math.pi * k * n / N) for n in range(N))
        im = sum(x[n] * math.sin(-2 * math.pi * k * n / N) for n in range(N))
        out.append((re, im))
    return out

پیچیدگی این کد O(N²) است؛ برای N=256 جهت اعتبارسنجی کارکرد مناسب است، اما برای صوت واقعی کارایی ندارد. در کدهای واقعی از numpy.fft.rfft یا torch.fft.rfft استفاده می‌شود.

مرحله‌ی 4: یافتن فرکانس غالب

ایندکس بیشینه‌ی دامنه (k_star) به فرکانس k_star * sr / N نگاشت می‌شود. اگر این محاسبه را روی موج سینوسی 440 هرتز اجرا کنید، قله‌ی نمودار در خانه‌ی فرکانسی 440 * N / sr دیده خواهد شد.

مرحله‌ی 5: مشاهده‌ی عینی الیاسینگ

یک موج سینوسی 7 kHz را با نرخ 10 kHz نمونه‌برداری کنید (نایکویست برابر است با 5 kHz). از آنجا که فرکانس 7 kHz بالاتر از نایکویست است، روی فرکانس 10 − 7 = 3 kHz تا می‌خورد. در نتیجه، قله‌ی FFT در 3 kHz نمایان می‌شود. این همان آزمایش کلاسیک الیاسینگ است و دلیل اینکه همه‌ی مبدل‌های دیجیتال به آنالوگ و آنالوگ به دیجیتال (DAC/ADC) یک فیلتر پایین‌گذر پرشیب دارند.

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

پشته‌ی ابزارهایی که در سال 2026 در محیط عملیاتی به کار خواهید برد:

تسک کتابخانه دلیل انتخاب
خواندن/نوشتن فرمت‌های WAV/FLAC/OGG soundfile (رپر libsndfile) سریع‌ترین، پایدار، بازگرداندن داده‌ها به شکل float32.
بازنمونه‌برداری (Resample) torchaudio.transforms.Resample یا librosa.resample مجهز به فیلتر استاندارد حذف الیاسینگ (anti-aliasing).
STFT / مِل torchaudio یا librosa بهینه‌شده برای GPU؛ سازگاری با اکوسیستم PyTorch.
استریمینگ بی‌درنگ sounddevice یا pyaudio بایندینگ‌های چندسکویی برای PortAudio.
بررسی مشخصات فایل ffprobe یا soxi ابزار خط فرمانی، بسیار سریع برای مشاهده‌ی نرخ، تعداد کانال و کدک.

یک قانون کلی: پیش از هر کاری، نرخ نمونه‌برداری را هماهنگ کنید. مدلی مثل Whisper به ورودی تک‌کاناله (mono) با نرخ 16 kHz و فرمت float32 نیاز دارد. اگر صوتی با نرخ 44.1 kHz و دوکاناله (stereo) به آن بدهید، خروجی‌های نامربوطی تولید می‌کند که ممکن است شما را به اشتباه بیندازد و فکر کنید مدل باگ دارد.

خروجی این درس

کد را در مسیر outputs/skill-audio-loader.md ذخیره کنید. این مهارت به شما کمک می‌کند مطابقت ورودی صوتی با فرضیات مدل پایین‌دستی را بسنجید و در صورت لزوم، نرخ نمونه‌برداری آن را به درستی تغییر دهید.

تمرین‌ها

  1. ساده. ترکیبی 1 ثانیه‌ای از فرکانس‌های 220 هرتز، 440 هرتز و 880 هرتز با نرخ نمونه‌برداری 16 kHz بسازید. روی آن تبدیل فوریه‌ی گسسته (DFT) بزنید و ببینید آیا سه قله در خانه‌های فرکانسیِ مورد انتظار ظاهر می‌شوند یا نه.
  2. متوسط. یک فایل WAV صوتی 3 ثانیه‌ای از صدای خودتان با نرخ 48 kHz ضبط کنید. سپس یک بار با torchaudio.transforms.Resample (که فیلتر ضد الیاسینگ دارد) و یک بار با روش تقلیل ساده (انتخاب یکی از هر سه نمونه) آن را به 16 kHz کاهش دهید. روی هر دو تبدیل FFT بزنید. الیاسینگ دقیقاً در کدام فرکانس‌ها خودش را نشان می‌دهد؟
  3. سخت. با استفاده از کتابخانه‌ی math و تابع DFT پیاده‌شده در مرحله‌ی 3، یک STFT کامل از صفر بنویسید. طول فریم را 400، گام فریم (hop) را 160 و پنجره را Hann در نظر بگیرید. ماتریس دامنه‌ها را با matplotlib.pyplot.imshow رسم کنید. این همان طیف‌نگاشتی است که در درس 02 بررسی خواهیم کرد.

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

اصطلاح معنای عامیانه تعریف دقیق فنی
نرخ نمونه‌برداری (Sample rate) چند بار در ثانیه صدا را می‌خوانیم فرکانسی بر حسب هرتز که مبدل آنالوگ به دیجیتال سیگنال را بر اساس آن می‌سنجد.
نایکویست (Nyquist) بالاترین فرکانس قابل تشخیص برابر با sr/2؛ انرژی فرکانس‌های بالاتر به فرکانس‌های پایین‌تر برمی‌گردد.
عمق بیتی (Bit depth) کیفیت تفکیک هر نمونه فرمت int16 یعنی 65,536 پله؛ فرمت float32 یعنی 24 بیت دقت برای اعداد در بازه‌ی [-1, 1].
تبدیل فوریه‌ی گسسته (DFT) فوریه برای داده‌های گسسته N نمونه‌ی صوتی → N ضریب فرکانسی مختلط.
FFT نسخه‌ی سریع DFT الگوریتمی با پیچیدگی O(N log N) که شرط اجرای آن توان دو بودن N است.
خانه‌ی فرکانسی (Bin) یک ستون از طیف فرکانس‌ها برابر با فرکانس k · sr / N هرتز؛ میزان وضوح فرکانسی نیز sr / N است.
تبدیل فوریه‌ی کوتاه‌مدت (STFT) موتوری که پشت طیف‌نگاشت کار می‌کند اعمال تبدیل FFT روی فریم‌های پنجره‌گذاری‌شده در طول زمان.
الیاسینگ (Aliasing) خطاهای فرکانسی ناخواسته تاخوردن انرژی فرکانس‌های فراتر از نایکویست روی خانه‌های فرکانسی پایین‌تر.

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

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

چرا مدل Whisper به نرخ نمونه‌برداری 16 کیلوهرتز نیاز دارد؟

مدل Whisper و بسیاری از سیستم‌های مدرن بازشناسی گفتار بر اساس ورودی 16 kHz با فرمت float32 آموزش دیده‌اند. ارسال ورودی با نرخ متفاوت مانند 44.1 kHz باعث به‌هم‌ریختگی محاسبات فرکانسی و افت شدید دقت خروجی می‌شود.

قضیه‌ی نایکویست-شنون در پردازش صوت چه کاربردی دارد؟

طبق این قضیه، با نرخ نمونه‌برداری sr تنها می‌توان فرکانس‌ها را تا سقف sr/2 بدون خطا بازنمایی کرد. هر فرکانسی بالاتر از این مرز، به فرکانس‌های پایین‌تر تا می‌خورد (الیاسینگ) و سیگنال را تخریب می‌کند.

تفاوت تبدیل فوریه‌ی گسسته (DFT) با تبدیل فوریه‌ی سریع (FFT) چیست؟

تبدیل DFT با پیچیدگی محاسباتی O(N²) نمونه‌های صوتی را به ضرایب فرکانسی تبدیل می‌کند، در حالی که FFT همان محاسبات را با الگوریتمی بهینه‌تر و با پیچیدگی O(N log N) انجام می‌دهد.

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

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