Phase 06: Speech & Audio

أساسيات الصوت أشكال الموجات، أخذ العينات، تحويل فوريه

أشكال الموجات هي الإشارة الخامة. تعد البرامج الطيفية هي التمثيل. هي أشكال الميل التي تتوافق مع ML. كل خط أنابيب ASR و TTS الحديثة يسير على هذا السلم، والخطوة الأولى هي فهم العينات و فوريه.

Type: Learn

Languages: Python

Prerequisites: Phase 1 · 06 (Vectors & Matrices), Phase 1 · 14 (Probability Distributions)

Time: ~45 minutes

المشكلة

يُنتج الميكروفون إشارة ضغط مقابل الوقت. شبكة عصبية تستهلك المضغوطات. بينها تعيش كومة من الاتفاقيات التي، عندما تنتهك، تنتج حشرات صامتة: يتدرب النموذج بشكل جيد ولكن WER تضاعف، أو TTS يرسل صيحة، أو نظام تخصيص الصوت يتذكر الميكروفون بدلاً من المتحدث.

كل حشرة في أنظمة الكلام تعود إلى واحدة من ثلاثة أسئلة:

  1. ما هو معدل العينة التي تم تسجيلها، وما الذي يتوقع النموذج؟
  2. هل الإشارة مستعارة؟
  3. هل تعمل على عينات خامة أم على تمثيل تردد؟

إصطلح هذه بشكل صحيح و الباقي من المرحلة 6 يمكن التعامل معه إصطلحهم بشكل خاطئ وحتى "سيسبر-غرف-ف4" تنتج القمامة

المفهوم

!Waveform, sampling, DFT, and frequency bins visualized

Waveform.مجموعة واحدة من العوامل العائمة في[-1.0, 1.0]. مقياس على عدد العينة. لتحويل إلى ثواني، تقسيم معدل العينة: t = n / sr-قطعة 10 ثواني عند 16 كيلوهرتز هي مجموعة من 160,000 عائمة.

Sampling rate (sr).كم عدد العينات في الثانية؟

RateUse
8 kHzTelephony, legacy VOIP. Nyquist at 4 kHz kills consonants. Avoid for ASR.
16 kHzASR standard. Whisper, Parakeet, SeamlessM4T v2 all consume 16 kHz.
22.05 kHzTTS vocoder training for older models.
24 kHzModern TTS (Kokoro, F5-TTS, xTTS v2).
44.1 kHzCD audio, music.
48 kHzFilm, pro audio, high-fidelity TTS (VALL-E 2, NaturalSpeech 3).

Nyquist-Shannon.معدل العينة srيمكن أن تمثل بشكل واضح ترددات تصل إلى sr/2- المُؤمنونsr/2الحد هو تردد Nyquist. الطاقة فوق Nyquist يصبح المتحفّز * ينحني إلى أسفل إلى ترددات أقل ويحطّم الإشارة. دائماً تصفية مرور منخفضة قبل أخذ العينات.

