File size: 1,056 Bytes
65600d1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"""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