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