>> Tecnologia Eletrônica >  >> Áudio Residencial >> Toca-discos

Visualizando Ondas Sonoras de Arquivos Áudio: Tutorial Python

Arquivos áudio contêm dados amplitude sampleados — ondas sonoras digitais. Visualização extrai e plota estes dados. Aqui estão abordagens práticas de inspeção rápida a figures publication-quality.

Inspeção Rápida (Sem Código)

  • Audacity: Arraste arquivo → zoom → View → Plot Spectrum para frequência
  • Sonic Visualiser: Waveform/spectrogram layered, annotations, Vamp plugins
  • Spek: Fast spectrogram preview
  • DAWs: Todos mostram waveforms nativamente

Python: Librosa (Recomendado — Time-Aware)

import librosa import librosa.display import matplotlib.pyplot as plt # Load (auto-resamples to 22050 Hz mono by default) y, sr = librosa.load("audio.wav", sr=None, mono=True) # sr=None = native rate # Waveform plot plt.figure(figsize=(15, 4)) librosa.display.waveshow(y, sr=sr, alpha=0.7, color='#00d4aa') plt.title("Waveform", fontsize=14, color='white') plt.xlabel("Time (seconds)", 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 (Raw Sample Access)

from scipy.io import wavfile import numpy as np import matplotlib.pyplot as plt sr, data = wavfile.read("audio.wav") # Handle stereo if data.ndim == 2: left, right = data[:, 0], data[:, 1] data = (left + right) / 2 # Mix to mono # Normalize to [-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("Time (s)") plt.ylabel("Amplitude (normalized)") plt.title("Waveform (SciPy)") plt.grid(True, alpha=0.3) plt.savefig("waveform_scipy.png", dpi=300) plt.show()

Avançado: Multi-Channel, Spectrogram, Interativo

# Stereo waveform 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"Ch {ch+1}") axes[-1].set_xlabel("Time (s)") # Spectrogram (frequency vs time) 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')

Instalação

pip install librosa matplotlib scipy numpy

Librosa lida MP3/OGG/FLAC via audioread backend. SciPy lê WAV/AIFF nativamente. Para MP3 com SciPy: converta primeiro (ffmpeg -i in.mp3 out.wav).