Visualizzare le Onde Sonore da File Audio: Tutorial Python
I file audio contengono dati di ampiezza campionati: onde sonore digitali. La visualizzazione estrae e traccia questi dati. Ecco approcci pratici, dall'ispezione rapida alle figure di qualità editoriale.
Ispezione Rapida (Senza Codice)
- Audacity: Trascina il file → zoom → Visualizza → Traccia Spettro per le frequenze
- Sonic Visualiser: Forma d'onda/spettrogramma a strati, annotazioni, plugin Vamp
- Spek: Anteprima spettrogramma veloce
- DAW: Tutte mostrano le forme d'onda nativamente
Python: Librosa (Consigliato — Consapevole del Tempo)
import librosa
import librosa.display
import matplotlib.pyplot as plt
# Carica (risampola automaticamente a 22050 Hz mono per impostazione predefinita)
y, sr = librosa.load("audio.wav", sr=None, mono=True)
# sr=None = frequenza nativa
# Traccia forma d'onda
plt.figure(figsize=(15, 4))
librosa.display.waveshow(y, sr=sr, alpha=0.7, color='#00d4aa')
plt.title("Forma d'onda", fontsize=14, color='white')
plt.xlabel("Tempo (secondi)", color='white')
plt.ylabel("Ampiezza", 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 (Accesso ai Campioni Grezzi)
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
sr, data = wavfile.read("audio.wav")
# Gestisci stereo
if data.ndim == 2:
left, right = data[:, 0], data[:, 1]
data = (left + right) / 2 # Mix in mono
# Normalizza a [-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("Tempo (s)")
plt.ylabel("Ampiezza (normalizzata)")
plt.title("Forma d'onda (SciPy)")
plt.grid(True, alpha=0.3)
plt.savefig("waveform_scipy.png", dpi=300)
plt.show()
Avanzato: Multi-canale, Spettrogramma, Interattivo
# Forma d'onda stereo
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"Canale {ch+1}")
axes[-1].set_xlabel("Tempo (s)")
# Spettrogramma (frequenza vs tempo)
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')
Installazione
pip install librosa matplotlib scipy numpy
Librosa gestisce MP3/OGG/FLAC tramite backend audioread. SciPy legge nativamente WAV/AIFF. Per MP3 con SciPy: converti prima (ffmpeg -i in.mp3 out.wav).