Spaces:
Running
Running
| 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() | |