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