File size: 6,227 Bytes
245ce92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa3a1cc
245ce92
 
 
 
aa3a1cc
245ce92
aa3a1cc
 
 
 
 
245ce92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa3a1cc
245ce92
 
aa3a1cc
245ce92
 
aa3a1cc
245ce92
 
 
 
 
 
 
c41b9a0
245ce92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa3a1cc
 
245ce92
 
 
 
aa3a1cc
 
245ce92
 
 
 
 
aa3a1cc
245ce92
 
 
 
aa3a1cc
245ce92
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import gradio as gr
import roop.globals
import roop.core
import roop.processors.frame.core
import os
import shutil

# Ensure roop thinks it's headless so it doesn't try to launch its own GUI
roop.globals.headless = True
roop.globals.execution_providers = ['cpu'] # Default to CPU, can be changed
roop.globals.execution_threads = 1
roop.globals.frame_processors = ['face_swapper']
roop.globals.keep_fps = True
roop.globals.keep_frames = False
roop.globals.skip_audio = False
roop.globals.many_faces = False
roop.globals.reference_face_position = 0
roop.globals.reference_frame_number = 0
roop.globals.similar_face_distance = 0.85
roop.globals.temp_frame_format = 'png'
roop.globals.temp_frame_quality = 100
roop.globals.output_video_encoder = 'libx264'
roop.globals.output_video_quality = 35
roop.globals.max_memory = None


def swap_face(source_file, target_file, enable_enhancer):
    if source_file is None or target_file is None:
        return None
    
    source_path = source_file if isinstance(source_file, str) else source_file.name
    target_path = target_file if isinstance(target_file, str) else target_file.name
    
    # Force strict check: Allow images ONLY.
    target_name, target_ext = os.path.splitext(os.path.basename(target_path))
    if target_ext.lower() not in ['.jpg', '.jpeg', '.png', '.bmp', '.webp']:
        raise gr.Error("Video processing is disabled on this Space due to high CPU usage. Please use Images only.")
        return None

    output_ext = '.png'
    output_path = os.path.join(os.getcwd(), f"output_{target_name}{output_ext}")

    print(f"Source: {source_path}")
    print(f"Target: {target_path}")
    print(f"Output: {output_path}")
    print(f"Enhancer Enabled: {enable_enhancer}")

    # Set globals
    roop.globals.source_path = source_path
    roop.globals.target_path = target_path
    roop.globals.output_path = output_path
    roop.globals.execution_providers = ['cpu']
    
    # Configure processors
    processors = ['face_swapper']
    if enable_enhancer:
        processors.append('face_enhancer')
    roop.globals.frame_processors = processors
    
    # CRITICAL FIX: Clear the cache of frame processors so it reloads based on the new list
    roop.processors.frame.core.FRAME_PROCESSORS_MODULES = []

    # Use correct provider name to avoid ONNX Runtime warnings
    roop.globals.execution_providers = ['CPUExecutionProvider']

    try:
        roop.core.start()
        if os.path.exists(output_path):
            return output_path
        else:
            print("Error: Output file not created.")
            return None
    except Exception as e:
        print(f"Error during processing: {e}")
        return None

# Define the interface
with gr.Blocks(title="Roop Web UI") as demo:
    
    # Custom Banner for AI Guruji
    gr.HTML("""
    <div style="background-color: #0b0f19; padding: 20px; text-align: center; border-radius: 10px; margin-bottom: 20px;">
        <img src="https://i.ibb.co/k2cBZj6q/logo-1.png" alt="AI Guruji Logo" style="width: 120px; height: 120px; border-radius: 50%; display: block; margin: 0 auto;">
        <h1 style="color: white; font-family: sans-serif; margin-top: 10px; font-size: 28px; font-weight: bold;">Al Guruji</h1>
        <div style="margin-top: 15px; display: flex; justify-content: center; gap: 10px;">
            <a href="https://www.youtube.com/@AI_Guruji_97" target="_blank" style="background-color: #ff0000; color: white; padding: 8px 20px; border-radius: 20px; text-decoration: none; font-weight: bold; font-family: sans-serif;">YouTube</a>
            <a href="https://buymeacoffee.com/bdas7906" target="_blank" style="background-color: #FFDD00; color: black; padding: 8px 20px; border-radius: 20px; text-decoration: none; font-weight: bold; font-family: sans-serif;">Buy me a coffee</a>
            <a href="https://www.instagram.com/aiguruji97/" target="_blank" style="background-color: #E1306C; color: white; padding: 8px 20px; border-radius: 20px; text-decoration: none; font-weight: bold; font-family: sans-serif;">Instagram</a>
        </div>
        <div style="margin-top: 20px; color: white; font-family: sans-serif; font-size: 14px;">
            <p>If multiple users are using this space (3-4 users), generation might be slow.</p>
            <p><strong>Duplicate this Space</strong> for faster generation without waiting!</p>
            <p style="margin-top: 10px; font-size: 16px;">❤️ <strong>Please Like this Space if you find it useful!</strong> ❤️</p>
            <div style="display: flex; justify-content: center; align-items: center; margin-top: 10px;">
                <a href="https://huggingface.co/spaces/huggingface/facefusion?duplicate=true" target="_blank" style="display: inline-flex; align-items: center; background-color: white; color: black; padding: 5px 15px; border-radius: 6px; text-decoration: none; font-weight: bold; border: 1px solid #ccc;">
                    <img src="https://huggingface.co/datasets/huggingface/badges/raw/main/duplicate-this-space-md-dark.svg" alt="Duplicate this Space" style="height: 20px; margin-right: 5px;">
                    Duplicate Space
                </a>
            </div>
        </div>
    </div>
    """)
    
    # gr.Markdown("# Roop Face Swap Web Interface")
    gr.Markdown("### Upload a source face and a target image to swap faces.")
    gr.Markdown("⚠️ **NOTE: Video processing is DISABLED on this Space due to high CPU usage.** ⚠️")
    
    with gr.Row():
        with gr.Column():
            source_input = gr.Image(type="filepath", label="Source Face (Image)")
            # Changed to Strict Image Input
            target_input = gr.Image(type="filepath", label="Target (Image ONLY)")
            enable_enhancer = gr.Checkbox(label="Enable Face Enhancer (GFPGAN)", value=False)
            submit_btn = gr.Button("Swap Face", variant="primary")
        
        with gr.Column():
            result_image = gr.Image(label="Result Image", interactive=False)
            # Video output removed

    submit_btn.click(
        fn=swap_face,
        inputs=[source_input, target_input, enable_enhancer],
        outputs=[result_image]
    )

if __name__ == "__main__":
    demo.launch(inbrowser=True)