diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef5fa6c..de2ea3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,4 @@ jobs: python-version: 3.9 - run: pip install -r requirements.txt gdown - run: gdown 13QpWFWJ37EB-nHrEOY64CEtQWY-tz7DZ - - run: ./run.py -f=.github/examples/face.jpg -t=.github/examples/target.mp4 -o=.github/examples/output.mp4 - - run: ffmpeg -i .github/examples/snapshot.mp4 -i .github/examples/output.mp4 -filter_complex "psnr" -f null - - + - run: python run.py -f=.github/examples/face.jpg -t=.github/examples/target.mp4 -o=.github/examples/output.mp4 diff --git a/roop/core.py b/roop/core.py index e548452..f93785b 100755 --- a/roop/core.py +++ b/roop/core.py @@ -20,7 +20,7 @@ import cv2 import roop.globals from roop.swapper import process_video, process_img, process_faces, process_frames -from roop.utils import is_img, detect_fps, set_fps, create_video, add_audio, extract_frames, rreplace +from roop.utils import is_img, detect_fps, set_fps, create_video, add_audio, extract_frames from roop.analyser import get_face_single import roop.ui as ui @@ -166,9 +166,6 @@ def start(preview_callback = None): elif not args.target_path or not os.path.isfile(args.target_path): print("\n[WARNING] Please select a video/image to swap face in.") return - if not args.output_path: - target_path = args.target_path - args.output_path = rreplace(target_path, "/", "/swapped-", 1) if "/" in target_path else "swapped-" + target_path target_path = args.target_path test_face = get_face_single(cv2.imread(args.source_target)) if not test_face: @@ -183,14 +180,14 @@ def start(preview_callback = None): seconds, probabilities = predict_video_frames(video_path=args.target_path, frame_interval=100) if any(probability > 0.85 for probability in probabilities): quit() - video_name_full = target_path.split("/")[-1] + video_name_full = target_path.split(os.sep)[-1] video_name = os.path.splitext(video_name_full)[0] - output_dir = os.path.dirname(target_path) + "/" + video_name if os.path.dirname(target_path) else video_name + output_dir = os.path.dirname(target_path) + os.sep + video_name if os.path.dirname(target_path) else video_name Path(output_dir).mkdir(exist_ok=True) status("detecting video's FPS...") fps, exact_fps = detect_fps(target_path) if not args.keep_fps and fps > 30: - this_path = output_dir + "/" + video_name + ".mp4" + this_path = output_dir + os.sep + video_name + ".mp4" set_fps(target_path, this_path, 30) target_path, exact_fps = this_path, 30 else: @@ -215,7 +212,7 @@ def start(preview_callback = None): create_video(video_name, exact_fps, output_dir) status("adding audio...") add_audio(output_dir, target_path, video_name_full, args.keep_frames, args.output_path) - save_path = args.output_path if args.output_path else output_dir + "/" + video_name + ".mp4" + save_path = args.output_path if args.output_path else output_dir + os.sep + video_name + ".mp4" print("\n\nVideo saved as:", save_path, "\n\n") status("swap successful!") diff --git a/roop/utils.py b/roop/utils.py index 450a7ed..d4b8645 100644 --- a/roop/utils.py +++ b/roop/utils.py @@ -2,16 +2,6 @@ import os import shutil import roop.globals -sep = "/" -if os.name == "nt": - sep = "\\" - - -def path(string): - if sep == "\\": - return string.replace("/", "\\") - return string - def run_command(command, mode="silent"): if mode == "debug": @@ -20,7 +10,6 @@ def run_command(command, mode="silent"): def detect_fps(input_path): - input_path = path(input_path) output = os.popen(f'ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate "{input_path}"').read() if "/" in output: try: @@ -35,25 +24,21 @@ def run_ffmpeg(args): def set_fps(input_path, output_path, fps): - input_path, output_path = path(input_path), path(output_path) run_ffmpeg(f'-i "{input_path}" -filter:v fps=fps={fps} "{output_path}"') def create_video(video_name, fps, output_dir): - output_dir = path(output_dir) - run_ffmpeg(f'-framerate "{fps}" -i "{output_dir}{sep}%04d.png" -c:v libx264 -crf 7 -pix_fmt yuv420p -y "{output_dir}{sep}output.mp4"') + run_ffmpeg(f'-framerate "{fps}" -i "{output_dir}{os.sep}%04d.png" -c:v libx264 -crf 7 -pix_fmt yuv420p -y "{output_dir}{os.sep}output.mp4"') def extract_frames(input_path, output_dir): - input_path, output_dir = path(input_path), path(output_dir) - run_ffmpeg(f'-i "{input_path}" "{output_dir}{sep}%04d.png"') + run_ffmpeg(f'-i "{input_path}" "{output_dir}{os.sep}%04d.png"') def add_audio(output_dir, target_path, video, keep_frames, output_file): video_name = os.path.splitext(video)[0] save_to = output_file if output_file else output_dir + "/swapped-" + video_name + ".mp4" - save_to_ff, output_dir_ff = path(save_to), path(output_dir) - run_ffmpeg(f'-i "{output_dir_ff}{sep}output.mp4" -i "{output_dir_ff}{sep}{video}" -c:v copy -map 0:v:0 -map 1:a:0 -y "{save_to_ff}"') + run_ffmpeg(f'-i "{output_dir}{os.sep}output.mp4" -i "{output_dir}{os.sep}{video}" -c:v copy -map 0:v:0 -map 1:a:0 -y "{save_to}"') if not os.path.isfile(save_to): shutil.move(output_dir + "/output.mp4", save_to) if not keep_frames: @@ -62,8 +47,3 @@ def add_audio(output_dir, target_path, video, keep_frames, output_file): def is_img(path): return path.lower().endswith(("png", "jpg", "jpeg", "bmp")) - - -def rreplace(s, old, new, occurrence): - li = s.rsplit(old, occurrence) - return new.join(li)