peteriyo commited on
Commit
2c40a5e
·
verified ·
1 Parent(s): 3f9c987

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +93 -43
app.py CHANGED
@@ -2,6 +2,9 @@ import gradio as gr
2
  from huggingface_hub import hf_hub_download
3
  import os
4
  import time
 
 
 
5
 
6
  # =================================================================
7
  # 1. CONFIGURACIÓN Y DESCARGA AUTOMÁTICA DE CHECKPOINTS
@@ -10,68 +13,115 @@ import time
10
  # Directorio local donde se guardarán los archivos
11
  LOCAL_CHECKPOINT_DIR = "checkpoints"
12
  os.makedirs(LOCAL_CHECKPOINT_DIR, exist_ok=True)
13
-
14
  downloaded_paths = {}
15
 
16
- # --- DESCARGA 1: WAV2LIP PRINCIPAL (wav2lip_gan.pth) ---
17
  try:
18
- WAV2LIP_REPO = "Nekochu/Wav2Lip" # REPOSITORIO VERIFICADO Y PÚBLICO
 
19
  WAV2LIP_FILE = "wav2lip_gan.pth"
20
- print(f"-> Descargando {WAV2LIP_FILE} desde {WAV2LIP_REPO}...")
21
-
22
- path_wav2lip = hf_hub_download(
23
- repo_id=WAV2LIP_REPO,
24
- filename=WAV2LIP_FILE,
25
- local_dir=LOCAL_CHECKPOINT_DIR,
26
- local_dir_use_symlinks=False
27
- )
28
  downloaded_paths[WAV2LIP_FILE] = path_wav2lip
29
 
30
- except Exception as e:
31
- print(f"❌ ERROR AL DESCARGAR {WAV2LIP_FILE}: {e}")
32
- exit(1)
33
-
34
- # --- DESCARGA 2: DETECTOR FACIAL (s3fd.pth) ---
35
- # Este archivo a menudo está en repositorios Colab/setup
36
- try:
37
- SFD_REPO = "camenduru/Wav2Lip" # Otro repositorio público de respaldo
38
  SFD_FILE = "s3fd.pth"
39
- print(f"-> Descargando {SFD_FILE} desde {SFD_REPO}...")
40
-
41
- path_sfd = hf_hub_download(
42
- repo_id=SFD_REPO,
43
- filename=SFD_FILE,
44
- local_dir=LOCAL_CHECKPOINT_DIR,
45
- local_dir_use_symlinks=False
46
- )
47
  downloaded_paths[SFD_FILE] = path_sfd
 
 
48
 
49
  except Exception as e:
50
- print(f"❌ ERROR AL DESCARGAR {SFD_FILE}: {e}")
51
- # Si el s3fd falla, no es tan crítico como el wav2lip, pero aún así salimos para evitar un fallo posterior.
52
  exit(1)
53
 
54
-
55
- print("✅ Descarga de Checkpoints completada. Modelos listos para cargar.")
56
-
57
- # Obtener las rutas específicas para la función de inferencia
58
  WAV2LIP_PATH = downloaded_paths[WAV2LIP_FILE]
59
  SFD_PATH = downloaded_paths[SFD_FILE]
60
 
61
  # =================================================================
62
- # 2. FUNCIÓN DE INFERENCIA DEL MODELO (Placeholder)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  # =================================================================
64
 
65
  def generar_avatar_wav2lip(imagen_fuente, archivo_audio):
66
- # *** TU CÓDIGO DE INFERENCIA REAL DEBE USAR WAV2LIP_PATH y SFD_PATH ***
67
- import time
68
- print(f"Iniciando generación en CPU. Usando Checkpoints en {WAV2LIP_PATH} y {SFD_PATH}")
69
- time.sleep(10)
70
- dummy_video = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/gradio-guides/video_example.mp4"
71
- return dummy_video
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
  # =================================================================
74
- # 3. CONFIGURACIÓN DE LA INTERFAZ (UI y API)
75
  # =================================================================
76
 
77
  gr.Interface(
@@ -81,6 +131,6 @@ gr.Interface(
81
  gr.Audio(type="filepath", label="Archivo de Audio (MP3/WAV)")
82
  ],
83
  outputs=gr.Video(label="Video Generado"),
84
- title="Wav2Lip en Space CPU (Con Descarga Automática y Verificada)",
85
- description="Modelo Wav2Lip optimizado para CPU. Se utiliza la API REST para la interacción."
86
  ).launch()
 
2
  from huggingface_hub import hf_hub_download
3
  import os
4
  import time
5
+ import torch
6
+ import cv2
7
+ import numpy as np
8
 
9
  # =================================================================
10
  # 1. CONFIGURACIÓN Y DESCARGA AUTOMÁTICA DE CHECKPOINTS
 
13
  # Directorio local donde se guardarán los archivos
14
  LOCAL_CHECKPOINT_DIR = "checkpoints"
15
  os.makedirs(LOCAL_CHECKPOINT_DIR, exist_ok=True)
 
16
  downloaded_paths = {}
17
 
18
+ # --- LÓGICA DE DESCARGA VERIFICADA (Se ejecuta al iniciar el Space) ---
19
  try:
20
+ # 1. WAV2LIP PRINCIPAL
21
+ WAV2LIP_REPO = "Nekochu/Wav2Lip"
22
  WAV2LIP_FILE = "wav2lip_gan.pth"
23
+ print(f"-> Descargando {WAV2LIP_FILE}...")
24
+ path_wav2lip = hf_hub_download(repo_id=WAV2LIP_REPO, filename=WAV2LIP_FILE, local_dir=LOCAL_CHECKPOINT_DIR, local_dir_use_symlinks=False)
 
 
 
 
 
 
25
  downloaded_paths[WAV2LIP_FILE] = path_wav2lip
