|
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: |
|
|
|
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"]) |
|
|
|
|
|
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() |