voz-texto / app.py
Javier1987's picture
Update app.py
9f7bfdc verified
Raw
History Blame Contribute Delete
2.76 kB
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()