import shutil import os import gradio as gr import roop.globals import ui.globals from roop.utilities import clean_dir available_themes = [ "Default", "gradio/glass", "gradio/monochrome", "gradio/seafoam", "gradio/soft", "gstaff/xkcd", "freddyaboulton/dracula_revamped", "ysharma/steampunk", ] image_formats = ["jpg", "png", "webp"] video_formats = ["avi", "mkv", "mp4", "webm"] video_codecs = ["libx264", "libx265", "libvpx-vp9", "h264_nvenc", "hevc_nvenc"] providerlist = None settings_controls = [] def settings_tab(): from roop.core import suggest_execution_providers global providerlist providerlist = suggest_execution_providers() with gr.Tab("⚙ Settings"): with gr.Row(): with gr.Column(): themes = gr.Dropdown( available_themes, label="Theme", info="Change needs complete restart", value=roop.globals.CFG.selected_theme, ) with gr.Column(): settings_controls.append( gr.Checkbox( label="Public Server", value=roop.globals.CFG.server_share, elem_id="server_share", interactive=True, ) ) settings_controls.append( gr.Checkbox( label="Clear output folder before each run", value=roop.globals.CFG.clear_output, elem_id="clear_output", interactive=True, ) ) output_template = gr.Textbox( label="Filename Output Template", info="(file extension is added automatically)", lines=1, placeholder="{file}_{time}", value=roop.globals.CFG.output_template, ) with gr.Column(): input_server_name = gr.Textbox( label="Server Name", lines=1, info="Leave blank to run locally", value=roop.globals.CFG.server_name, ) with gr.Column(): input_server_port = gr.Number( label="Server Port", precision=0, info="Leave at 0 to use default", value=roop.globals.CFG.server_port, ) with gr.Row(): with gr.Column(): settings_controls.append( gr.Dropdown( providerlist, label="Provider", value=roop.globals.CFG.provider, elem_id="provider", interactive=True, ) ) chk_det_size = gr.Checkbox( label="Use default Det-Size", value=True, elem_id="default_det_size", interactive=True, ) settings_controls.append( gr.Checkbox( label="Force CPU for Face Analyser", value=roop.globals.CFG.force_cpu, elem_id="force_cpu", interactive=True, ) ) max_threads = gr.Slider( 1, 32, value=roop.globals.CFG.max_threads, label="Max. Number of Threads", info="default: 3", step=1.0, interactive=True, ) with gr.Column(): memory_limit = gr.Slider( 0, 128, value=roop.globals.CFG.memory_limit, label="Max. Memory to use (Gb)", info="0 meaning no limit", step=1.0, interactive=True, ) settings_controls.append( gr.Dropdown( image_formats, label="Image Output Format", info="default: png", value=roop.globals.CFG.output_image_format, elem_id="output_image_format", interactive=True, ) ) with gr.Column(): settings_controls.append( gr.Dropdown( video_codecs, label="Video Codec", info="default: libx264", value=roop.globals.CFG.output_video_codec, elem_id="output_video_codec", interactive=True, ) ) settings_controls.append( gr.Dropdown( video_formats, label="Video Output Format", info="default: mp4", value=roop.globals.CFG.output_video_format, elem_id="output_video_format", interactive=True, ) ) video_quality = gr.Slider( 0, 100, value=roop.globals.CFG.video_quality, label="Video Quality (crf)", info="default: 14", step=1.0, interactive=True, ) with gr.Column(): with gr.Group(): settings_controls.append( gr.Checkbox( label="Use OS temp folder", value=roop.globals.CFG.use_os_temp_folder, elem_id="use_os_temp_folder", interactive=True, ) ) settings_controls.append( gr.Checkbox( label="Show video in browser (re-encodes output)", value=roop.globals.CFG.output_show_video, elem_id="output_show_video", interactive=True, ) ) button_apply_restart = gr.Button("Restart Server", variant="primary") button_clean_temp = gr.Button("Clean temp folder") button_apply_settings = gr.Button("Apply Settings") chk_det_size.select(fn=on_option_changed) # Settings for s in settings_controls: s.select(fn=on_settings_changed) max_threads.input( fn=lambda a, b="max_threads": on_settings_changed_misc(a, b), inputs=[max_threads], ) memory_limit.input( fn=lambda a, b="memory_limit": on_settings_changed_misc(a, b), inputs=[memory_limit], ) video_quality.input( fn=lambda a, b="video_quality": on_settings_changed_misc(a, b), inputs=[video_quality], ) # button_clean_temp.click(fn=clean_temp, outputs=[bt_srcfiles, input_faces, target_faces, bt_destfiles]) button_clean_temp.click(fn=clean_temp) button_apply_settings.click( apply_settings, inputs=[themes, input_server_name, input_server_port, output_template], ) button_apply_restart.click(restart) def on_option_changed(evt: gr.SelectData): attribname = evt.target.elem_id if isinstance(evt.target, gr.Checkbox): if hasattr(roop.globals, attribname): setattr(roop.globals, attribname, evt.selected) return elif isinstance(evt.target, gr.Dropdown): if hasattr(roop.globals, attribname): setattr(roop.globals, attribname, evt.value) return raise gr.Error(f"Unhandled Setting for {evt.target}") def on_settings_changed_misc(new_val, attribname): if hasattr(roop.globals.CFG, attribname): setattr(roop.globals.CFG, attribname, new_val) else: print("Didn't find attrib!") def on_settings_changed(evt: gr.SelectData): attribname = evt.target.elem_id if isinstance(evt.target, gr.Checkbox): if hasattr(roop.globals.CFG, attribname): setattr(roop.globals.CFG, attribname, evt.selected) return elif isinstance(evt.target, gr.Dropdown): if hasattr(roop.globals.CFG, attribname): setattr(roop.globals.CFG, attribname, evt.value) return raise gr.Error(f"Unhandled Setting for {evt.target}") def clean_temp(): from ui.main import prepare_environment ui.globals.ui_input_thumbs.clear() roop.globals.INPUT_FACESETS.clear() roop.globals.TARGET_FACES.clear() ui.globals.ui_target_thumbs = [] if not roop.globals.CFG.use_os_temp_folder: clean_dir(os.environ["TEMP"]) prepare_environment() gr.Info("Temp Files removed") return None, None, None, None def apply_settings(themes, input_server_name, input_server_port, output_template): from ui.main import show_msg roop.globals.CFG.selected_theme = themes roop.globals.CFG.server_name = input_server_name roop.globals.CFG.server_port = input_server_port roop.globals.CFG.output_template = output_template roop.globals.CFG.save() show_msg("Settings saved") def restart(): ui.globals.ui_restart_server = True