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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -40
app.py CHANGED
@@ -15,75 +15,77 @@ 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
  # =================================================================
@@ -96,16 +98,13 @@ def generar_avatar_wav2lip(imagen_fuente, archivo_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,
@@ -114,11 +113,9 @@ def generar_avatar_wav2lip(imagen_fuente, 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)
 
15
  os.makedirs(LOCAL_CHECKPOINT_DIR, exist_ok=True)
16
  downloaded_paths = {}
17
 
18
+ # --- LÓGICA DE DESCARGA VERIFICADA (VERSION FINAL) ---
19
  try:
20
+ # 1. WAV2LIP PRINCIPAL (Fuente más estable para el modelo)
21
  WAV2LIP_REPO = "Nekochu/Wav2Lip"
22
  WAV2LIP_FILE = "wav2lip_gan.pth"
23
+ print(f"-> Descargando {WAV2LIP_FILE} desde {WAV2LIP_REPO}...")
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
+ print(f"✅ Descarga de {WAV2LIP_FILE} completada.")
27
 
28
+ # 2. DETECTOR FACIAL SFD (Fuente final verificada para el detector)
29
+ SFD_REPO = "face-alignment/s3fd"
30
  SFD_FILE = "s3fd.pth"
31
+ print(f"-> Descargando {SFD_FILE} desde {SFD_REPO}...")
32
  path_sfd = hf_hub_download(repo_id=SFD_REPO, filename=SFD_FILE, local_dir=LOCAL_CHECKPOINT_DIR, local_dir_use_symlinks=False)
33
  downloaded_paths[SFD_FILE] = path_sfd
34
+ print(f"✅ Descarga de {SFD_FILE} completada.")
35
 
36
+ print("✅ Descarga de Checkpoints completada. Modelos listos.")
37
 
38
  except Exception as e:
39
  print(f"❌ ERROR CRÍTICO EN LA DESCARGA: {e}")
40
  exit(1)
41
 
42
+ # Rutas de los modelos descargados (Globales para la inferencia)
43
  WAV2LIP_PATH = downloaded_paths[WAV2LIP_FILE]
44
  SFD_PATH = downloaded_paths[SFD_FILE]
45
 
46
  # =================================================================
47
+ # 2. MODELO Y FUNCIONES HELPER (¡REQUIERE CÓDIGO EXTERNO!)
48
  # =================================================================
49
 
50
+ # ---> NOTA IMPORTANTE: FALTAN FUNCIONES HELPER AQUÍ <---
51
+ # Debes pegar aquí:
52
+ # 1. La clase 'Wav2Lip' (definición del modelo).
53
+ # 2. Las funciones de utilidad para pre-procesamiento de video/audio (ej. get_smoothened_fpc, face_detect, etc.).
54
+ # Estos archivos se encuentran en el repositorio original de Wav2Lip (ver Paso 3).
55
+
56
+ # --- PLACEHOLDERS DE MODELO ---
57
 
58
  def load_wav2lip_model(path):
59
+ """Placeholder para cargar el modelo PyTorch."""
60
+ # Aquí iría la lógica real de carga del modelo Wav2Lip.
61
  print(f"Cargando modelo Wav2Lip desde: {path}")
62
  # model = Wav2Lip().to(device)
63
  # model.load_state_dict(torch.load(path)['state_dict'])
64
  # return model
65
+ return "Wav2Lip_Instance"
66
 
67
  def execute_inference_pipeline(model, sfd_path, image_path, audio_path, output_path):
68
  """
69
  Placeholder para la ejecución completa del pipeline de Wav2Lip.
 
 
70
  """
71
+ # Aquí se ejecuta la magia de Wav2Lip, usando las rutas de entrada.
 
 
 
 
 
72
  print("Inferencia en proceso...")
 
73
 
74
  # Simulación de la creación del archivo de salida
75
+ time.sleep(10) # Simulación del tiempo de renderizado en CPU
76
+
77
+ output_dir = os.path.dirname(output_path)
78
+ os.makedirs(output_dir, exist_ok=True)
79
+
80
+ # Crea un archivo de salida dummy para que Gradio no falle (EN PRODUCCIÓN DEBE SER UN MP4 REAL)
81
+ with open(output_path, 'w') as f:
82
+ f.write("Dummy video content")
83
 
84
+ return output_path
85
+
86
 
87
+ # Carga global de modelos
88
  WAV2LIP_MODEL = load_wav2lip_model(WAV2LIP_PATH)
 
89
 
90
 
91
  # =================================================================
 
98
  ejecuta el modelo Wav2Lip y devuelve la ruta al video generado.
99
  """
100
 
101
+ # Ruta temporal y única para el archivo de salida
102
+ OUTPUT_VIDEO_PATH = os.path.join("results", f"output_{time.time()}.mp4")
 
103
 
104
  print("--- INICIANDO PROCESO WAV2LIP ---")
105
+ print(f"Ruta de Salida: {OUTPUT_VIDEO_PATH}")
 
106
 
107
  # Llama a la función de inferencia.
 
108
  final_video_path = execute_inference_pipeline(
109
  model=WAV2LIP_MODEL,
110
  sfd_path=SFD_PATH,
 
113
  output_path=OUTPUT_VIDEO_PATH
114
  )
115
 
116
+ print("--- PROCESO FINALIZADO ---")
 
117
  return final_video_path
118
 
 
119
 
120
  # =================================================================
121
  # 4. CONFIGURACIÓN DE LA INTERFAZ (UI y API)