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