26
 
27
+ # 2. DETECTOR FACIAL SFD
28
+ SFD_REPO = "ritikwadhwani/Wav2Lip-HQ"
 
 
 
 
 
 
29
  SFD_FILE = "s3fd.pth"
30
+ print(f"-> Descargando {SFD_FILE}...")
31
+ path_sfd = hf_hub_download(repo_id=SFD_REPO, filename=SFD_FILE, local_dir=LOCAL_CHECKPOINT_DIR, local_dir_use_symlinks=False)
 
 
 
 
 
 
32
  downloaded_paths[SFD_FILE] = path_sfd
33
+
34
+ print("✅ Descarga de Checkpoints completada.")
35
 
36
  except Exception as e:
37
+ print(f"❌ ERROR CRÍTICO EN LA DESCARGA: {e}")
 
38
  exit(1)
39
 
40
+ # Rutas de los modelos descargados
 
 
 
41
  WAV2LIP_PATH = downloaded_paths[WAV2LIP_FILE]
42
  SFD_PATH = downloaded_paths[SFD_FILE]
43
 
44
  # =================================================================
45
+ # 2. FUNCIONES HELPER DE INFERENCIA (Estructura para la lógica principal)
46
+ # =================================================================
47
+
48
+ # ---> FALTAN FUNCIONES HELPER AQUÍ <---
49
+ # Nota: Aquí debes pegar las funciones de ayuda de la implementación de Wav2Lip (ej: load_model, face_detect, datagen, etc.)
50
+
51
+ def load_wav2lip_model(path):
52
+ """Placeholder para cargar el modelo PyTorch desde WAV2LIP_PATH."""
53
+ # Ejemplo de cómo cargar el modelo (tu código real debe ir aquí)
54
+ print(f"Cargando modelo Wav2Lip desde: {path}")
55
+ # model = Wav2Lip().to(device)
56
+ # model.load_state_dict(torch.load(path)['state_dict'])
57
+ # return model
58
+ return "Dummy_Wav2Lip_Model"
59
+
60
+ def execute_inference_pipeline(model, sfd_path, image_path, audio_path, output_path):
61
+ """
62
+ Placeholder para la ejecución completa del pipeline de Wav2Lip.
63
+
64
+ Toma la imagen, el audio y genera el video.
65
+ """
66
+ # Aquí es donde ocurre la magia:
67
+ # 1. Carga la imagen y el audio.
68
+ # 2. Detección facial usando SFD_PATH.
69
+ # 3. Generación de los frames.
70
+ # 4. Compresión y guardado del video en output_path.
71
+
72
+ print("Inferencia en proceso...")
73
+ time.sleep(10) # Simulación del tiempo de renderizado en CPU
74
+
75
+ # Simulación de la creación del archivo de salida
76
+ # En una aplicación real, el modelo guardaría un archivo llamado "output.mp4"
77
+ dummy_video_path = os.path.join(os.getcwd(), output_path)
78
+ # Crea un archivo de salida dummy para que Gradio no falle
79
+ with open(dummy_video_path, 'w') as f:
80
+ f.write("Dummy video content")
81
+
82
+ return dummy_video_path
83
+
84
+ # Carga global de modelos (para que solo se haga una vez al inicio)
85
+ WAV2LIP_MODEL = load_wav2lip_model(WAV2LIP_PATH)
86
+ # El detector SFD a menudo se inicializa dentro del proceso de inferencia.
87
+
88
+
89
+ # =================================================================
90
+ # 3. FUNCIÓN PRINCIPAL DEL SERVIDOR (Lógica expuesta por la API)
91
  # =================================================================
92
 
93
  def generar_avatar_wav2lip(imagen_fuente, archivo_audio):
94
+ """
95
+ Función que recibe la imagen y el audio,
96
+ ejecuta el modelo Wav2Lip y devuelve la ruta al video generado.
97
+ """
98
+
99
+ # Rutas temporales para los archivos de salida de Gradio
100
+ OUTPUT_VIDEO_PATH = "results/generated_video.mp4"
101
+ os.makedirs(os.path.dirname(OUTPUT_VIDEO_PATH), exist_ok=True)
102
+
103
+ print("--- INICIANDO PROCESO WAV2LIP ---")
104
+ print(f"Imagen: {imagen_fuente}")
105
+ print(f"Audio: {archivo_audio}")
106
+
107
+ # Llama a la función de inferencia.
108
+ # El modelo Wav2Lip se pasa como argumento.
109
+ final_video_path = execute_inference_pipeline(
110
+ model=WAV2LIP_MODEL,
111
+ sfd_path=SFD_PATH,
112
+ image_path=imagen_fuente,
113
+ audio_path=archivo_audio,
114
+ output_path=OUTPUT_VIDEO_PATH
115
+ )
116
+
117
+ print(f"--- PROCESO FINALIZADO ---")
118
+ # Devuelve la ruta local del archivo generado
119
+ return final_video_path
120
+
121
+ #
122
 
123
  # =================================================================
124
+ # 4. CONFIGURACIÓN DE LA INTERFAZ (UI y API)
125
  # =================================================================
126
 
127
  gr.Interface(
 
131
  gr.Audio(type="filepath", label="Archivo de Audio (MP3/WAV)")
132
  ],
133
  outputs=gr.Video(label="Video Generado"),
134
+ title="Wav2Lip en Space CPU (Con Descarga Automática)",
135
+ description="Modelo Wav2Lip optimizado para CPU. Recuerda que la inferencia en CPU será lenta."
136
  ).launch()