Spaces:
Sleeping
Sleeping
| 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() | |