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()