roop-batch-face / app.py
YepoHz's picture
Rename app (1).py to app.py
15eccd7 verified
import gradio as gr
import os
import shutil
import subprocess
from PIL import Image
# === Descarga y configuración de Roop ===
if not os.path.exists("roop"):
subprocess.run(["git", "clone", "https://github.com/s0md3v/roop.git"])
os.chdir("roop")
subprocess.run(["pip", "uninstall", "-y", "jax", "jaxlib", "numpy", "tensorflow"])
subprocess.run(["pip", "install", "numpy==1.23.5", "jax==0.4.13", "jaxlib==0.4.13", "tensorflow==2.12.0"])
subprocess.run(["pip", "install", "-r", "requirements.txt"])
os.chdir("..")
def procesar_lote(img_rostro, imgs_objetivo):
input_dir = "roop/batch_input"
output_dir = "roop/batch_output"
shutil.rmtree(input_dir, ignore_errors=True)
shutil.rmtree(output_dir, ignore_errors=True)
os.makedirs(input_dir, exist_ok=True)
os.makedirs(output_dir, exist_ok=True)
rostro_path = os.path.join("roop", "RB.jpg")
img_rostro.save(rostro_path)
for img_file in imgs_objetivo:
image = Image.open(img_file)
image.save(os.path.join(input_dir, os.path.basename(img_file)))
comando = [
"python", "roop/run.py",
"--source_face", rostro_path,
"--target_folder", input_dir,
"--output_folder", output_dir,
"--frame-processor", "face_swapper"
]
subprocess.run(comando)
zip_path = "roop/resultado.zip"
shutil.make_archive(zip_path.replace(".zip", ""), 'zip', output_dir)
return zip_path
gr.Interface(
fn=procesar_lote,
inputs=[
gr.Image(label="Rostro base (RB.jpg)", type="pil"),
gr.File(file_types=["image"], label="Imágenes a procesar", file_count="multiple")
],
outputs=gr.File(label="Descargar resultados ZIP"),
title="Intercambio de rostros por lote con Roop",
description="Sube una imagen de rostro base y varias imágenes objetivo. El sistema procesará todas y devolverá un ZIP con los resultados.",
).launch()