| import gradio as gr |
| import subprocess |
| import os |
| import shutil |
| from datetime import datetime |
| from PIL import Image |
| import uuid |
|
|
| OUTPUT_DIR = "outputs" |
| os.makedirs(OUTPUT_DIR, exist_ok=True) |
|
|
|
|
| def run_scripts(target_files, source_file, use_face_enhancer): |
|
|
| if not target_files or not source_file: |
| return [] |
|
|
| output_results = [] |
|
|
| for target_file in target_files: |
|
|
| |
| unique_id = uuid.uuid4().hex[:8] |
| extension = os.path.splitext(target_file.name)[-1] |
| output_path = os.path.join( |
| OUTPUT_DIR, |
| f"swap_{unique_id}{extension}" |
| ) |
|
|
| |
| cmd = [ |
| "python3", |
| "run.py", |
| "-s", source_file.name, |
| "-t", target_file.name, |
| "-o", output_path, |
| "--frame-processor", "face_swapper" |
| ] |
|
|
| if use_face_enhancer: |
| cmd += ["--face-enhancer"] |
|
|
| print("Running:", " ".join(cmd)) |
|
|
| try: |
| result = subprocess.run( |
| cmd, |
| capture_output=True, |
| text=True |
| ) |
|
|
| if result.returncode != 0: |
| print("Error:") |
| print(result.stderr) |
| continue |
|
|
| except Exception as e: |
| print("Subprocess crashed:", str(e)) |
| continue |
|
|
| |
| if not os.path.exists(output_path): |
| print("Output not found:", output_path) |
| continue |
|
|
| |
| ext = extension.lower() |
|
|
| try: |
| if ext in [".png", ".jpg", ".jpeg", ".webp"]: |
| img = Image.open(output_path).convert("RGB") |
| output_results.append(img) |
|
|
| elif ext == ".gif": |
| |
| output_results.append(output_path) |
|
|
| elif ext in [".mp4", ".mov", ".avi"]: |
| output_results.append(output_path) |
|
|
| else: |
| output_results.append(output_path) |
|
|
| except Exception as e: |
| print("Error loading result:", str(e)) |
| continue |
|
|
| return output_results |
|
|
|
|
| iface = gr.Interface( |
| fn=run_scripts, |
| inputs=[ |
| gr.Files(label="Target Files (Image / GIF / Video)"), |
| gr.File(label="Source Face Image"), |
| gr.Checkbox(label="Use Face Enhancer", value=False) |
| ], |
| outputs=gr.Gallery(label="Results"), |
| title="Face Swapper", |
| description="Upload target images/videos and a source image to swap faces.", |
| live=False |
| ) |
|
|
| if __name__ == "__main__": |
| iface.launch() |