CamiloBz commited on
Commit
c30a2a9
·
verified ·
1 Parent(s): 2350b02

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -44
app.py CHANGED
@@ -1,54 +1,43 @@
1
- import os
2
  import gradio as gr
3
- import replicate
4
-
5
- def obtener_ruta_limpia(archivo):
6
- """Extrae de forma segura la ruta del archivo en Gradio 6"""
7
- if hasattr(archivo, 'path'):
8
- return archivo.path
9
- if isinstance(archivo, dict) and 'path' in archivo:
10
- return archivo['path']
11
- if isinstance(archivo, str):
12
- return archivo
13
- return None
14
 
15
  def procesar_movimiento(imagen_input, video_input):
16
- ruta_img = obtener_ruta_limpia(imagen_input)
17
- ruta_vid = obtener_ruta_limpia(video_input)
18
-
19
- if not ruta_img or not ruta_vid:
20
  return None, "Error: Por favor, asegúrate de cargar tanto la foto como el video."
21
 
22
- if not os.environ.get("REPLICATE_API_TOKEN"):
23
- return None, "Error: No se encontró el REPLICATE_API_TOKEN in los Secrets de tu espacio."
24
-
25
- try:
26
- # Detectar dinámicamente la versión más reciente para evitar el error 404
27
- modelo_ia = replicate.models.get("fofr/live-portrait")
28
- version_activa = modelo_ia.latest_version.id
29
-
30
- # Ejecutar usando el identificador exacto de tiempo real
31
- output = replicate.run(
32
- f"fofr/live-portrait:{version_activa}",
33
- input={
34
- "input_image": open(ruta_img, "rb"),
35
- "driving_video": open(ruta_vid, "rb"),
36
- "custom_crop_ratio": 0.5,
37
- "preserve_driving_aspect_ratio": True
38
- }
39
- )
40
-
41
- if output:
42
- return output, "¡Éxito total! Video clonado perfectamente."
43
- else:
44
- return None, "El servidor procesó la solicitud pero no devolvió ningún archivo."
 
45
 
46
- except Exception as e:
47
- return None, f"Error en el motor Replicate: {str(e)}"
 
 
48
 
49
- # --- INTERFAZ GRÁFICA MÓVIL ---
50
  with gr.Blocks() as demo:
51
- gr.Markdown("# 🎬 Mi Clonador AI Móvil (Pro)")
52
 
53
  with gr.Tabs():
54
  with gr.TabItem("Cargar Archivos"):
@@ -65,4 +54,4 @@ with gr.Blocks() as demo:
65
  outputs=[output_vid, output_info]
66
  )
67
 
68
- demo.launch(theme=gr.themes.Soft())
 
 
1
  import gradio as gr
2
+ from gradio_client import Client, handle_file
 
 
 
 
 
 
 
 
 
 
3
 
4
  def procesar_movimiento(imagen_input, video_input):
5
+ if not imagen_input or not video_input:
 
 
 
6
  return None, "Error: Por favor, asegúrate de cargar tanto la foto como el video."
7
 
8
+ # Lista de servidores públicos de LivePortrait (motores alternativos)
9
+ motores = [
10
+ "KwaiVGI/LivePortrait",
11
+ "innoai/LivePortrait",
12
+ "appl044/LivePortrait"
13
+ ]
14
+
15
+ detalles_errores = []
16
+
17
+ # Probar cada motor uno por uno si el anterior está caído o pausado
18
+ for motor in motores:
19
+ try:
20
+ client = Client(motor)
21
+ resultado = client.predict(
22
+ img_input=handle_file(imagen_input),
23
+ driving_video=handle_file(video_input),
24
+ api_name="/predict"
25
+ )
26
+ if resultado:
27
+ return resultado, f"¡Éxito total usando el motor: {motor}!"
28
+ except Exception as e:
29
+ # Si falla (por estar PAUSED o desconectado), guardamos el error y probamos el siguiente
30
+ detalles_errores.append(f"[{motor} no disponible]")
31
+ continue
32
 
33
+ # Si llega aquí, es porque lamentablemente todos estaban dormidos a la vez
34
+ error_msg = " Todos los motores gratuitos están pausados en Hugging Face en este momento. "
35
+ error_msg += "Detalles: " + " || ".join(detalles_errores)
36
+ return None, error_msg
37
 
38
+ # --- INTERFAZ GRÁFICA ---
39
  with gr.Blocks() as demo:
40
+ gr.Markdown("# 🎬 Mi Clonador AI Móvil (Multimotor)")
41
 
42
  with gr.Tabs():
43
  with gr.TabItem("Cargar Archivos"):
 
54
  outputs=[output_vid, output_info]
55
  )
56
 
57
+ demo.launch()