import os import requests from tqdm import tqdm import subprocess import shutil import platform import logging logger = logging.getLogger(__name__) URL_BASE = "https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main" models_download = [ ("pretrained/", [ "D32k.pth", "D40k.pth", "D48k.pth", "G32k.pth", "G40k.pth", "G48k.pth", "f0D32k.pth", "f0D40k.pth", "f0D48k.pth", "f0G32k.pth", "f0G40k.pth", "f0G48k.pth", ]), ("pretrained_v2/", [ "D32k.pth", "D40k.pth", "D48k.pth", "G32k.pth", "G40k.pth", "G48k.pth", "f0D32k.pth", "f0D40k.pth", "f0D48k.pth", "f0G32k.pth", "f0G40k.pth", "f0G48k.pth", ]), ("uvr5_weights/", [ "HP2_all_vocals.pth", "HP3_all_vocals.pth", "HP5_only_main_vocal.pth", "VR-DeEchoAggressive.pth", "VR-DeEchoDeReverb.pth", "VR-DeEchoNormal.pth", ]), ("", ["ffmpeg.exe", "ffprobe.exe"]), # ffmpeg and ffprobe go to the main folder ] # List of individual files with their respective local and remote paths individual_files = [ ("hubert_base.pt", "assets/hubert/"), ("rmvpe.pt", "assets/rmvpe/"), ("rmvpe.onnx", "assets/rmvpe/"), ] # Create a dictionary to map remote folders to local folders folder_mapping = { "pretrained/": "assets/pretrained/", "pretrained_v2/": "assets/pretrained_v2/", "uvr5_weights/": "assets/uvr5_weights/", "": "", # Default folder for files without a remote folder } # Function to download a file with tqdm progress bar def download_file_with_progress(url, destination_path): response = requests.get(url, stream=True) total_size = int(response.headers.get("content-length", 0)) block_size = 1024 # 1 KB blocks with open(destination_path, 'wb') as file, tqdm( desc=os.path.basename(destination_path), total=total_size, unit='B', unit_scale=True, unit_divisor=1024, ) as bar: for data in response.iter_content(block_size): file.write(data) bar.update(len(data)) # Download torch crepe if not exists if not os.path.exists("torchcrepe"): os_name = platform.system() # Cloning the GitHub repository into the temporary directory print("Cloning the GitHub repository into the temporary directory...") subprocess.run(["git", "clone", "https://github.com/maxrmorrison/torchcrepe.git", "temp_torchcrepe"]) # Copying the torchcrepe folder to a different location print("Copying the torchcrepe folder...") shutil.copytree("temp_torchcrepe/torchcrepe", "./torchcrepe") # Removing the temporary directory print("Removing the temporary directory...") print(os_name) if os_name == "Windows": subprocess.run("rmdir /s /q temp_torchcrepe", shell=True) if os_name == "Linux": shutil.rmtree("temp_torchcrepe") # Download files that do not exist for remote_folder, file_list in models_download: local_folder = folder_mapping.get(remote_folder, "") for file in file_list: destination_path = os.path.join(local_folder, file) url = f"{URL_BASE}/{remote_folder}{file}" if not os.path.exists(destination_path): print(f"Downloading {url} to {destination_path}...") download_file_with_progress(url, destination_path) # Use the function tdqm # Download individual files for file_name, local_folder in individual_files: destination_path = os.path.join(local_folder, file_name) url = f"{URL_BASE}/{file_name}" if not os.path.exists(destination_path): print(f"Downloading {url} to {destination_path}...") download_file_with_progress(url, destination_path) # Use the function tdqm os.system('cls' if os.name == 'nt' else 'clear') logger.info("Applio download suscessfully continuing...")