diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..30291cb --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.10.0 diff --git a/modules/core.py b/modules/core.py index b6ef9b8..c0c25f1 100644 --- a/modules/core.py +++ b/modules/core.py @@ -35,9 +35,7 @@ def parse_args() -> None: program.add_argument('-t', '--target', help='select an target image or video', dest='target_path') program.add_argument('-o', '--output', help='select output file or directory', dest='output_path') program.add_argument('--frame-processor', help='pipeline of frame processors', dest='frame_processor', default=['face_swapper'], choices=['face_swapper', 'face_enhancer'], nargs='+') - program.add_argument('--keep-fps', help='keep original fps', dest='keep_fps', action='store_true', default=False) program.add_argument('--keep-audio', help='keep original audio', dest='keep_audio', action='store_true', default=True) - program.add_argument('--keep-frames', help='keep temporary frames', dest='keep_frames', action='store_true', default=False) program.add_argument('--many-faces', help='process every face', dest='many_faces', action='store_true', default=False) program.add_argument('--nsfw-filter', help='filter the NSFW image or video', dest='nsfw_filter', action='store_true', default=False) program.add_argument('--map-faces', help='map source target faces', dest='map_faces', action='store_true', default=False) @@ -65,9 +63,9 @@ def parse_args() -> None: modules.globals.output_path = normalize_output_path(modules.globals.source_path, modules.globals.target_path, args.output_path) modules.globals.frame_processors = args.frame_processor modules.globals.headless = args.source_path or args.target_path or args.output_path - modules.globals.keep_fps = args.keep_fps + modules.globals.keep_fps = True + modules.globals.keep_frames = True modules.globals.keep_audio = args.keep_audio - modules.globals.keep_frames = args.keep_frames modules.globals.many_faces = args.many_faces modules.globals.mouth_mask = args.mouth_mask modules.globals.nsfw_filter = args.nsfw_filter diff --git a/modules/ui.py b/modules/ui.py index 8eb9289..c491dac 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -151,6 +151,7 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C root.configure() root.protocol("WM_DELETE_WINDOW", lambda: destroy()) + # Image Selection Area (Top) source_label = ctk.CTkLabel(root, text=None) source_label.place(relx=0.1, rely=0.1, relwidth=0.3, relheight=0.25) @@ -175,58 +176,7 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C ) select_target_button.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1) - keep_fps_value = ctk.BooleanVar(value=modules.globals.keep_fps) - keep_fps_checkbox = ctk.CTkSwitch( - root, - text=_("Keep fps"), - variable=keep_fps_value, - cursor="hand2", - command=lambda: ( - setattr(modules.globals, "keep_fps", keep_fps_value.get()), - save_switch_states(), - ), - ) - keep_fps_checkbox.place(relx=0.1, rely=0.6) - - keep_frames_value = ctk.BooleanVar(value=modules.globals.keep_frames) - keep_frames_switch = ctk.CTkSwitch( - root, - text=_("Keep frames"), - variable=keep_frames_value, - cursor="hand2", - command=lambda: ( - setattr(modules.globals, "keep_frames", keep_frames_value.get()), - save_switch_states(), - ), - ) - keep_frames_switch.place(relx=0.1, rely=0.65) - - enhancer_value = ctk.BooleanVar(value=modules.globals.fp_ui["face_enhancer"]) - enhancer_switch = ctk.CTkSwitch( - root, - text=_("Face Enhancer"), - variable=enhancer_value, - cursor="hand2", - command=lambda: ( - update_tumbler("face_enhancer", enhancer_value.get()), - save_switch_states(), - ), - ) - enhancer_switch.place(relx=0.1, rely=0.7) - - keep_audio_value = ctk.BooleanVar(value=modules.globals.keep_audio) - keep_audio_switch = ctk.CTkSwitch( - root, - text=_("Keep audio"), - variable=keep_audio_value, - cursor="hand2", - command=lambda: ( - setattr(modules.globals, "keep_audio", keep_audio_value.get()), - save_switch_states(), - ), - ) - keep_audio_switch.place(relx=0.6, rely=0.6) - + # Face Processing Options (Middle Left) many_faces_value = ctk.BooleanVar(value=modules.globals.many_faces) many_faces_switch = ctk.CTkSwitch( root, @@ -238,24 +188,7 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C save_switch_states(), ), ) - many_faces_switch.place(relx=0.6, rely=0.65) - - color_correction_value = ctk.BooleanVar(value=modules.globals.color_correction) - color_correction_switch = ctk.CTkSwitch( - root, - text=_("Fix Blueish Cam"), - variable=color_correction_value, - cursor="hand2", - command=lambda: ( - setattr(modules.globals, "color_correction", color_correction_value.get()), - save_switch_states(), - ), - ) - color_correction_switch.place(relx=0.6, rely=0.70) - - # nsfw_value = ctk.BooleanVar(value=modules.globals.nsfw_filter) - # nsfw_switch = ctk.CTkSwitch(root, text='NSFW filter', variable=nsfw_value, cursor='hand2', command=lambda: setattr(modules.globals, 'nsfw_filter', nsfw_value.get())) - # nsfw_switch.place(relx=0.6, rely=0.7) + many_faces_switch.place(relx=0.1, rely=0.55) map_faces = ctk.BooleanVar(value=modules.globals.map_faces) map_faces_switch = ctk.CTkSwitch( @@ -269,21 +202,22 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C close_mapper_window() if not map_faces.get() else None ), ) - map_faces_switch.place(relx=0.1, rely=0.75) + map_faces_switch.place(relx=0.1, rely=0.6) - show_fps_value = ctk.BooleanVar(value=modules.globals.show_fps) - show_fps_switch = ctk.CTkSwitch( + enhancer_value = ctk.BooleanVar(value=modules.globals.fp_ui["face_enhancer"]) + enhancer_switch = ctk.CTkSwitch( root, - text=_("Show FPS"), - variable=show_fps_value, + text=_("Face Enhancer"), + variable=enhancer_value, cursor="hand2", command=lambda: ( - setattr(modules.globals, "show_fps", show_fps_value.get()), + update_tumbler("face_enhancer", enhancer_value.get()), save_switch_states(), ), ) - show_fps_switch.place(relx=0.6, rely=0.75) + enhancer_switch.place(relx=0.1, rely=0.65) + # Additional Options (Middle Right) mouth_mask_var = ctk.BooleanVar(value=modules.globals.mouth_mask) mouth_mask_switch = ctk.CTkSwitch( root, @@ -292,7 +226,7 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C cursor="hand2", command=lambda: setattr(modules.globals, "mouth_mask", mouth_mask_var.get()), ) - mouth_mask_switch.place(relx=0.1, rely=0.55) + mouth_mask_switch.place(relx=0.6, rely=0.55) show_mouth_mask_box_var = ctk.BooleanVar(value=modules.globals.show_mouth_mask_box) show_mouth_mask_box_switch = ctk.CTkSwitch( @@ -304,26 +238,40 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C modules.globals, "show_mouth_mask_box", show_mouth_mask_box_var.get() ), ) - show_mouth_mask_box_switch.place(relx=0.6, rely=0.55) + show_mouth_mask_box_switch.place(relx=0.6, rely=0.6) + keep_audio_value = ctk.BooleanVar(value=modules.globals.keep_audio) + keep_audio_switch = ctk.CTkSwitch( + root, + text=_("Keep audio"), + variable=keep_audio_value, + cursor="hand2", + command=lambda: ( + setattr(modules.globals, "keep_audio", keep_audio_value.get()), + save_switch_states(), + ), + ) + keep_audio_switch.place(relx=0.6, rely=0.65) + + # Main Control Buttons (Bottom) start_button = ctk.CTkButton( root, text=_("Start"), cursor="hand2", command=lambda: analyze_target(start, root) ) - start_button.place(relx=0.15, rely=0.80, relwidth=0.2, relheight=0.05) - - stop_button = ctk.CTkButton( - root, text=_("Destroy"), cursor="hand2", command=lambda: destroy() - ) - stop_button.place(relx=0.4, rely=0.80, relwidth=0.2, relheight=0.05) + start_button.place(relx=0.15, rely=0.75, relwidth=0.2, relheight=0.05) preview_button = ctk.CTkButton( root, text=_("Preview"), cursor="hand2", command=lambda: toggle_preview() ) - preview_button.place(relx=0.65, rely=0.80, relwidth=0.2, relheight=0.05) + preview_button.place(relx=0.4, rely=0.75, relwidth=0.2, relheight=0.05) - # --- Camera Selection --- + stop_button = ctk.CTkButton( + root, text=_("Destroy"), cursor="hand2", command=lambda: destroy() + ) + stop_button.place(relx=0.65, rely=0.75, relwidth=0.2, relheight=0.05) + + # Camera Section (Bottom) camera_label = ctk.CTkLabel(root, text=_("Select Camera:")) - camera_label.place(relx=0.1, rely=0.86, relwidth=0.2, relheight=0.05) + camera_label.place(relx=0.1, rely=0.85, relwidth=0.2, relheight=0.05) available_cameras = get_available_cameras() camera_indices, camera_names = available_cameras @@ -342,7 +290,7 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C root, variable=camera_variable, values=camera_names ) - camera_optionmenu.place(relx=0.35, rely=0.86, relwidth=0.25, relheight=0.05) + camera_optionmenu.place(relx=0.35, rely=0.85, relwidth=0.25, relheight=0.05) live_button = ctk.CTkButton( root, @@ -362,11 +310,11 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C else "disabled" ), ) - live_button.place(relx=0.65, rely=0.86, relwidth=0.2, relheight=0.05) - # --- End Camera Selection --- + live_button.place(relx=0.65, rely=0.85, relwidth=0.2, relheight=0.05) + # Status and Links (Bottom) status_label = ctk.CTkLabel(root, text=None, justify="center") - status_label.place(relx=0.1, rely=0.9, relwidth=0.8) + status_label.place(relx=0.1, rely=0.92, relwidth=0.8) donate_label = ctk.CTkLabel( root, text="Deep Live Cam", justify="center", cursor="hand2"