Bit depth.PCM 16-bit (موقع int16, نطاق ±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كل مكتبة صوتية تستخدم FFT تحت الغطاء. FFT 1024 عينة عند 16 kHz يعطي 512 حاويات ترددات قابلة للاستخدام تتراوح بين 08 kHz عند قرار 15.6 Hz.

Framing + window.نحن لا نقوم بـ FFT كليف كامل. نحن نقصمه إلى إطارات متداخلة (عادةً 25 ms مع 10 ms hop) ، ونضاعف كل إطارات بمهمة نافذة (هان ، هامينغ) لقتل عدم استمرار الحافة ، ثم FFT كل إطارات. هذا هو تحويل فوريه في وقت قصير (STFT). يبدأ الدروس 02 من هنا.

بناءها

الخطوة الأولى: قراءة المقطع و رسم شكل الموجة

code/main.pyيستخدم فقط الـ stdlib waveوحدة للحفاظ على التبعية التجريبية.soundfileأوtorchaudio.load(كلتا العائلتين(waveform, sr)(أربعة):

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

الخطوة الثانية: قم بتجميع موجة السينوس من المبادئ الأولى

pythonimport 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 هرتز سينوس (مؤدي A) عند 16 كيلوهرتز لمدة ثانية واحدة هو 16000 طائرة.wave.open(..., "wb")باستخدام تشفير PCM 16 بت.

الخطوة الثالثة: حساب DFT يدوياً

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

الخطوة الرابعة: العثور على التردد المهيمن

مؤشر ذروة الحجمk_starخرائط الترددk_star sr / Nإذا قمت بتشغيل هذا على 440 هرتز سينوس يجب أن يعود ذروة في بن440 N / sr. . .

الخطوة 5: إظهار التعبير

عينة من 7 كيلو هرتز الصين عند 10 كيلو هرتز (نيكوست = 5 كيلو هرتز).10 − 7 = 3 kHz. تظهر ذروة FFT عند 3 كيلوهرتز . هذا هو التجريبية الكلاسيكية وتلك هي السبب في كل DAC / ADC السفينة مع حائط الطوب منخفض الممر الصفافة .

استخدمها

الكبيرة التي ستُرسلونها في عام 2026:

TaskLibraryWhy
Read/write WAV/FLAC/OGGsoundfile (libsndfile wrapper)Fastest, stable, returns float32.
Resampletorchaudio.transforms.Resample or librosa.resampleCorrect anti-aliasing built in.
STFT / Meltorchaudio or librosaGPU-friendly; PyTorch ecosystem.
Real-time streamingsounddevice or pyaudioCross-platform PortAudio bindings.
Inspect a fileffprobe or soxiCLI, fast, reports sr/channels/codec.

قاعدة القرار: match sample rate before you match anything elseويشبر يتوقع 16 كيلو هرتز من التنقل الموحد32 . إعطيه 44.1 كيلو هرتز من الصوت الصوت الصوتي وستحصل على قمامة تبدو مثل حشرة النموذج.

أرسله

إبقواoutputs/skill-audio-loader.mdهذه المهارة تساعدك على التحقق من أن مدخل الصوت يطابق توقعات النموذج التدريجي ويعيد التمثيل بشكل صحيح عندما لا.

التمارين

  1. Easy.قم بتجميع خليط ثانية واحدة من 220 هرتز + 440 هرتز + 880 هرتز عند 16 كيلوهرتز. تشغيل DFT. تأكد ثلاثة قمم في القمامة المتوقعة.
  2. Medium.سجل WAV 3 ثواني من صوتك عند 48 كيلوهرتز.torchaudio.transforms.Resample(مع مكافحة التخفيف) ، ثم إلى 16 كيلوهرتز باستخدام العشرية البديلة (كل عينة ثالثة).
  3. Hard.قم ببناء STFT من الصفر باستخدام فقط mathو DFT من الخطوة 3 حجم الإطار 400، هوب 160، نافذة Hann.matplotlib.pyplot.imshowهذه هي الطيفيات في الدروس رقم 02

الشروط الرئيسية

TermWhat people sayWhat it actually means
Sample rateHow many samples per secondFrequency in Hz at which the ADC measures the signal.
NyquistThe max frequency you can representsr/2; energy above it aliases back down.
Bit depthResolution of each sampleint16 = 65,536 levels; float32 = 24-bit precision in [-1, 1].
DFTThe Fourier transform for sequencesN samples → N complex frequency coefficients.
FFTThe fast DFTO(N log N) algorithm requiring N = power of 2.
BinFrequency columnk · sr / N Hz; resolution = sr / N.
STFTSpectrogram under the hoodFramed + windowed FFT over time.
AliasingWeird frequency ghostsEnergy above Nyquist mirroring down to lower bins.

المزيد من القراءة

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.