Speechdft-16-8-mono-5secs.wav [ Full Version ]
S = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=n_fft, hop_length=hop_len, n_mels=n_mels, fmax=sr/2) log_S = librosa.power_to_db(S, ref=np.max)
# ------------------------------------------------- # 2️⃣ Convert 8‑bit unsigned PCM to float [-1, 1] # ------------------------------------------------- # 8‑bit PCM in wav files is typically unsigned (0‑255) audio_float = (audio_int.astype(np.float32) - 128) / 128.0 # now in [-1, 1]
# Parameters n_fft = 1024 hop_len = 512 n_mels = 40 speechdft-16-8-mono-5secs.wav
# ------------------------------------------------- # 3️⃣ Compute the DFT (via FFT) – only the positive frequencies # ------------------------------------------------- N = len(audio_float) # number of samples = 5 s × 16 kHz = 80 000 fft_vals = np.fft.rfft(audio_float) # real‑valued FFT → N/2+1 points fft_mag = np.abs(fft_vals) / N # normalise magnitude
# ------------------------------------------------- # 1️⃣ Load the wav file # ------------------------------------------------- sr, audio_int = wavfile.read('speechdft-16-8-mono-5secs.wav') print(f'Sample rate: sr Hz') print(f'Data type: audio_int.dtype, shape: audio_int.shape') S = librosa
import numpy as np from scipy.io import wavfile import matplotlib.pyplot as plt
import librosa import librosa.display
# Frequency axis (Hz) freqs = np.fft.rfftfreq(N, d=1/sr)
# Load with librosa (it handles 8‑bit conversion internally) y, sr_lib = librosa.load('speechdft-16-8-mono-5secs.wav', sr=16000, mono=True) S = librosa.feature.melspectrogram(y=y
plt.figure(figsize=(10, 3)) librosa.display.specshow(log_S, sr=sr, hop_length=hop_len, x_axis='time', y_axis='mel', cmap='magma') plt.title('Log‑Mel Spectrogram (40 bands)') plt.colorbar(format='%+2.0f dB') plt.tight_layout() plt.show() | Challenge | Quick Fix | |-----------|-----------| | Clipping / low dynamic range | Apply a simple gain ( audio_float *= 1.5 ) before feature extraction, but beware of re‑quantisation if you write back to 8‑bit. | | **Noise