NearestNeighbor / audio_utils.py
Rachel Ding
NearestNeighbor Space app
95dc682
Raw
History Blame Contribute Delete
1.06 kB
"""Spectrogram helper for wav files."""
import tempfile
import numpy as np
import librosa
import librosa.display
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
def wav_to_spectrogram_image(wav_path: str | None, title: str = "") -> str | None:
"""Convert wav to mel spectrogram png; return temp file path."""
if not wav_path:
return None
try:
y, sr = librosa.load(wav_path, sr=16000, mono=True)
mel = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=1024, hop_length=256, n_mels=80)
mel_db = librosa.power_to_db(mel, ref=np.max)
fig, ax = plt.subplots(figsize=(3, 2))
librosa.display.specshow(mel_db, sr=sr, hop_length=256, x_axis="time", y_axis="mel", ax=ax, cmap="magma")
if title:
ax.set_title(title[:40])
plt.tight_layout()
path = tempfile.NamedTemporaryFile(suffix=".png", delete=False).name
plt.savefig(path, dpi=80, bbox_inches="tight")
plt.close()
return path
except Exception:
return None