GAS17 commited on
Commit
d09594b
·
verified ·
1 Parent(s): f020e8b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -52
app.py CHANGED
@@ -2,25 +2,13 @@ import gradio as gr
2
  import moviepy.editor as mp
3
  import tempfile
4
  import os
5
- import requests
6
  import base64
7
- import socket
8
-
9
- def check_dns():
10
- """
11
- Función de ayuda para verificar si el hostname 'api.fal.ai' se resuelve correctamente.
12
- Ejecuta esta función para ver en la consola la dirección IP resultante o el error DNS.
13
- """
14
- try:
15
- ip = socket.gethostbyname("api.fal.ai")
16
- print("La IP de 'api.fal.ai' es:", ip)
17
- except Exception as e:
18
- print("Error al resolver 'api.fal.ai':", e)
19
 
20
  def extraer_audio(video_file):
21
  """
22
  Extrae el audio de un video y lo guarda en un archivo temporal (.mp3).
23
- Retorna una tupla: (ruta_del_mp3_o_None, mensaje).
24
  """
25
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
26
  temp_audio_path = temp_audio.name
@@ -36,21 +24,31 @@ def extraer_audio(video_file):
36
 
37
  def transcribir_audio(audio_file_path):
38
  """
39
- Envía el audio a la API de FAL para transcribirlo.
 
40
  Retorna una tupla: (transcripción, mensaje).
41
  """
42
- fal_key = os.environ.get("FAL_KEY")
43
- if not fal_key:
44
- return "", "Error: FAL_KEY no está configurada en las variables de entorno."
45
  try:
46
- # Convertir el archivo de audio a un Data URI con base64
47
  with open(audio_file_path, "rb") as f:
48
  audio_data = f.read()
49
  encoded_audio = base64.b64encode(audio_data).decode("utf-8")
50
  data_uri = f"data:audio/mp3;base64,{encoded_audio}"
51
-
52
- payload = {
53
- "input": {
 
 
 
 
 
 
 
 
 
54
  "audio_url": data_uri,
55
  "task": "transcribe",
56
  "chunk_level": "segment",
@@ -58,34 +56,20 @@ def transcribir_audio(audio_file_path):
58
  "batch_size": 64,
59
  "num_speakers": None
60
  },
61
- "logs": True
62
- }
63
-
64
- headers = {
65
- "Content-Type": "application/json",
66
- "Authorization": f"Bearer {fal_key}"
67
- }
68
-
69
- # Asegúrate de que este endpoint sea el actual según la documentación oficial de FAL.
70
- # Si tienes errores de resolución de hostname, revisa la URL o tu configuración de DNS.
71
- endpoint = "https://api.fal.ai/subscribe/fal-ai/whisper"
72
-
73
- response = requests.post(endpoint, json=payload, headers=headers)
74
- if response.status_code == 200:
75
- result = response.json()
76
- transcription = result.get("data", {}).get("text", "")
77
- return transcription, "Transcripción completada exitosamente."
78
- else:
79
- return "", f"Error en transcripción: {response.status_code} - {response.text}"
80
  except Exception as e:
81
  return "", f"Error al transcribir el audio: {str(e)}"
82
 
83
  def procesar_video(video_file):
84
  """
85
  Función principal:
86
- 1. Extrae el audio del video.
87
- 2. Envía el audio a la API de FAL para transcribirlo.
88
- Retorna: (ruta_del_mp3, transcripción, mensaje de estado).
89
  """
90
  audio_path, msg_audio = extraer_audio(video_file)
91
  if not audio_path:
@@ -103,16 +87,12 @@ iface = gr.Interface(
103
  gr.Textbox(label="Mensaje de estado")
104
  ],
105
  title="Extracción de Audio y Transcripción de Video a MP3",
106
- description=("Esta aplicación extrae el audio de un video, lo convierte a un archivo MP3 "
107
- "y posteriormente envía el audio a la API de FAL para transcribirlo.\n\n"
108
  "Requisitos:\n"
109
- "• pip install gradio moviepy requests\n"
110
- "• Configurar la variable de entorno FAL_KEY con tu API Key de FAL\n\n"
111
- "Si recibes errores de DNS al conectar con la API, verifica el endpoint y tu conexión a Internet "
112
- "usando la función 'check_dns()'.")
113
  )
114
 
115
  if __name__ == "__main__":
116
- # Ejecuta esta función para verificar si 'api.fal.ai' se resuelve correctamente.
117
- check_dns()
118
  iface.launch()
 
2
  import moviepy.editor as mp
3
  import tempfile
4
  import os
 
5
  import base64
6
+ import fal_client
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  def extraer_audio(video_file):
9
  """
10
  Extrae el audio de un video y lo guarda en un archivo temporal (.mp3).
11
+ Retorna una tupla: (ruta_del_mp3, mensaje).
12
  """
13
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
14
  temp_audio_path = temp_audio.name
 
24
 
25
  def transcribir_audio(audio_file_path):
26
  """
27
+ Transcribe el audio utilizando la API de fal_client.
28
+ Se utiliza la variable de entorno FAL_KEY para la autenticación.
29
  Retorna una tupla: (transcripción, mensaje).
30
  """
31
+ if not os.environ.get("FAL_KEY"):
32
+ return "", "Error: La variable de entorno FAL_KEY no está configurada."
33
+
34
  try:
35
+ # Convertir el archivo de audio a Data URI (Base64)
36
  with open(audio_file_path, "rb") as f:
37
  audio_data = f.read()
38
  encoded_audio = base64.b64encode(audio_data).decode("utf-8")
39
  data_uri = f"data:audio/mp3;base64,{encoded_audio}"
40
+
41
+ logs_collected = []
42
+ def on_queue_update(update):
43
+ if isinstance(update, fal_client.InProgress):
44
+ for log in update.logs:
45
+ logs_collected.append(log["message"])
46
+ print(log["message"])
47
+
48
+ # Enviar la solicitud a la API de FAL para transcribir el audio
49
+ result = fal_client.subscribe(
50
+ "fal-ai/whisper",
51
+ arguments={
52
  "audio_url": data_uri,
53
  "task": "transcribe",
54
  "chunk_level": "segment",
 
56
  "batch_size": 64,
57
  "num_speakers": None
58
  },
59
+ with_logs=True,
60
+ on_queue_update=on_queue_update,
61
+ )
62
+ transcription = result.get("data", {}).get("text", "")
63
+ return transcription, "Transcripción completada exitosamente.\nLogs:\n" + "\n".join(logs_collected)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  except Exception as e:
65
  return "", f"Error al transcribir el audio: {str(e)}"
66
 
67
  def procesar_video(video_file):
68
  """
69
  Función principal:
70
+ 1. Extrae el audio del video.
71
+ 2. Transcribe el audio utilizando la API de fal_client.
72
+ Retorna una tupla: (ruta_del_mp3, transcripción, mensaje de estado).
73
  """
74
  audio_path, msg_audio = extraer_audio(video_file)
75
  if not audio_path:
 
87
  gr.Textbox(label="Mensaje de estado")
88
  ],
89
  title="Extracción de Audio y Transcripción de Video a MP3",
90
+ description=("Esta aplicación extrae el audio de un video y lo convierte en un archivo MP3, "
91
+ "luego utiliza fal_client para transcribir el audio.\n\n"
92
  "Requisitos:\n"
93
+ "• pip install gradio moviepy fal-client\n"
94
+ "• Configurar la variable de entorno FAL_KEY con tu API Key de FAL")
 
 
95
  )
96
 
97
  if __name__ == "__main__":
 
 
98
  iface.launch()