File size: 3,952 Bytes
9f09306 942a6c0 9f09306 1d9428e 9f09306 55ed97d 1d9428e 55ed97d 1d9428e 55ed97d 1d9428e 55ed97d 942a6c0 55ed97d 942a6c0 55ed97d 1d9428e 9f09306 1d9428e 55ed97d 942a6c0 1d9428e 942a6c0 1d9428e 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 99 100 101 |
import gradio as gr
import moviepy.editor as mp
import tempfile
import os
import requests
import base64
def extraer_audio(video_file):
"""
Función que recibe la ruta de un archivo de video, extrae el audio y lo guarda
en un archivo temporal .mp3. Retorna una tupla: (ruta_del_mp3_o_None, mensaje).
"""
# Crear archivo temporal para el MP3, sin borrarlo automáticamente
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
temp_audio_path = temp_audio.name
try:
# Cargar el video (soporta varios formatos) y extraer el audio
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):
"""
Función que utiliza la API de FAL para transcribir un archivo de audio.
Devuelve una tupla: (transcripción, mensaje)
"""
fal_key = os.environ.get("FAL_KEY")
if not fal_key:
return "", "Error: FAL_KEY no está configurada en las variables de entorno."
try:
# Leer y codificar el audio en base64 para formar un data URI
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}"
# Configurar el payload para la solicitud a la API de FAL
payload = {
"input": {
"audio_url": data_uri,
"task": "transcribe",
"chunk_level": "segment",
"version": "3",
"batch_size": 64,
"num_speakers": None
},
"logs": True
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {fal_key}"
}
# Endpoint de la API de FAL (ajusta si es necesario según la documentación oficial)
endpoint = "https://api.fal.ai/subscribe/fal-ai/whisper"
response = requests.post(endpoint, json=payload, headers=headers)
if response.status_code == 200:
result = response.json()
transcription = result.get("data", {}).get("text", "")
return transcription, "Transcripción completada exitosamente."
else:
return "", f"Error en transcripción: {response.status_code} - {response.text}"
except Exception as e:
return "", f"Error al transcribir el audio: {str(e)}"
def procesar_video(video_file):
"""
Función principal que extrae el audio de un video y luego lo transcribe.
Retorna una tupla: (ruta_del_mp3, transcripción, mensaje)
"""
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, lo convierte a .mp3 y realiza la transcripción utilizando la API de FAL.\n" \
"Requisitos:\n" \
"• Instalar: pip install gradio moviepy requests\n" \
"• Configurar la variable de entorno FAL_KEY con tu API key de FAL."
)
if __name__ == "__main__":
iface.launch() |