import gradio as gr from transformers import pipeline import tempfile import os import json print("🚀 Iniciando Asistente ESP32...") # Cargar modelos optimizados para ESP32 try: print("📥 Cargando modelo de voz...") stt_pipeline = pipeline( "automatic-speech-recognition", model="openai/whisper-tiny", device=-1 # Usar CPU ) print("📥 Cargando modelo de chat...") chat_pipeline = pipeline( "text-generation", model="microsoft/DialoGPT-small", device=-1, max_length=100 ) print("✅ Modelos cargados correctamente!") except Exception as e: print(f"❌ Error cargando modelos: {e}") stt_pipeline = None chat_pipeline = None def process_audio(audio_file): """Procesar audio para ESP32""" if stt_pipeline is None or chat_pipeline is None: return "Models not loaded", "Please try again in a moment" try: print("🎤 Procesando audio...") # Transcripción result = stt_pipeline(audio_file) text = result["text"].strip() print(f"📝 Transcripción: {text}") if not text or text == "": return "No se detectó audio", "Habla más claro por favor" # Generar respuesta print("🤖 Generando respuesta...") chat_response = chat_pipeline( f"Usuario: {text}\nAsistente:", max_new_tokens=80, temperature=0.7, do_sample=True, pad_token_id=chat_pipeline.tokenizer.eos_token_id ) answer = chat_response[0]["generated_text"] # Limpiar respuesta if "Asistente:" in answer: answer = answer.split("Asistente:")[-1].strip() print(f"💬 Respuesta: {answer}") return text, answer except Exception as e: error_msg = f"Error: {str(e)}" print(error_msg) return error_msg, "Error en el procesamiento" # Interfaz mejorada para ESP32 with gr.Blocks(theme=gr.themes.Soft(), title="Asistente ESP32") as demo: gr.Markdown( """ # 🎤 Asistente de Voz para ESP32 **Servicio optimizado para microcontroladores** """ ) with gr.Row(): with gr.Column(): gr.Markdown("### 📤 Subir Audio") audio_input = gr.Audio( sources=["upload"], type="filepath", label="Audio WAV (16kHz, mono, 16-bit)", waveform_options={"show_controls": False} ) process_btn = gr.Button("🚀 Procesar Audio", variant="primary") gr.Markdown("### 📋 Especificaciones ESP32") gr.Markdown(""" - **Formato:** WAV, 16kHz, mono, 16-bit - **Duración:** 3-5 segundos máximo - **Conexión:** HTTPS POST a esta URL """) with gr.Column(): gr.Markdown("### 📝 Resultados") transcription = gr.Textbox( label="Transcripción", placeholder="El texto aparecerá aquí...", lines=3 ) response = gr.Textbox( label="Respuesta del Asistente", placeholder="La respuesta aparecerá aquí...", lines=4 ) # Ejemplos para probar gr.Markdown("### 🧪 Ejemplos para Probar") gr.Examples( examples=[ ["https://example.com/audio1.wav"], # Puedes subir ejemplos después ["https://example.com/audio2.wav"] ], inputs=[audio_input], outputs=[transcription, response], fn=process_audio, cache_examples=False ) # Procesar cuando se sube audio o se clickea el botón process_btn.click( fn=process_audio, inputs=[audio_input], outputs=[transcription, response] ) # Info del estado gr.Markdown("### 🔍 Estado del Sistema") status = gr.Textbox( value="✅ Servicio listo para ESP32" if stt_pipeline else "⚠️ Cargando modelos...", label="Estado", interactive=False ) # Configuración del servidor if __name__ == "__main__": demo.launch( server_name="0.0.0.0", server_port=7860, share=False, debug=True )