from huggingface_hub import list_repo_files, hf_hub_download import os import shutil # Repository ID repo_id = "hexgrad/Kokoro-82M" # Set up the cache directory cache_dir = "./cache" # Customize this path if needed os.makedirs(cache_dir, exist_ok=True) def get_voice_models(): # Ensure the 'voices' directory exists voices_dir = './KOKORO/voices' if os.path.exists(voices_dir): shutil.rmtree(voices_dir) os.makedirs(voices_dir, exist_ok=True) # Get the list of all files files = list_repo_files(repo_id) # Filter files for the 'voices/' folder voice_files = [file.replace("voices/", "") for file in files if file.startswith("voices/")] # Get current files in the 'voices' folder current_voice = os.listdir(voices_dir) # Identify files that need to be downloaded download_voice = [file for file in voice_files if file not in current_voice] if download_voice: print(f"Files to download: {download_voice}") # Download each missing file for file in download_voice: file_path = hf_hub_download(repo_id=repo_id, filename=f"voices/{file}", cache_dir=cache_dir) target_path = os.path.join(voices_dir, file) shutil.copy(file_path, target_path) print(f"Downloaded: {file} to {target_path}") # Call the function to execute the code get_voice_models() # Check and download additional required files with caching kokoro_file = "kokoro-v0_19.pth" fp16_file = "fp16/kokoro-v0_19-half.pth" if kokoro_file not in os.listdir("./KOKORO/"): file_path = hf_hub_download(repo_id=repo_id, filename=kokoro_file, cache_dir=cache_dir) shutil.copy(file_path, os.path.join("./KOKORO/", kokoro_file)) print(f"Downloaded: {kokoro_file} to ./KOKORO/") if "fp16" not in os.listdir("./KOKORO/"): os.makedirs("./KOKORO/fp16", exist_ok=True) if os.path.basename(fp16_file) not in os.listdir("./KOKORO/fp16/"): file_path = hf_hub_download(repo_id=repo_id, filename=fp16_file, cache_dir=cache_dir) shutil.copy(file_path, os.path.join("./KOKORO/fp16/", os.path.basename(fp16_file))) print(f"Downloaded: {os.path.basename(fp16_file)} to ./KOKORO/fp16/") #For Windows one click run import os import platform def setup_batch_file(): # Check if the system is Windows if platform.system() == "Windows": # Check if 'run.bat' exists in the current folder if os.path.exists("run.bat"): print("'run.bat' already exists in the current folder.") else: # Content for run_app.bat bat_content_app = '''@echo off call myenv\\Scripts\\activate @python.exe app.py %* @pause ''' # Save the content to run_app.bat with open('run_app.bat', 'w') as bat_file: bat_file.write(bat_content_app) print("The 'run_app.bat' file has been created.") else: print("This system is not Windows. Batch file creation skipped.") # Run the setup function setup_batch_file() import torch import os from itertools import combinations def mix_all_voices(folder_path="./KOKORO/voices"): """Mix all pairs of voice models and save the new models.""" # Get the list of available voice packs available_voice_pack = [ os.path.splitext(filename)[0] for filename in os.listdir(folder_path) if filename.endswith('.pt') ] # Generate all unique pairs of voices voice_combinations = combinations(available_voice_pack, 2) # def mix_model(voice_1, voice_2, weight_1=0.6, weight_2=0.4): # """Mix two voice models with a weighted average and save the new model.""" # new_name = f"{voice_1}_mix_{voice_2}" # voice_id_1 = torch.load(f'{folder_path}/{voice_1}.pt', weights_only=True) # voice_id_2 = torch.load(f'{folder_path}/{voice_2}.pt', weights_only=True) # # Create the mixed model using a weighted average # mixed_voice = (weight_1 * voice_id_1) + (weight_2 * voice_id_2) # # Save the mixed model # torch.save(mixed_voice, f'{folder_path}/{new_name}.pt') # print(f"Created new voice model: {new_name}") # Function to mix two voices def mix_model(voice_1, voice_2): """Mix two voice models and save the new model.""" new_name = f"{voice_1}_mix_{voice_2}" voice_id_1 = torch.load(f'{folder_path}/{voice_1}.pt', weights_only=True) voice_id_2 = torch.load(f'{folder_path}/{voice_2}.pt', weights_only=True) # Create the mixed model by averaging the weights mixed_voice = torch.mean(torch.stack([voice_id_1, voice_id_2]), dim=0) # Save the mixed model torch.save(mixed_voice, f'{folder_path}/{new_name}.pt') print(f"Created new voice model: {new_name}") # Create mixed voices for each pair for voice_1, voice_2 in voice_combinations: print(f"Mixing {voice_1} ❤️ {voice_2}") mix_model(voice_1, voice_2) # Call the function to mix all voices mix_all_voices("./KOKORO/voices") def save_voice_names(directory="./KOKORO/voices", output_file="./voice_names.txt"): """ Retrieves voice names from a directory, sorts them by length, and saves to a file. Parameters: directory (str): Directory containing the voice files. output_file (str): File to save the sorted voice names. Returns: None """ # Get the list of voice names without file extensions voice_list = [ os.path.splitext(filename)[0] for filename in os.listdir(directory) if filename.endswith('.pt') ] # Sort the list based on the length of each name voice_list = sorted(voice_list, key=len) # Save the sorted list to the specified file with open(output_file, "w") as f: for voice_name in voice_list: f.write(f"{voice_name}\n") print(f"Voice names saved to {output_file}") save_voice_names()