import gradio as gr import subprocess as sp import os import uuid import time import shutil # Constants OUTPUT_DIR = './output' NUM_MINUTES = 60 # Create output directory if it doesn't exist os.makedirs(OUTPUT_DIR, exist_ok=True) class DeepFakeAI: def __init__(self): # Initialize the frame processor checkbox self.frame_processor_checkbox = gr.CheckboxGroup( choices=['face_swapper', 'face_enhancer', 'frame_enhancer'], label='FRAME PROCESSORS', value=['face_swapper'] # Default value ) # Initialize the face analyser direction dropdown self.face_analyser_direction_dropdown = gr.Dropdown( label='FACE ANALYSER DIRECTION', choices=['left-right', 'right-left', 'top-bottom', 'bottom-top', 'small-large', 'large-small'], value='left-right' ) # Initialize the face analyser age dropdown self.face_analyser_age_dropdown = gr.Dropdown( label='FACE RECOGNITION', choices=['none'] + ['reference', 'many'], value='reference' ) # Initialize the face analyser gender dropdown self.face_analyser_gender_dropdown = gr.Dropdown( label='FACE ANALYSER GENDER', choices=['none'] + ['male', 'female'], value='none' ) # Initialize the unique id textbox self.unique_id = gr.Textbox(value=str(uuid.uuid4()), visible=False) def run(self, *args): # Unpack input arguments source, target, unique_id, *rest_args = args # Check if source and target files exist if not os.path.exists(source): return "Source file does not exist" if not os.path.exists(target): return "Target file does not exist" # Remove old directories self.remove_old_directories(OUTPUT_DIR, NUM_MINUTES) # Get filename and create output directory filename = os.path.basename(target) output_dir = os.path.join(OUTPUT_DIR, unique_id) os.makedirs(output_dir, exist_ok=True) output = os.path.join(output_dir, filename) # Get frame processor and face analyser settings frame_processor = rest_args[0] selected_frame_processors = ' '.join(frame_processor) face_analyser_direction = rest_args[1] face_recognition = rest_args[2] face_analyser_gender = rest_args[3] # Construct command to run cmd = [ 'python', 'run.py', '--execution-providers', 'cpu', '-s', source, '-t', target, '-o', output, '--frame-processors', selected_frame_processors, '--face-analyser-direction', face_analyser_direction ] if face_recognition != 'none': cmd.extend(['--face-recognition', face_recognition]) if face_analyser_gender != 'none': cmd.extend(['--face-analyser-gender', face_analyser_gender]) # Add additional flags if present if len(rest_args) > 4: skip_audio = rest_args[4] keep_fps = rest_args[5] keep_temp = rest_args[6] if skip_audio: cmd.append('--skip-audio') if keep_fps: cmd.append('--keep-fps') if keep_temp: cmd.append('--keep-temp') try: print("Started...", cmd) output_text = sp.run(cmd, capture_output=True, text=True).stdout print(output_text) return output except Exception as e: return f"An error occurred: {str(e)}" def clear_output(self, unique_id): try: output_path = os.path.join(OUTPUT_DIR, unique_id) if os.path.exists(output_path): print("Trying to delete") shutil.rmtree(output_path) print(f"Output files in {output_path} are deleted") return "Output files for unique_id deleted" else: print(f"Output files in {output_path} does not exist") return "Output directory for (output_path} does not exist" except Exception as e: return f"An error occurred: {str(e)}" def remove_old_directories(self, directory, num_minutes): now = time.time() for r, d, f in os.walk(directory): for dir_name in d: dir_path = os.path.join(r, dir_name) timestamp = os.path.getmtime(dir_path) age_minutes = (now - timestamp) / 60 # Convert to minutes if age_minutes >= num_minutes: try: print("Removing", dir_path) shutil.rmtree(dir_path) print("Directory removed:", dir_path) except Exception as e: print(e) pass def get_theme(self) -> gr.Theme: return gr.themes.Soft( primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.gray, font=gr.themes.GoogleFont('Inter') ).set( background_fill_primary='*neutral_50', block_label_text_size='*text_sm', block_title_text_size='*text_sm' ) # Create an instance of the DeepFakeAI class app = DeepFakeAI() # Create the UI with gr.Blocks(theme=app.get_theme(), title="DeepFakeAI 1.0.0") as ui: with gr.Group(): gr.HTML('
DeepFakeAI 1.0.1
') with gr.Group(): with gr.Column(scale=3): gr.Label("FRAME PROCESSORS") app.frame_processor_checkbox.render() with gr.Group(): with gr.Column(scale=3): gr.Label("FACE ANALYSER DIRECTION") app.face_analyser_direction_dropdown.render() gr.Label("FACE RECOGNITION") app.face_analyser_age_dropdown.render() gr.Label("FACE ANALYSER GENDER") app.face_analyser_gender_dropdown.render() app.unique_id.render() with gr.Tab("Image:"): source_image = gr.Image(type="filepath", label="SOURCE IMAGE") target_image = gr.Files(label="TARGET IMAGE(S)") image_button = gr.Button("START") clear_button = gr.ClearButton(value="CLEAR") image_output = gr.Files(label="OUTPUT") clear_button.add(image_output) image_button.click( app.run, inputs=[source_image, target_image, app.unique_id, app.frame_processor_checkbox, app.face_analyser_direction_dropdown, app.face_analyser_age_dropdown, app.face_analyser_gender_dropdown], outputs=image_output ) clear_button.click(fn=app.clear_output, inputs=app.unique_id) with gr.Tab("Video:"): source_image_video = gr.Image(type="filepath", label="SOURCE IMAGE") target_video = gr.Files(label="TARGET VIDEO(S)") with gr.Group(): skip_audio = gr.Checkbox(label="SKIP AUDIO") keep_fps = gr.Checkbox(label="KEEP FPS") keep_temp = gr.Checkbox(label="KEEP TEMP") video_button = gr.Button("START") clear_video_button = gr.ClearButton(value="CLEAR") video_output = gr.Files(label="OUTPUT") clear_video_button.add(video_output) video_button.click( app.run, inputs=[source_image_video, target_video, app.unique_id, app.frame_processor_checkbox, app.face_analyser_direction_dropdown, app.face_analyser_age_dropdown, app.face_analyser_gender_dropdown, skip_audio, keep_fps, keep_temp], outputs=video_output ) clear_video_button.click(fn=app.clear_output, inputs=app.unique_id) ui.launch(debug=True)