import gradio as gr from rvc_infer import infer_audio import os import re import random from scipy.io.wavfile import write from scipy.io.wavfile import read import numpy as np import yt_dlp import subprocess import zipfile import shutil import urllib print("downloading RVC models") os.system("python dowoad_param.py") BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) rvc_models_dir = os.path.join(BASE_DIR, 'models') def get_current_models(models_dir): models_list = os.listdir(models_dir) items_to_remove = ['hubert_base.pt', 'MODELS.txt', 'public_models.json', 'rmvpe.pt'] return [item for item in models_list if item not in items_to_remove] def update_models_list(): models_l = get_current_models(rvc_models_dir) return gr.update(choices=models_l) def extract_zip(extraction_folder, zip_name): os.makedirs(extraction_folder) with zipfile.ZipFile(zip_name, 'r') as zip_ref: zip_ref.extractall(extraction_folder) os.remove(zip_name) index_filepath, model_filepath = None, None for root, dirs, files in os.walk(extraction_folder): for name in files: if name.endswith('.index') and os.stat(os.path.join(root, name)).st_size > 1024 * 100: index_filepath = os.path.join(root, name) if name.endswith('.pth') and os.stat(os.path.join(root, name)).st_size > 1024 * 1024 * 40: model_filepath = os.path.join(root, name) if not model_filepath: raise gr.Error(f'No .pth model file was found in the extracted zip. Please check {extraction_folder}.') # move model and index file to extraction folder os.rename(model_filepath, os.path.join(extraction_folder, os.path.basename(model_filepath))) if index_filepath: os.rename(index_filepath, os.path.join(extraction_folder, os.path.basename(index_filepath))) # remove any unnecessary nested folders for filepath in os.listdir(extraction_folder): if os.path.isdir(os.path.join(extraction_folder, filepath)): shutil.rmtree(os.path.join(extraction_folder, filepath)) def download_online_model(url, dir_name, progress=gr.Progress()): try: progress(0, desc=f'[~] Downloading voice model with name {dir_name}...') zip_name = url.split('/')[-1] extraction_folder = os.path.join(rvc_models_dir, dir_name) if os.path.exists(extraction_folder): raise gr.Error(f'Voice model directory {dir_name} already exists! Choose a different name for your voice model.') if 'pixeldrain.com' in url: url = f'https://pixeldrain.com/api/file/{zip_name}' urllib.request.urlretrieve(url, zip_name) progress(0.5, desc='[~] Extracting zip...') extract_zip(extraction_folder, zip_name) return f'[+] {dir_name} Model successfully downloaded!' except Exception as e: raise gr.Error(str(e)) def download_audio(url): ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': 'ytdl/%(title)s.%(ext)s', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'wav', 'preferredquality': '192', }], } with yt_dlp.YoutubeDL(ydl_opts) as ydl: info_dict = ydl.extract_info(url, download=True) file_path = ydl.prepare_filename(info_dict).rsplit('.', 1)[0] + '.wav' sample_rate, audio_data = read(file_path) audio_array = np.asarray(audio_data, dtype=np.int16) return sample_rate, audio_array CSS = """ """ with gr.Blocks(theme="Hev832/Applio", fill_width=True, css=CSS) as demo: gr.Markdown("# RVC INFER DEMOS ") gr.Markdown(f"# recommended using colab version with more feature!
[![Open In Collab](https://img.shields.io/badge/google_colab-F9AB00?style=flat-square&logo=googlecolab&logoColor=white)](https://colab.research.google.com/drive/1bM1LB2__WNFxX8pyZmUPQZYq7dg58YWG?usp=sharing) ") with gr.Tab("Inferenece"): gr.Markdown("in progress") model_name = gr.Dropdown(label='Voice Models', info='Models folder "rvc_infer --> models". After new models are added into this folder, click the refresh button') ref_btn = gr.Button('Refresh Models', variant='primary') input_audio = gr.Audio(label="Input Audio", type="filepath") with gr.Accordion("Settings", open=False): f0_change = gr.Slider(label="f0 change", minimum=-12, maximum=12, step=1, value=0) f0_method = gr.Dropdown(label="f0 method", choices=["rmvpe+", "rmvpe", "fcpe", " hybrid[rmvpe+fcpe]"], value="rmvpe+") min_pitch = gr.Textbox(label="min pitch", lines=1, value="-12") max_pitch = gr.Textbox(label="max pitch", lines=1, value="12") crepe_hop_length = gr.Slider(label="crepe_hop_length", minimum=0, maximum=256, step=1, value=128) index_rate = gr.Slider(label="index_rate", minimum=0, maximum=1.0, step=0.01, value=0.75) filter_radius = gr.Slider(label="filter_radius", minimum=0, maximum=10.0, step=0.01, value=3) rms_mix_rate = gr.Slider(label="rms_mix_rate", minimum=0, maximum=1.0, step=0.01, value=0.25) protect = gr.Slider(label="protect", minimum=0, maximum=1.0, step=0.01, value=0.33) with gr.Accordion("Advanced Settings", open=False): split_infer = gr.Checkbox(label="split_infer", value=False) min_silence = gr.Slider(label="min_silence", minimum=0, maximum=1000, step=1, value=500) silence_threshold = gr.Slider(label="silence_threshold", minimum=-1000, maximum=1000, step=1, value=-50) seek_step = gr.Slider(label="seek_step", minimum=0, maximum=100, step=1, value=0) keep_silence = gr.Slider(label="keep_silence", minimum=-1000, maximum=1000, step=1, value=100) do_formant = gr.Checkbox(label="do_formant", value=False) quefrency = gr.Slider(label="quefrency", minimum=0, maximum=100, step=1, value=0) timbre = gr.Slider(label="timbre", minimum=0, maximum=100, step=1, value=1) f0_autotune = gr.Checkbox(label="f0_autotune", value=False) audio_format = gr.Dropdown(label="audio_format", choices=["wav"], value="wav", visible=False) resample_sr = gr.Slider(label="resample_sr", minimum=0, maximum=100, step=1, value=0) hubert_model_path = gr.Textbox(label="hubert_model_path", lines=1, value="hubert_base.pt", visible=False) rmvpe_model_path = gr.Textbox(label="rmvpe_model_path", lines=1, value="rmvpe.pt", visible=False) fcpe_model_path = gr.Textbox(label="fcpe_model_path", lines=1, value="fcpe.pt", visible=False) submit_inference = gr.Button('Inference', variant='primary') result_audio = gr.Audio("Output Audio") with gr.Tab("Download Model"): gr.Markdown("## Download Model for infernece") url_input = gr.Textbox(label="Model URL", placeholder="Enter the URL of the model") dir_name_input = gr.Textbox(label="Directory Name", placeholder="Enter the directory name") output = gr.Textbox(label="Output Models") download_button = gr.Button("Download Model") download_button.click(download_online_model, inputs=[url_input, dir_name_input], outputs=output) with gr.Tab(" Credits"): gr.Markdown( """ this project made by [Blane187](https://huggingface.co/Blane187) with Improvements by [John6666](https://huggingfce.co/John6666) """) ref_btn.click(update_models_list, None, outputs=model_name) gr.on( triggers=[submit_inference.click], fn=infer_audio, inputs=[model_name, input_audio, f0_change, f0_method, min_pitch, max_pitch, crepe_hop_length, index_rate, filter_radius, rms_mix_rate, protect, split_infer, min_silence, silence_threshold, seek_step, keep_silence, do_formant, quefrency, timbre, f0_autotune, audio_format, resample_sr, hubert_model_path, rmvpe_model_path, fcpe_model_path], outputs=[result_audio], queue=True, show_api=True, show_progress="full", ) demo.queue() demo.launch(debug=True,share=True,show_api=False)