Visualiser les ondes sonores à partir de fichiers audio : Tutoriel Python
Les fichiers audio contiennent des données d'amplitude échantillonnées — des ondes sonores numériques. La visualisation consiste à extraire et tracer ces données. Voici des approches pratiques, de l'inspection rapide aux figures de qualité publication.
Inspection rapide (sans code)
- Audacity : Glisser le fichier → zoomer → Affichage → Tracer le spectre pour les fréquences
- Sonic Visualiser : Forme d'onde/spectrogramme en couches, annotations, plugins Vamp
- Spek : Aperçu spectrogramme rapide
- STAN (DAW) : Tous affichent les formes d'onde nativement
Python : Librosa (Recommandé — Gestion du temps)
import librosa
import librosa.display
import matplotlib.pyplot as plt
# Chargement (rééchantillonnage auto à 22050 Hz mono par défaut)
y, sr = librosa.load("audio.wav", sr=None, mono=True)
# sr=None = taux natif
# Tracé de la forme d'onde
plt.figure(figsize=(15, 4))
librosa.display.waveshow(y, sr=sr, alpha=0.7, color='#00d4aa')
plt.title("Forme d'onde", fontsize=14, color='white')
plt.xlabel("Temps (secondes)", color='white')
plt.ylabel("Amplitude", color='white')
plt.gca().set_facecolor('#1a1a2e')
plt.gcf().set_facecolor('#1a1a2e')
plt.tick_params(colors='white')
plt.tight_layout()
plt.savefig("waveform.png", dpi=300, facecolor='#1a1a2e')
plt.show()
Python : SciPy (Accès brut aux échantillons)
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
sr, data = wavfile.read("audio.wav")
# Gestion stéréo
if data.ndim == 2:
left, right = data[:, 0], data[:, 1]
data = (left + right) / 2 # Mixage vers mono
# Normalisation [-1, 1]
data = data.astype(np.float32) / np.iinfo(data.dtype).max
time = np.arange(len(data)) / sr
plt.figure(figsize=(15, 4))
plt.plot(time, data, linewidth=0.5, color='#ff6b6b')
plt.xlabel("Temps (s)")
plt.ylabel("Amplitude (normalisée)")
plt.title("Forme d'onde (SciPy)")
plt.grid(True, alpha=0.3)
plt.savefig("waveform_scipy.png", dpi=300)
plt.show()
Avancé : Multi-canaux, Spectrogramme, Interactif
# Forme d'onde stéréo
if data.ndim == 2:
fig, axes = plt.subplots(2, 1, figsize=(15, 6), sharex=True)
for ch, ax in enumerate(axes):
ax.plot(time, data[:, ch], linewidth=0.5)
ax.set_ylabel(f"Canal {ch+1}")
axes[-1].set_xlabel("Temps (s)")
# Spectrogramme (fréquence vs temps)
import librosa.display
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='hz', cmap='magma')
plt.colorbar(format='%+2.0f dB')
Installation
pip install librosa matplotlib scipy numpy
Librosa gère MP3/OGG/FLAC via le backend audioread. SciPy lit WAV/AIFF nativement. Pour MP3 avec SciPy : convertir d'abord (ffmpeg -i in.mp3 out.wav).
