|
import os |
|
import shutil |
|
import subprocess |
|
from mega import Mega |
|
import gradio as gr |
|
|
|
def download_from_url(url, model): |
|
try: |
|
model = model.replace('.pth', '').replace('.index', '').replace('.zip', '') |
|
url = url.replace('/blob/main/', '/resolve/main/').strip() |
|
|
|
for directory in ["downloads", "unzips", "zip"]: |
|
os.makedirs(directory, exist_ok=True) |
|
|
|
if url.endswith('.pth'): |
|
subprocess.run(["wget", url, "-O", f'assets/weights/{model}.pth']) |
|
elif url.endswith('.index'): |
|
os.makedirs(f'logs/{model}', exist_ok=True) |
|
subprocess.run(["wget", url, "-O", f'logs/{model}/added_{model}.index']) |
|
elif url.endswith('.zip'): |
|
subprocess.run(["wget", url, "-O", f'downloads/{model}.zip']) |
|
else: |
|
if "drive.google.com" in url: |
|
url = url.split('/')[0] |
|
subprocess.run(["gdown", url, "--fuzzy", "-O", f'downloads/{model}']) |
|
elif "mega.nz" in url: |
|
Mega().download_url(url, 'downloads') |
|
else: |
|
subprocess.run(["wget", url, "-O", f'downloads/{model}']) |
|
|
|
downloaded_file = next((f for f in os.listdir("downloads")), None) |
|
if downloaded_file: |
|
if downloaded_file.endswith(".zip"): |
|
shutil.unpack_archive(f'downloads/{downloaded_file}', "unzips", 'zip') |
|
for root, _, files in os.walk('unzips'): |
|
for file in files: |
|
file_path = os.path.join(root, file) |
|
if file.endswith(".index"): |
|
os.makedirs(f'logs/{model}', exist_ok=True) |
|
shutil.copy2(file_path, f'logs/{model}') |
|
elif file.endswith(".pth") and "G_" not in file and "D_" not in file: |
|
shutil.copy(file_path, f'assets/weights/{model}.pth') |
|
elif downloaded_file.endswith(".pth"): |
|
shutil.copy(f'downloads/{downloaded_file}', f'assets/weights/{model}.pth') |
|
elif downloaded_file.endswith(".index"): |
|
os.makedirs(f'logs/{model}', exist_ok=True) |
|
shutil.copy(f'downloads/{downloaded_file}', f'logs/{model}/added_{model}.index') |
|
else: |
|
return "Failed to download file" |
|
return f"Successfully downloaded {model} voice models" |
|
except Exception as e: |
|
return f"Error: {str(e)}" |
|
finally: |
|
shutil.rmtree("downloads", ignore_errors=True) |
|
shutil.rmtree("unzips", ignore_errors=True) |
|
shutil.rmtree("zip", ignore_errors=True) |
|
|
|
def listen_to_model(model_path, index_path, pitch, input_path, f0_method, save_as, index_rate, volume_normalization, consonant_protection): |
|
if not os.path.exists(model_path): |
|
return "Model path not found" |
|
if not os.path.exists(index_path): |
|
return f"{index_path} was not found" |
|
if not os.path.exists(input_path): |
|
return f"{input_path} was not found" |
|
|
|
os.environ['index_root'] = os.path.dirname(index_path) |
|
index_path = os.path.basename(index_path) |
|
model_name = os.path.basename(model_path) |
|
os.environ['weight_root'] = os.path.dirname(model_path) |
|
|
|
try: |
|
command = [ |
|
"python", "tools/infer_cli.py", |
|
"--f0up_key", str(pitch), |
|
"--input_path", input_path, |
|
"--index_path", index_path, |
|
"--f0method", f0_method, |
|
"--opt_path", save_as, |
|
"--model_name", model_name, |
|
"--index_rate", str(index_rate), |
|
"--device", "cuda:0", |
|
"--is_half", "True", |
|
"--filter_radius", "3", |
|
"--resample_sr", "0", |
|
"--rms_mix_rate", str(volume_normalization), |
|
"--protect", str(consonant_protection) |
|
] |
|
subprocess.run(command, check=True) |
|
return save_as |
|
except subprocess.CalledProcessError as e: |
|
return f"Error: {str(e)}" |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# RVC V2 Web UI") |
|
|
|
with gr.Tabs(): |
|
with gr.TabItem("Download Model"): |
|
gr.Markdown("### Download RVC Model") |
|
url_input = gr.Textbox(label="Model URL", placeholder="Enter the model URL here") |
|
model_input = gr.Textbox(label="Model Name", placeholder="Enter the model name here") |
|
download_button = gr.Button("Download") |
|
download_output = gr.Textbox(label="Download Status") |
|
download_button.click(download_from_url, inputs=[url_input, model_input], outputs=download_output) |
|
|
|
with gr.TabItem("Listen to Model"): |
|
gr.Markdown("### Listen to Your Model") |
|
model_path_input = gr.Textbox(label="Model Path", value="/content/RVC/assets/weights/Sonic.pth") |
|
index_path_input = gr.Textbox(label="Index Path", value="/content/RVC/logs/Sonic/added_IVF905_Flat_nprobe_1_Sonic_v2.index") |
|
input_path_input = gr.Textbox(label="Input Audio Path", value="/content/RVC/audios/astronauts.mp3") |
|
save_as_input = gr.Textbox(label="Save Output As", value="/content/RVC/audios/cli_output.wav") |
|
f0_method_input = gr.Radio(label="F0 Method", choices=["rmvpe", "pm", "harvest"], value="rmvpe") |
|
|
|
with gr.Row(): |
|
pitch_input = gr.Slider(label="Pitch", minimum=-12, maximum=12, step=1, value=0) |
|
index_rate_input = gr.Slider(label="Index Rate", minimum=0, maximum=1, step=0.01, value=0.5) |
|
volume_normalization_input = gr.Slider(label="Volume Normalization", minimum=0, maximum=1, step=0.01, value=0) |
|
consonant_protection_input = gr.Slider(label="Consonant Protection", minimum=0, maximum=1, step=0.01, value=0.5) |
|
|
|
listen_button = gr.Button("Generate and Listen") |
|
audio_output = gr.Audio(label="Output Audio") |
|
listen_button.click( |
|
listen_to_model, |
|
inputs=[ |
|
model_path_input, |
|
index_path_input, |
|
pitch_input, |
|
input_path_input, |
|
f0_method_input, |
|
save_as_input, |
|
index_rate_input, |
|
volume_normalization_input, |
|
consonant_protection_input |
|
], |
|
outputs=audio_output |
|
) |
|
|
|
demo.launch() |
|
|