Merlintxu's picture
Update app.py
0bab575 verified
import gradio as gr
from transformers import pipeline
import librosa
import soundfile as sf
import requests
import os
# Cambiar el modelo a uno específico para transcripción multilingüe
asr_pipeline = pipeline("automatic-speech-recognition", model="openai/whisper-large")
# Función para descargar el archivo si se provee una URL
def download_from_url(url):
local_filename = url.split('/')[-1]
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
return local_filename
# Función para dividir un archivo de audio en fragmentos de tamaño manejable
def split_audio(file_path, segment_duration=30):
y, sr = librosa.load(file_path, sr=None)
total_duration = librosa.get_duration(y=y, sr=sr)
segments = []
for start in range(0, int(total_duration), segment_duration):
end = min(start + segment_duration, int(total_duration))
segment = y[start * sr: end * sr]
segment_path = f"{file_path}_segment_{start}-{end}.wav"
sf.write(segment_path, segment, sr)
segments.append(segment_path)
return segments
# Función para procesar el archivo o la URL
def transcribe_audio(file=None, url=None):
try:
# Si el input es una URL, descargamos el archivo
if url:
file_path = download_from_url(url)
elif file:
file_path = file
else:
return "No se ha proporcionado un archivo ni un enlace."
# Dividir el archivo en segmentos de 30 segundos
segments = split_audio(file_path)
# Transcribir cada segmento y concatenar los resultados
transcriptions = []
for segment in segments:
result = asr_pipeline(segment, return_timestamps=True)
transcriptions.append(result['text'])
return " ".join(transcriptions)
except Exception as e:
return f"Error durante la transcripción: {str(e)}"
# Interfaz de Gradio
iface = gr.Interface(
fn=transcribe_audio,
inputs=[
gr.Audio(type="filepath", label="Sube un archivo de audio o vídeo (mp3, mp4, wav, etc.)"),
gr.Textbox(lines=1, placeholder="O pega un enlace de audio/vídeo aquí", label="URL de audio o vídeo (opcional)")
],
outputs="text",
title="Transcriptor de Audio y Vídeo",
description="Sube un archivo de audio o vídeo o proporciona un enlace. Los archivos pueden estar en español o inglés."
)
iface.launch()