File size: 3,729 Bytes
9f09306
942a6c0
9f09306
 
1d9428e
d09594b
9f09306
 
55ed97d
f020e8b
d09594b
55ed97d
 
 
 
 
 
 
942a6c0
55ed97d
 
 
942a6c0
55ed97d
1d9428e
 
d09594b
 
f020e8b
1d9428e
d09594b
 
 
1d9428e
d09594b
1d9428e
 
 
 
d09594b
 
 
 
 
 
 
 
 
 
 
 
1d9428e
 
 
 
 
 
 
d09594b
 
 
 
 
1d9428e
 
 
 
 
f020e8b
d09594b
 
 
1d9428e
 
 
 
 
 
 
 
9f09306
1d9428e
55ed97d
942a6c0
 
1d9428e
 
942a6c0
1d9428e
d09594b
 
f020e8b
d09594b
 
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
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()