Phase 06: Speech & Audio

Fondements audio Formations d'ondes, échantillonnage, transformation de Fourier

Les formes d'onde sont le signal brut. Les spectrogrammes sont la représentation. Les caractéristiques Mel sont la forme ML-friendly. Chaque pipeline moderne ASR et TTS marche cette échelle, et le premier pas est la compréhension de l'échantillonnage et Fourier.

Type: Learn

Languages: Python

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

Time: ~45 minutes

Le problème

Un microphone produit un signal de pression contre temps. Votre réseau neural consomme des tensors. Entre eux se trouve une pile de conventions qui, lorsqu'elles sont violées, produisent des bugs silencieux: le modèle fonctionne bien mais le WER double, ou TTS envoie un sifflement, ou un système de clonage vocale mémorise le microphone au lieu de l'enceinte.

Chaque bug dans les systèmes de parole remonte à une des trois questions:

  1. À quel taux de l'échantillon les données ont-elles été enregistrées, et à quoi le modèle s'attend-il?
  2. Le signal est alias ?
  3. Vous opérez sur des échantillons bruts ou sur une représentation de fréquence ?

Si vous faites ça correctement, le reste de la phase 6 est traitable, mais même Whisper-Large-v4 produit des ordures.

Le concept

!Waveform, sampling, DFT, and frequency bins visualized

Waveform.Un ensemble unidimensionnel de flottes dans [-1.0, 1.0]Pour convertir en secondes, partager par le taux d'échantillonnage:t = n / srUne vidéo de 10 secondes à 16 kHz est un array de 160 000 floats.

Sampling rate (sr).Combien d'échantillons par seconde.

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.Un taux d'échantillonnage de srpeut représenter sans ambiguïté des fréquences allant jusqu' à sr/2- Le .sr/2La limite est la fréquence Nyquist. L'énergie au-dessus de Nyquist est aliasée pliée vers le bas dans les fréquences plus basses et corrompt le signal.

Bit depth.Le PCM à 16 bits (signé int16, plage ±32.767) est le format d'échange universel.soundfilelire int16 mais exposer les matrices float32 dans [-1, 1]- Je suis désolé .

Fourier Transform.Tout signal fini est une somme de sinus à différentes fréquences.Néchantillons Ncoefficients complexes un par bac à fréquences. bin kcartes à fréquence k · sr / NLa magnitude est l'amplitude à cette fréquence, l'angle est la phase.

FFT.Transformation rapide de Fourier: une O(N log N)algorithme pour le DFT lorsque NUne FFT de 1024 échantillons à 16 kHz donne 512 poubelles de fréquences utilisables couvrant 08 kHz à une résolution de 15,6 Hz.

Framing + window.Nous ne faisons pas FFT d'un clip entier. Nous le couperons en frame qui se chevauchent (généralement 25 ms avec 10 ms hop), multiplier chaque cadre par une fonction de fenêtre (Hann, Hamming) pour supprimer les discontinuités de bord, puis FFT chaque cadre.

Faites-le

Étape 1: lire un clip et tracer la forme d'onde

code/main.pyutilise uniquement le stdlib waveLe module de démo pour garder la démo libre de dépendance.soundfileou torchaudio.load(les deux retournent (waveform, sr)- les deux couches:

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

Étape 2: synthétiser une onde sine à partir des premiers principes

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

Un sinus de 440 Hz (concert A) à 16 kHz pendant 1 seconde est de 16 000 flottes.wave.open(..., "wb")en utilisant le codage PCM à 16 bits.

Étape 3: calculer le DFT à la main

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²) bien pour N=256Pour confirmer la précision, inutile pour l'audio réel.numpy.fft.rfftou torch.fft.rfft- Je suis désolé .

Étape 4: trouver la fréquence dominante

Indice de pointe de la magnitude k_starcartes à fréquence k_star sr / NEn exécutant ce sur le sinus de 440 Hz , il devrait retourner un pic à bin .440 N / sr- Je suis désolé .

Étape 5: démontrer l'aliasing

Prenez un signe de 7 kHz à 10 kHz (Nyquist = 5 kHz).10 − 7 = 3 kHzLe pic FFT apparaît à 3 kHz. C'est la démo d'alias classique et la raison pour laquelle chaque DAC/ADC envoie un filtre à basse fréquence.

Utilisez-le

La pile que vous expédierez en 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.

Règle de décision: match sample rate before you match anything elseS'il vous plaît, passez-le à 44,1 kHz et vous obtiendrez des ordures qui ressemblent à un bug de modèle.

La faire partir

  • Je ne sais pas .outputs/skill-audio-loader.mdLa compétence vous aide à vérifier que l'entrée audio correspond aux attentes du modèle en aval et à reproduire correctement quand elle ne le fait pas.

Exercices

  1. Easy.Synthétisez un mélange de 1 seconde de 220 Hz + 440 Hz + 880 Hz à 16 kHz. Exécutez DFT. Confirmez trois pics aux poubelles attendues.
  2. Medium.Enregistrez un WAV de 3 secondes de votre voix à 48 kHz.torchaudio.transforms.Resample(avec anti-aliasing), puis à 16 kHz en utilisant une décimation naïve (tous les trois échantillons).
  3. Hard.Construire le STFT à partir de zéro en utilisant seulement mathet le DFT de l'étape 3. Taille de cadre 400, hop 160, fenêtre Hann.matplotlib.pyplot.imshowC'est le spectrogramme de la leçon 02.

Les termes clés

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.

Pour en savoir plus

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.