File size: 4,547 Bytes
9f09306 942a6c0 9f09306 1d9428e f020e8b 9f09306 55ed97d f020e8b 55ed97d 942a6c0 55ed97d 942a6c0 55ed97d 1d9428e f020e8b 1d9428e f020e8b 1d9428e f020e8b 1d9428e f020e8b 1d9428e 9f09306 1d9428e 55ed97d 942a6c0 1d9428e 942a6c0 1d9428e f020e8b 9f09306 55ed97d f020e8b 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import gradio as gr
import moviepy.editor as mp
import tempfile
import os
import requests
import base64
import socket
def check_dns():
"""
Función de ayuda para verificar si el hostname 'api.fal.ai' se resuelve correctamente.
Ejecuta esta función para ver en la consola la dirección IP resultante o el error DNS.
"""
try:
ip = socket.gethostbyname("api.fal.ai")
print("La IP de 'api.fal.ai' es:", ip)
except Exception as e:
print("Error al resolver 'api.fal.ai':", e)
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_o_None, 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):
"""
Envía el audio a la API de FAL para transcribirlo.
Retorna 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:
# Convertir el archivo de audio a un Data URI con 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}"
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}"
}
# Asegúrate de que este endpoint sea el actual según la documentación oficial de FAL.
# Si tienes errores de resolución de hostname, revisa la URL o tu configuración de DNS.
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:
1. Extrae el audio del video.
2. Envía el audio a la API de FAL para transcribirlo.
Retorna: (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, lo convierte a un archivo MP3 "
"y posteriormente envía el audio a la API de FAL para transcribirlo.\n\n"
"Requisitos:\n"
"• pip install gradio moviepy requests\n"
"• Configurar la variable de entorno FAL_KEY con tu API Key de FAL\n\n"
"Si recibes errores de DNS al conectar con la API, verifica el endpoint y tu conexión a Internet "
"usando la función 'check_dns()'.")
)
if __name__ == "__main__":
# Ejecuta esta función para verificar si 'api.fal.ai' se resuelve correctamente.
check_dns()
iface.launch() |