GAS17 commited on
Commit
1d9428e
·
verified ·
1 Parent(s): de6d5f8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -20
app.py CHANGED
@@ -2,47 +2,99 @@ import gradio as gr
2
  import moviepy.editor as mp
3
  import tempfile
4
  import os
 
 
5
 
6
  def extraer_audio(video_file):
7
  """
8
- Función que recibe la ruta de un archivo de video,
9
- extrae el audio y lo guarda en un archivo temporal .mp3.
10
- Retorna una tupla: (ruta_del_mp3_o_None, mensaje).
11
  """
12
- # Creamos un archivo temporal para el MP3, sin borrarlo automáticamente
13
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
14
  temp_audio_path = temp_audio.name
15
-
16
  try:
17
- # Cargar el video con MoviePy (soporta varios formatos)
18
  clip = mp.VideoFileClip(video_file)
19
-
20
- # Extraer el audio y guardarlo en el archivo temporal
21
- # Al usar logger=None se evita mostrar demasiada salida en consola
22
  clip.audio.write_audiofile(temp_audio_path, logger=None)
23
  clip.close()
24
-
25
- # Si todo sale bien, regresamos la ruta al MP3 y un mensaje de éxito
26
  return temp_audio_path, "¡Audio extraído exitosamente!"
27
  except Exception as e:
28
- # En caso de error, eliminamos el archivo temporal (si existe)
29
  if os.path.exists(temp_audio_path):
30
  os.remove(temp_audio_path)
31
- # Retornamos None en la parte de archivo y un mensaje de error
32
  return None, f"Error al procesar el video: {str(e)}"
33
 
34
- # Creamos la interfaz de Gradio con DOS salidas:
35
- # - El archivo de audio
36
- # - Un textbox para mostrar mensajes (éxito o error)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  iface = gr.Interface(
38
- fn=extraer_audio,
39
  inputs=gr.File(label="Sube tu archivo de video (.mp4, .avi, .mkv, etc.)"),
40
  outputs=[
41
  gr.File(label="Descarga el audio en formato MP3"),
42
- gr.Textbox(label="Mensaje")
 
43
  ],
44
- title="Extracción de audio de Video a MP3",
45
- description="Esta aplicación extrae el audio de un video y lo convierte a un archivo .mp3"
 
 
 
46
  )
47
 
48
  if __name__ == "__main__":
 
2
  import moviepy.editor as mp
3
  import tempfile
4
  import os
5
+ import requests
6
+ import base64
7
 
8
  def extraer_audio(video_file):
9
  """
10
+ Función que recibe la ruta de un archivo de video, extrae el audio y lo guarda
11
+ en un archivo temporal .mp3. Retorna una tupla: (ruta_del_mp3_o_None, mensaje).
 
12
  """
13
+ # Crear archivo temporal para el MP3, sin borrarlo automáticamente
14
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
15
  temp_audio_path = temp_audio.name
 
16
  try:
17
+ # Cargar el video (soporta varios formatos) y extraer el audio
18
  clip = mp.VideoFileClip(video_file)
 
 
 
19
  clip.audio.write_audiofile(temp_audio_path, logger=None)
20
  clip.close()
 
 
21
  return temp_audio_path, "¡Audio extraído exitosamente!"
22
  except Exception as e:
 
23
  if os.path.exists(temp_audio_path):
24
  os.remove(temp_audio_path)
 
25
  return None, f"Error al procesar el video: {str(e)}"
26
 
27
+ def transcribir_audio(audio_file_path):
28
+ """
29
+ Función que utiliza la API de FAL para transcribir un archivo de audio.
30
+ Devuelve una tupla: (transcripción, mensaje)
31
+ """
32
+ fal_key = os.environ.get("FAL_KEY")
33
+ if not fal_key:
34
+ return "", "Error: FAL_KEY no está configurada en las variables de entorno."
35
+ try:
36
+ # Leer y codificar el audio en base64 para formar un data URI
37
+ with open(audio_file_path, "rb") as f:
38
+ audio_data = f.read()
39
+ encoded_audio = base64.b64encode(audio_data).decode("utf-8")
40
+ data_uri = f"data:audio/mp3;base64,{encoded_audio}"
41
+
42
+ # Configurar el payload para la solicitud a la API de FAL
43
+ payload = {
44
+ "input": {
45
+ "audio_url": data_uri,
46
+ "task": "transcribe",
47
+ "chunk_level": "segment",
48
+ "version": "3",
49
+ "batch_size": 64,
50
+ "num_speakers": None
51
+ },
52
+ "logs": True
53
+ }
54
+
55
+ headers = {
56
+ "Content-Type": "application/json",
57
+ "Authorization": f"Bearer {fal_key}"
58
+ }
59
+
60
+ # Endpoint de la API de FAL (ajusta si es necesario según la documentación oficial)
61
+ endpoint = "https://api.fal.ai/subscribe/fal-ai/whisper"
62
+
63
+ response = requests.post(endpoint, json=payload, headers=headers)
64
+ if response.status_code == 200:
65
+ result = response.json()
66
+ transcription = result.get("data", {}).get("text", "")
67
+ return transcription, "Transcripción completada exitosamente."
68
+ else:
69
+ return "", f"Error en transcripción: {response.status_code} - {response.text}"
70
+ except Exception as e:
71
+ return "", f"Error al transcribir el audio: {str(e)}"
72
+
73
+ def procesar_video(video_file):
74
+ """
75
+ Función principal que extrae el audio de un video y luego lo transcribe.
76
+ Retorna una tupla: (ruta_del_mp3, transcripción, mensaje)
77
+ """
78
+ audio_path, msg_audio = extraer_audio(video_file)
79
+ if not audio_path:
80
+ return None, "", msg_audio
81
+ transcription, msg_transcripcion = transcribir_audio(audio_path)
82
+ mensaje = f"{msg_audio}\n{msg_transcripcion}"
83
+ return audio_path, transcription, mensaje
84
+
85
  iface = gr.Interface(
86
+ fn=procesar_video,
87
  inputs=gr.File(label="Sube tu archivo de video (.mp4, .avi, .mkv, etc.)"),
88
  outputs=[
89
  gr.File(label="Descarga el audio en formato MP3"),
90
+ gr.Textbox(label="Transcripción"),
91
+ gr.Textbox(label="Mensaje de estado")
92
  ],
93
+ title="Extracción de Audio y Transcripción de Video a MP3",
94
+ 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" \
95
+ "Requisitos:\n" \
96
+ "• Instalar: pip install gradio moviepy requests\n" \
97
+ "• Configurar la variable de entorno FAL_KEY con tu API key de FAL."
98
  )
99
 
100
  if __name__ == "__main__":