import librosa import numpy as np from scipy.signal import butter, lfilter from PIL import Image as PILImage # --- Parâmetros Padrão --- TARGET_SR = 2000 IMAGE_HEIGHT = 128 def butter_bandpass_filter(data, lowcut, highcut, fs, order=3): """Aplica um filtro passa-banda de Butterworth nos dados.""" nyq = 0.5 * fs low = lowcut / nyq high = highcut / nyq if high >= 1 or low <= 0: return data b, a = butter(order, [low, high], btype='band') return lfilter(b, a, data) def create_spectrogram_image(y_cleaned, sr): """Cria uma imagem de espectrograma a partir de um sinal de áudio já limpo.""" mel_spec = librosa.feature.melspectrogram(y=y_cleaned, sr=sr, n_mels=IMAGE_HEIGHT) S_DB = librosa.power_to_db(mel_spec, ref=np.max) img_array = (S_DB - S_DB.min()) / (S_DB.max() - S_DB.min() + 1e-6) * 255.0 img_array = img_array.astype(np.uint8) return PILImage.fromarray(img_array).convert("RGB") def calculate_bpm(y_cleaned, sr): """Calcula o BPM de um sinal de áudio limpo usando o estimador de ritmo.""" onset_env = librosa.onset.onset_strength(y=y_cleaned, sr=sr, aggregate=np.mean) bpm = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)[0] return bpm