add code to generate spectogram array and plot_data
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
import librosa
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def generate_spectogram(audio_file: str, spectogram_type: str = 'mel', sr: int = 22050):
|
||||||
|
"""
|
||||||
|
Generates a spectrogram array from an audio file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
audio_file (str): Path to the input audio file.
|
||||||
|
spectrogram_type (str): Type of spectrogram ('stft', 'mel'). Default is 'mel'.
|
||||||
|
sr (int): Sampling rate for audio. Default is 22050.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
tuple: A tuple containing:
|
||||||
|
- np.ndarray: Spectrogram array (in decibels).
|
||||||
|
- dict: Metadata for plotting (sr, x_axis, y_axis).
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Load the audio file
|
||||||
|
waveform, sr = librosa.load(audio_file, sr=sr)
|
||||||
|
|
||||||
|
# Create the spectogram
|
||||||
|
if spectogram_type == 'mel':
|
||||||
|
spec = librosa.feature.melspectrogram(y=waveform, sr=sr)
|
||||||
|
spec_db = librosa.power_to_db(spec, ref=np.max) # Convert to decibels
|
||||||
|
plot_data = {'sr': sr, 'x_axis': 'time', 'y_axis': 'mel'}
|
||||||
|
elif spectogram_type == 'stft':
|
||||||
|
spec = np.abs(librosa.stft(waveform))
|
||||||
|
spec_db = librosa.amplitude_to_db(spec, ref=np.max)
|
||||||
|
plot_data = {'sr': sr, 'x_axis': 'time', 'y_axis': 'log'}
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unsupported spectogram type: {spectogram_type}")
|
||||||
|
|
||||||
|
return spec_db, plot_data
|
||||||
Reference in New Issue
Block a user