import gradio as gr
import numpy as np
import librosa
import tensorflow as tf
# Configuracoes do audio
TARGET_SR = 48000
TEMPO_MAX = 10
N_FFT = 4096
HOP_LENGTH = 1024
N_MELS = 128
FMAX = TARGET_SR // 2
CLASS_NAMES = ["REFERENCIA", "DESALINHAMENTO", "DESBALANCEAMENTO", "SOBRECARGA"]
# Carregar o modelo
model = tf.keras.models.load_model('modelo_classificacao_audios.h5')
def carregar_audio_fixo(caminho, sr=TARGET_SR, duracao=TEMPO_MAX):
audio, _ = librosa.load(caminho, sr=sr, mono=True)
amostras = int(sr * duracao)
if len(audio) < amostras:
audio = np.pad(audio, (0, amostras - len(audio)), mode='constant')
else:
audio = audio[:amostras]
return audio
def classificar_audio(caminho_audio):
if caminho_audio is None:
return "Por favor, envie um arquivo de audio."
try:
audio = carregar_audio_fixo(caminho_audio)
mel_spec = librosa.feature.melspectrogram(
y=audio, sr=TARGET_SR, n_fft=N_FFT, hop_length=HOP_LENGTH, n_mels=N_MELS, fmax=FMAX, power=2.0
)
log_mel_spec = librosa.power_to_db(mel_spec, ref=np.max)
x_input = log_mel_spec[np.newaxis, ..., np.newaxis]
preds = model.predict(x_input)[0]
return {CLASS_NAMES[i]: float(preds[i]) for i in range(len(CLASS_NAMES))}
except Exception as e:
return f"Erro no processamento: {str(e)}"
interface = gr.Interface(
fn=classificar_audio,
inputs=gr.Audio(type="filepath", label="Arraste ou grave o audio aqui"),
outputs=gr.Label(num_top_classes=4, label="Predicoes"),
title="Classificador de Falhas em Maquinas por Audio (Gradio Lite)",
description="Aplicacao estatica rodando direto no seu navegador."
)
interface.launch()
tensorflow
librosa
soundfile
numpy
matplotlib