import gradio as gr import speech_recognition as sr import os from pydub import AudioSegment import tempfile # Límite de duración en segundos MAX_AUDIO_DURATION = 120 # 2 minutos # Función para transcribir audio desde el micrófono def transcribir(audio): if audio is None: return "⚠️ No se recibió audio." # Cargar audio con pydub audio_seg = AudioSegment.from_file(audio) duracion_original = audio_seg.duration_seconds # Si el audio supera el límite, recortarlo if duracion_original > MAX_AUDIO_DURATION: audio_seg = audio_seg[:MAX_AUDIO_DURATION*1000] # pydub usa milisegundos mensaje = f"⚠️ El audio se cortó a {MAX_AUDIO_DURATION} segundos automáticamente.\n\n" # Guardar audio recortado temporalmente tmp_file = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name audio_seg.export(tmp_file, format="wav") archivo_a_procesar = tmp_file else: mensaje = f"Archivo recibido: {os.path.basename(audio)}\n\n" archivo_a_procesar = audio # Procesar audio con speech_recognition recognizer = sr.Recognizer() try: with sr.AudioFile(archivo_a_procesar) as source: audio_data = recognizer.record(source) texto = recognizer.recognize_google(audio_data, language="es-ES") return mensaje + texto except sr.UnknownValueError: return mensaje + "⚠️ No entendí el audio." except sr.RequestError: return mensaje + "❌ Error con el servicio de reconocimiento." except Exception as e: return mensaje + f"❌ Ocurrió un error: {str(e)}" # Función para reiniciar la interfaz def reiniciar(): return None, "" # Borra audio y texto # Interfaz con Gradio with gr.Blocks(css=""" .gradio-container {max-width: 600px; margin: auto;} @media (max-width: 768px) { .gradio-container {max-width: 95% !important;} } """) as demo: gr.Markdown("## 🎤 Transcriptor de Voz a Texto") gr.Markdown("Funciona en **PC, Android, iPhone y iPad**. Habla usando tu micrófono y la transcripción aparecerá.") with gr.Column(): entrada_audio = gr.Audio( sources=["microphone"], type="filepath", label="🎙️ Habla aquí", streaming=False ) salida_texto = gr.Textbox(label="📝 Texto transcrito", lines=5) boton_reiniciar = gr.Button("🔄 Reiniciar") # Eventos entrada_audio.change(fn=transcribir, inputs=entrada_audio, outputs=salida_texto) boton_reiniciar.click(fn=reiniciar, inputs=[], outputs=[entrada_audio, salida_texto]) # Ejecutar app en Hugging Face Spaces if __name__ == "__main__": demo.launch()