Spaces:
Configuration error
Configuration error
import tkinter as tk | |
from tkinter import filedialog, ttk | |
import configparser | |
import os | |
try: | |
with open('installed.txt', 'r') as file: | |
version = file.read() | |
except FileNotFoundError: | |
print("SyncKing-Kong does not appear to have installed correctly.") | |
print("Please try to install it again.") | |
print("https://github.com/anothermartz/Easy-Wav2Lip/issues") | |
input() | |
exit() | |
print("opening GUI") | |
runfile = 'run.txt' | |
if os.path.exists(runfile): | |
os.remove(runfile) | |
import webbrowser | |
def open_github_link(event): | |
webbrowser.open("https://github.com/anothermartz/Easy-Wav2Lip?tab=readme-ov-file#advanced-tweaking") | |
def read_config(): | |
# Read the config.ini file | |
config = configparser.ConfigParser() | |
config.read("config.ini") | |
return config | |
def save_config(config): | |
# Save the updated config back to config.ini | |
with open("config.ini", "w") as config_file: | |
config.write(config_file) | |
def open_video_file(): | |
file_path = filedialog.askopenfilename(title="Select a video file", filetypes=[("All files", "*.*")]) | |
if file_path: | |
video_file_var.set(file_path) | |
def open_vocal_file(): | |
file_path = filedialog.askopenfilename(title="Select a vocal file", filetypes=[("All files", "*.*")]) | |
if file_path: | |
vocal_file_var.set(file_path) | |
# feathering | |
def validate_frame_preview(P): | |
if P == "": | |
return True # Allow empty input | |
try: | |
num = float(P) | |
if (num.is_integer()): | |
return True | |
except ValueError: | |
pass | |
return False | |
def start_syncking_kong(): | |
print("Saving config") | |
config["OPTIONS"]["video_file"] = str(video_file_var.get()) | |
config["OPTIONS"]["vocal_file"] = str(vocal_file_var.get()) | |
config["OPTIONS"]["quality"] = str(quality_var.get()) | |
config["OPTIONS"]["output_height"] = str(output_height_combobox.get()) | |
config["OPTIONS"]["wav2lip_version"] = str(wav2lip_version_var.get()) | |
config["OPTIONS"]["use_previous_tracking_data"] = str(use_previous_tracking_data_var.get()) | |
config["OPTIONS"]["nosmooth"] = str(nosmooth_var.get()) | |
config["OPTIONS"]["preview_window"] = str(preview_window_var.get()) | |
config["PADDING"]["u"] = str(padding_vars["u"].get()) | |
config["PADDING"]["d"] = str(padding_vars["d"].get()) | |
config["PADDING"]["l"] = str(padding_vars["l"].get()) | |
config["PADDING"]["r"] = str(padding_vars["r"].get()) | |
config["MASK"]["size"] = str(size_var.get()) | |
config["MASK"]["feathering"] = str(feathering_var.get()) | |
config["MASK"]["mouth_tracking"] = str(mouth_tracking_var.get()) | |
config["MASK"]["debug_mask"] = str(debug_mask_var.get()) | |
config["OTHER"]["batch_process"] = str(batch_process_var.get()) | |
config["OTHER"]["output_suffix"] = str(output_suffix_var.get()) | |
config["OTHER"]["include_settings_in_suffix"] = str(include_settings_in_suffix_var.get()) | |
config["OTHER"]["preview_settings"] = str(preview_settings_var.get()) | |
config["OTHER"]["frame_to_preview"] = str(frame_to_preview_var.get()) | |
save_config(config) # Save the updated config | |
with open("run.txt", "w") as f: | |
f.write("run") | |
exit() | |
# Add your logic here | |
root = tk.Tk() | |
root.title("SyncKing-Kong GUI") | |
root.geometry("800x720") | |
root.configure(bg="lightblue") | |
# Read the existing config.ini | |
config = read_config() | |
row=0 | |
tk.Label(root, text=version, bg="lightblue").grid(row=row, column=0, sticky="w") | |
# Create a label for video file | |
row+=1 | |
video_label = tk.Label(root, text="Video File Path:", bg="lightblue") | |
video_label.grid(row=row, column=0, sticky="e") | |
# Entry widget for video file path | |
video_file_var = tk.StringVar() | |
video_entry = tk.Entry(root, textvariable=video_file_var, width=80) | |
video_entry.grid(row=row, column=1, sticky="w") | |
# Create a button to open the file dialog | |
select_button = tk.Button(root, text="...", command=open_video_file) | |
select_button.grid(row=row, column=1, sticky="w", padx=490) | |
# Set the default value based on the existing config | |
video_file_var.set(config["OPTIONS"].get("video_file", "")) | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# String input for vocal_file | |
row+=1 | |
# Create a label for the input box | |
vocal_file_label = tk.Label(root, text="Vocal File Path:", bg="lightblue") | |
vocal_file_label.grid(row=row, column=0, sticky="e") | |
# Create an input box for the vocal file path | |
vocal_file_var = tk.StringVar() | |
vocal_file_entry = tk.Entry(root, textvariable=vocal_file_var, width=80) | |
vocal_file_entry.grid(row=row, column=1, sticky="w") | |
# Create a button to open the file dialog | |
select_button = tk.Button(root, text="...", command=open_vocal_file) | |
select_button.grid(row=row, column=1, sticky="w", padx=490) | |
# Set the initial value from the 'config' dictionary (if available) | |
vocal_file_var.set(config["OPTIONS"].get("vocal_file", "")) | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# Dropdown box for quality options | |
row+=1 | |
quality_label = tk.Label(root, text="Select Quality:", bg="lightblue") | |
quality_label.grid(row=row, column=0, sticky="e") | |
quality_options = ["Fast", "Improved", "Enhanced"] | |
quality_var = tk.StringVar() | |
quality_var.set(config["OPTIONS"].get("quality", "Improved")) | |
quality_dropdown = tk.OptionMenu(root, quality_var, *quality_options) | |
quality_dropdown.grid(row=row, column=1, sticky="w") | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# Output height | |
row+=1 | |
output_height_label = tk.Label(root, text="Output height:", bg="lightblue") | |
output_height_label.grid(row=row, column=0, sticky="e") | |
output_height_options = ["half resolution", "full resolution"] | |
output_height_combobox = ttk.Combobox(root, values=output_height_options) | |
output_height_combobox.set(config["OPTIONS"].get("output_height", "full resolution")) # Set default value | |
output_height_combobox.grid(row=row, column=1, sticky="w") | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# Dropdown box for wav2lip version options | |
row+=1 | |
wav2lip_version_label = tk.Label(root, text="Select Wav2Lip version:", bg="lightblue") | |
wav2lip_version_label.grid(row=row, column=0, sticky="e") | |
wav2lip_version_options = ["Wav2Lip", "Wav2Lip_GAN"] | |
wav2lip_version_var = tk.StringVar() | |
wav2lip_version_var.set(config["OPTIONS"].get("wav2lip_version", "Wav2Lip")) | |
wav2lip_version_dropdown = tk.OptionMenu(root, wav2lip_version_var, *wav2lip_version_options) | |
wav2lip_version_dropdown.grid(row=row, column=1, sticky="w") | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# output_suffix | |
row+=1 | |
output_suffix_label = tk.Label(root, text="Output File Suffix:", bg="lightblue") | |
output_suffix_label.grid(row=row, column=0, sticky="e") | |
output_suffix_var = tk.StringVar() | |
output_suffix_var.set(config["OTHER"].get("output_suffix", "_SyncKing-Kong")) | |
output_suffix_entry = output_suffix_entry = tk.Entry(root, textvariable=output_suffix_var, width=20) | |
output_suffix_entry.grid(row=row, column=1, sticky="w") | |
include_settings_in_suffix_var = tk.BooleanVar() | |
include_settings_in_suffix_var.set(config["OTHER"].get("include_settings_in_suffix", True)) # Set default value | |
include_settings_in_suffix_checkbox = tk.Checkbutton(root, text="Add Settings to Suffix", variable=include_settings_in_suffix_var, bg="lightblue") | |
include_settings_in_suffix_checkbox.grid(row=row, column=1, sticky="w", padx=130) | |
# batch_process | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
row+=1 | |
batch_process_label = tk.Label(root, text="Batch Process:", bg="lightblue") | |
batch_process_label.grid(row=row, column=0, sticky="e") | |
batch_process_var = tk.BooleanVar() | |
batch_process_var.set(config["OTHER"].get("batch_process", True)) # Set default value | |
batch_process_checkbox = tk.Checkbutton(root, text="", variable=batch_process_var, bg="lightblue") | |
batch_process_checkbox.grid(row=row, column=1, sticky="w") | |
# Dropdown box for preview window options | |
row+=1 | |
preview_window_label = tk.Label(root, text="Preview Window:", bg="lightblue") | |
preview_window_label.grid(row=row, column=0, sticky="e") | |
preview_window_options = ["Face", "Full", "Both", "None"] | |
preview_window_var = tk.StringVar() | |
preview_window_var.set(config["OPTIONS"].get("preview_window", "Face")) | |
preview_window_dropdown = tk.OptionMenu(root, preview_window_var, *preview_window_options) | |
preview_window_dropdown.grid(row=row, column=1, sticky="w") | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
# Button to start SyncKing-Kong | |
row+=1 | |
start_button = tk.Button(root, text="Start SyncKing-Kong", command=start_syncking_kong, bg="#5af269", font=("Arial", 16)) | |
start_button.grid(row=row, column=0, sticky="w", padx=290, columnspan=2) | |
row+=1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
row+=1 | |
tk.Label(root, text="Advanced Tweaking:", bg="lightblue", font=("Arial", 16)).grid(row=row, column=0, sticky="w") | |
row+=1 | |
# Create a label with a custom cursor | |
link = tk.Label(root, text="(Click here to see readme)", bg="lightblue", fg="blue", font=("Arial", 10), cursor="hand2") | |
link.grid(row=row, column=0) | |
# Bind the click event to the label | |
link.bind("<Button-1>", open_github_link) | |
# Process one frame only | |
preview_settings_var = tk.BooleanVar() | |
preview_settings_var.set(config["OTHER"].get("preview_settings", True)) # Set default value | |
preview_settings_checkbox = tk.Checkbutton(root, text="Process one frame only - Frame to process:", variable=preview_settings_var, bg="lightblue") | |
preview_settings_checkbox.grid(row=row, column=1, sticky="w") | |
frame_to_preview_var = tk.StringVar() | |
frame_to_preview_entry = tk.Entry(root, textvariable=frame_to_preview_var, validate="key", width=3, validatecommand=(root.register(validate_frame_preview), "%P")) | |
frame_to_preview_entry.grid(row=row, column=1, sticky="w", padx=255) | |
frame_to_preview_var.set(config["OTHER"].get("frame_to_preview", "100")) | |
# Checkbox for nosmooth option | |
row+=1 | |
nosmooth_var = tk.BooleanVar() | |
nosmooth_var.set(config["OPTIONS"].get("nosmooth", True)) # Set default value | |
nosmooth_checkbox = tk.Checkbutton(root, text="nosmooth - unticking will smooth face detection between 5 frames", variable=nosmooth_var, bg="lightblue") | |
nosmooth_checkbox.grid(row=row, column=1, sticky="w") | |
# Checkbox for use_previous_tracking_data option | |
row+=1 | |
use_previous_tracking_data_var = tk.BooleanVar() | |
use_previous_tracking_data_var.set(config["OPTIONS"].get("use_previous_tracking_data", True)) # Set default value | |
use_previous_tracking_data_checkbox = tk.Checkbutton(root, text="Keep previous face tracking data if using same video", variable=use_previous_tracking_data_var, bg="lightblue") | |
use_previous_tracking_data_checkbox.grid(row=row, column=1, sticky="w") | |
# padding | |
row+=1 | |
tk.Label(root, text="Padding:", bg="lightblue", font=("Arial", 12)).grid(row=row, column=1, sticky="sw", pady=10) | |
row+=1 | |
tk.Label(root, text="(Up, Down, Left, Right)", bg="lightblue").grid(row=row, column=1, rowspan=4, sticky="w", padx=100) | |
padding_vars = {} | |
# Create a list of padding labels and their corresponding keys | |
padding_labels = [("U:", "u"), ("D:", "d"), ("L:", "l"), ("R:", "r")] | |
# Validation function to allow only integers | |
def validate_integer(P): | |
if P == "" or P == "-" or P.lstrip("-").isdigit(): | |
return True | |
return False | |
# Create the padding labels and entry widgets using a loop | |
for label_text, key in padding_labels: | |
label = tk.Label(root, text=label_text, bg="lightblue") | |
label.grid(row=row, column=1, sticky="w", padx=50) | |
# Create a StringVar for the current key | |
padding_var = tk.StringVar() | |
# Set validation to allow positive and negative integers | |
entry = tk.Entry(root, textvariable=padding_var, width=3, validate="key", validatecommand=(root.register(validate_integer), "%P")) | |
entry.grid(row=row, column=1, sticky="w", padx=70) | |
# Set the default value from the 'config' dictionary | |
padding_var.set(config["PADDING"].get(key, "")) | |
# Store the StringVar in the dictionary | |
padding_vars[key] = padding_var | |
# Increment the row | |
row += 1 | |
tk.Label(root, text="", bg="lightblue").grid(row=row, column=0, sticky="w") | |
row+=1 | |
# mask size | |
def validate_custom_number(P): | |
if P == "": | |
return True # Allow empty input | |
try: | |
num = float(P) | |
if 0 <= num <= 6 and (num.is_integer() or (num * 10) % 1 == 0): | |
return True | |
except ValueError: | |
pass | |
return False | |
row+=1 | |
tk.Label(root, text="Mask settings:", bg="lightblue", font=("Arial", 12)).grid(row=row, column=1, sticky="sw") | |
row+=1 | |
size_label = tk.Label(root, text="Mask size:", bg="lightblue", padx=50) | |
size_label.grid(row=row, column=1, sticky="w") | |
size_var = tk.StringVar() | |
size_entry = tk.Entry(root, textvariable=size_var, validate="key", width=3, validatecommand=(root.register(validate_custom_number), "%P")) | |
size_entry.grid(row=row, column=1, sticky="w", padx=120) | |
size_var.set(config["MASK"].get("size", "2.5")) | |
# feathering | |
def validate_feather(P): | |
if P == "": | |
return True # Allow empty input | |
try: | |
num = float(P) | |
if 0 <= num <= 3 and (num.is_integer()): | |
return True | |
except ValueError: | |
pass | |
return False | |
row+=1 | |
feathering_label = tk.Label(root, text="Feathering:", bg="lightblue", padx=50) | |
feathering_label.grid(row=row, column=1, sticky="w") | |
feathering_var = tk.StringVar() | |
feathering_entry = tk.Entry(root, textvariable=feathering_var, validate="key", width=3, validatecommand=(root.register(validate_feather), "%P")) | |
feathering_entry.grid(row=row, column=1, sticky="w", padx=120) | |
feathering_var.set(config["MASK"].get("feathering", "2.5")) | |
# mouth_tracking | |
row+=1 | |
mouth_tracking_var = tk.BooleanVar() | |
mouth_tracking_var.set(config["MASK"].get("mouth_tracking", True)) # Set default value | |
mouth_tracking_checkbox = tk.Checkbutton(root, text="track mouth for mask on every frame", variable=mouth_tracking_var, bg="lightblue", padx=50) | |
mouth_tracking_checkbox.grid(row=row, column=1, sticky="w") | |
# debug_mask | |
row+=1 | |
debug_mask_var = tk.BooleanVar() | |
debug_mask_var.set(config["MASK"].get("debug_mask", True)) # Set default value | |
debug_mask_checkbox = tk.Checkbutton(root, text="highlight mask for debugging", variable=debug_mask_var, bg="lightblue", padx=50) | |
debug_mask_checkbox.grid(row=row, column=1, sticky="w") | |
# Increase spacing between all rows (uniformly) | |
for row in range(row): | |
root.rowconfigure(row, weight=1) | |
root.mainloop() | |