import gradio as gr import config import face_swapper def render_cpu_tools(input_img): with gr.Accordion("🛠️ Standalone Image Face Swapper & GFPGAN Restoration Tool", open=True): with gr.Row(): tool_target_img = gr.Image(type="pil", label="Target Image to Swap / Enhance", sources=["upload", "clipboard"], height=180) tool_ref_img = gr.Image(type="pil", label="Reference Face Image (Optional)", sources=["upload", "clipboard"], height=180) with gr.Row(): tool_gender_dropdown = gr.Dropdown( choices=["Any / All Faces", "Female Faces Only", "Male Faces Only"], value="Any / All Faces", label="👥 Target Gender to Swap" ) tool_gfpgan_checkbox = gr.Checkbox( label="✨ Enhance Face Detail (GFPGAN v1.4)", value=True, info="Sharpens blurry facial details via GFPGAN restoration" ) with gr.Row(): tool_swap_btn = gr.Button("🚀 Swap Single Image Face (CPU)", variant="primary") tool_enhance_only_btn = gr.Button("✨ Enhance Face Only (GFPGAN v1.4)", variant="secondary") tool_result_img = gr.Image(type="pil", label="Result Image (Swapped / Enhanced)", interactive=False, height=200) tool_send_btn = gr.Button("📸 Send Result Image to Main Video Input", variant="secondary") def run_standalone_swap(target_img, ref_img, gender, enhance_gfpgan): if target_img is None: raise gr.Error("Please upload a target image to swap.") return face_swapper.swap_face_in_single_image(target_img, ref_img, gender, enhance_with_gfpgan=enhance_gfpgan) def run_standalone_face_enhance(target_img): if target_img is None: raise gr.Error("Please upload an image to enhance.") res = face_swapper.call_sulphur_enhance_face_api(target_img) if res is None: raise gr.Error("Sulphur AI GFPGAN Face Enhance API is offline or not configured.") return res tool_swap_btn.click( fn=run_standalone_swap, inputs=[tool_target_img, tool_ref_img, tool_gender_dropdown, tool_gfpgan_checkbox], outputs=[tool_result_img] ) tool_enhance_only_btn.click( fn=run_standalone_face_enhance, inputs=[tool_target_img], outputs=[tool_result_img] ) tool_send_btn.click( fn=lambda img: img, inputs=[tool_result_img], outputs=[input_img] ) return { "tool_target_img": tool_target_img, "tool_ref_img": tool_ref_img, "tool_gender_dropdown": tool_gender_dropdown, "tool_gfpgan_checkbox": tool_gfpgan_checkbox, "tool_swap_btn": tool_swap_btn, "tool_enhance_only_btn": tool_enhance_only_btn, "tool_result_img": tool_result_img, "tool_send_btn": tool_send_btn }