File size: 3,729 Bytes
9f09306 942a6c0 9f09306 1d9428e d09594b 9f09306 55ed97d f020e8b d09594b 55ed97d 942a6c0 55ed97d 942a6c0 55ed97d 1d9428e d09594b f020e8b 1d9428e d09594b 1d9428e d09594b 1d9428e d09594b 1d9428e d09594b 1d9428e f020e8b d09594b 1d9428e 9f09306 1d9428e 55ed97d 942a6c0 1d9428e 942a6c0 1d9428e d09594b f020e8b d09594b 9f09306 55ed97d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import gradio as gr
import moviepy.editor as mp
import tempfile
import os
import base64
import fal_client
def extraer_audio(video_file):
"""
Extrae el audio de un video y lo guarda en un archivo temporal (.mp3).
Retorna una tupla: (ruta_del_mp3, mensaje).
"""
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
temp_audio_path = temp_audio.name
try:
clip = mp.VideoFileClip(video_file)
clip.audio.write_audiofile(temp_audio_path, logger=None)
clip.close()
return temp_audio_path, "¡Audio extraído exitosamente!"
except Exception as e:
if os.path.exists(temp_audio_path):
os.remove(temp_audio_path)
return None, f"Error al procesar el video: {str(e)}"
def transcribir_audio(audio_file_path):
"""
Transcribe el audio utilizando la API de fal_client.
Se utiliza la variable de entorno FAL_KEY para la autenticación.
Retorna una tupla: (transcripción, mensaje).
"""
if not os.environ.get("FAL_KEY"):
return "", "Error: La variable de entorno FAL_KEY no está configurada."
try:
# Convertir el archivo de audio a Data URI (Base64)
with open(audio_file_path, "rb") as f:
audio_data = f.read()
encoded_audio = base64.b64encode(audio_data).decode("utf-8")
data_uri = f"data:audio/mp3;base64,{encoded_audio}"
logs_collected = []
def on_queue_update(update):
if isinstance(update, fal_client.InProgress):
for log in update.logs:
logs_collected.append(log["message"])
print(log["message"])
# Enviar la solicitud a la API de FAL para transcribir el audio
result = fal_client.subscribe(
"fal-ai/whisper",
arguments={
"audio_url": data_uri,
"task": "transcribe",
"chunk_level": "segment",
"version": "3",
"batch_size": 64,
"num_speakers": None
},
with_logs=True,
on_queue_update=on_queue_update,
)
transcription = result.get("data", {}).get("text", "")
return transcription, "Transcripción completada exitosamente.\nLogs:\n" + "\n".join(logs_collected)
except Exception as e:
return "", f"Error al transcribir el audio: {str(e)}"
def procesar_video(video_file):
"""
Función principal:
1. Extrae el audio del video.
2. Transcribe el audio utilizando la API de fal_client.
Retorna una tupla: (ruta_del_mp3, transcripción, mensaje de estado).
"""
audio_path, msg_audio = extraer_audio(video_file)
if not audio_path:
return None, "", msg_audio
transcription, msg_transcripcion = transcribir_audio(audio_path)
mensaje = f"{msg_audio}\n{msg_transcripcion}"
return audio_path, transcription, mensaje
iface = gr.Interface(
fn=procesar_video,
inputs=gr.File(label="Sube tu archivo de video (.mp4, .avi, .mkv, etc.)"),
outputs=[
gr.File(label="Descarga el audio en formato MP3"),
gr.Textbox(label="Transcripción"),
gr.Textbox(label="Mensaje de estado")
],
title="Extracción de Audio y Transcripción de Video a MP3",
description=("Esta aplicación extrae el audio de un video y lo convierte en un archivo MP3, "
"luego utiliza fal_client para transcribir el audio.\n\n"
"Requisitos:\n"
"• pip install gradio moviepy fal-client\n"
"• Configurar la variable de entorno FAL_KEY con tu API Key de FAL")
)
if __name__ == "__main__":
iface.launch() |