mp4tomp3 / app.py
GAS17's picture
Update app.py
d09594b verified
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()