|
import os |
|
import subprocess |
|
import sys |
|
import gradio as gr |
|
from assets.i18n.i18n import I18nAuto |
|
from core import ( |
|
run_preprocess_script, |
|
run_extract_script, |
|
run_train_script, |
|
run_index_script, |
|
) |
|
from rvc.configs.config import max_vram_gpu, get_gpu_info |
|
from rvc.lib.utils import format_title |
|
|
|
i18n = I18nAuto() |
|
now_dir = os.getcwd() |
|
sys.path.append(now_dir) |
|
|
|
sup_audioext = { |
|
"wav", |
|
"mp3", |
|
"flac", |
|
"ogg", |
|
"opus", |
|
"m4a", |
|
"mp4", |
|
"aac", |
|
"alac", |
|
"wma", |
|
"aiff", |
|
"webm", |
|
"ac3", |
|
} |
|
|
|
|
|
pretraineds_custom_path = os.path.join( |
|
now_dir, "rvc", "pretraineds", "pretraineds_custom" |
|
) |
|
|
|
pretraineds_custom_path_relative = os.path.relpath(pretraineds_custom_path, now_dir) |
|
|
|
if not os.path.exists(pretraineds_custom_path_relative): |
|
os.makedirs(pretraineds_custom_path_relative) |
|
|
|
|
|
def get_pretrained_list(suffix): |
|
return [ |
|
os.path.join(dirpath, filename) |
|
for dirpath, _, filenames in os.walk(pretraineds_custom_path_relative) |
|
for filename in filenames |
|
if filename.endswith(".pth") and suffix in filename |
|
] |
|
|
|
|
|
pretraineds_list_d = get_pretrained_list("D") |
|
pretraineds_list_g = get_pretrained_list("G") |
|
|
|
|
|
def refresh_custom_pretraineds(): |
|
return ( |
|
{"choices": sorted(get_pretrained_list("G")), "__type__": "update"}, |
|
{"choices": sorted(get_pretrained_list("D")), "__type__": "update"}, |
|
) |
|
|
|
|
|
|
|
datasets_path = os.path.join(now_dir, "assets", "datasets") |
|
|
|
if not os.path.exists(datasets_path): |
|
os.makedirs(datasets_path) |
|
|
|
datasets_path_relative = os.path.relpath(datasets_path, now_dir) |
|
|
|
|
|
def get_datasets_list(): |
|
return [ |
|
dirpath |
|
for dirpath, _, filenames in os.walk(datasets_path_relative) |
|
if any(filename.endswith(tuple(sup_audioext)) for filename in filenames) |
|
] |
|
|
|
|
|
def refresh_datasets(): |
|
return {"choices": sorted(get_datasets_list()), "__type__": "update"} |
|
|
|
|
|
|
|
def save_drop_model(dropbox): |
|
if ".pth" not in dropbox: |
|
gr.Info( |
|
i18n( |
|
"The file you dropped is not a valid pretrained file. Please try again." |
|
) |
|
) |
|
else: |
|
file_name = os.path.basename(dropbox) |
|
pretrained_path = os.path.join(pretraineds_custom_path_relative, file_name) |
|
if os.path.exists(pretrained_path): |
|
os.remove(pretrained_path) |
|
os.rename(dropbox, pretrained_path) |
|
gr.Info( |
|
i18n( |
|
"Click the refresh button to see the pretrained file in the dropdown menu." |
|
) |
|
) |
|
return None |
|
|
|
|
|
|
|
def save_drop_dataset_audio(dropbox, dataset_name): |
|
if not dataset_name: |
|
gr.Info("Please enter a valid dataset name. Please try again.") |
|
return None, None |
|
else: |
|
file_extension = os.path.splitext(dropbox)[1][1:].lower() |
|
if file_extension not in sup_audioext: |
|
gr.Info("The file you dropped is not a valid audio file. Please try again.") |
|
else: |
|
dataset_name = format_title(dataset_name) |
|
audio_file = format_title(os.path.basename(dropbox)) |
|
dataset_path = os.path.join(now_dir, "assets", "datasets", dataset_name) |
|
if not os.path.exists(dataset_path): |
|
os.makedirs(dataset_path) |
|
destination_path = os.path.join(dataset_path, audio_file) |
|
if os.path.exists(destination_path): |
|
os.remove(destination_path) |
|
os.rename(dropbox, destination_path) |
|
gr.Info( |
|
i18n( |
|
"The audio file has been successfully added to the dataset. Please click the preprocess button." |
|
) |
|
) |
|
dataset_path = os.path.dirname(destination_path) |
|
relative_dataset_path = os.path.relpath(dataset_path, now_dir) |
|
|
|
return None, relative_dataset_path |
|
|
|
|
|
|
|
def train_tab(): |
|
with gr.Accordion(i18n("Preprocess")): |
|
with gr.Row(): |
|
with gr.Column(): |
|
model_name = gr.Textbox( |
|
label=i18n("Model Name"), |
|
placeholder=i18n("Enter model name"), |
|
value="my-project", |
|
interactive=True, |
|
) |
|
dataset_path = gr.Dropdown( |
|
label=i18n("Dataset Path"), |
|
|
|
choices=get_datasets_list(), |
|
allow_custom_value=True, |
|
interactive=True, |
|
) |
|
refresh_datasets_button = gr.Button(i18n("Refresh Datasets")) |
|
dataset_creator = gr.Checkbox( |
|
label=i18n("Dataset Creator"), |
|
value=False, |
|
interactive=True, |
|
visible=True, |
|
) |
|
|
|
with gr.Column(visible=False) as dataset_creator_settings: |
|
with gr.Accordion("Dataset Creator"): |
|
dataset_name = gr.Textbox( |
|
label=i18n("Dataset Name"), |
|
placeholder=i18n("Enter dataset name"), |
|
interactive=True, |
|
) |
|
upload_audio_dataset = gr.File( |
|
label=i18n("Upload Audio Dataset"), |
|
type="filepath", |
|
interactive=True, |
|
) |
|
|
|
with gr.Column(): |
|
sampling_rate = gr.Radio( |
|
label=i18n("Sampling Rate"), |
|
choices=["32000", "40000", "48000"], |
|
value="40000", |
|
interactive=True, |
|
) |
|
|
|
rvc_version = gr.Radio( |
|
label=i18n("RVC Version"), |
|
choices=["v1", "v2"], |
|
value="v2", |
|
interactive=True, |
|
) |
|
|
|
preprocess_output_info = gr.Textbox( |
|
label=i18n("Output Information"), |
|
value="", |
|
max_lines=8, |
|
interactive=False, |
|
) |
|
|
|
with gr.Row(): |
|
preprocess_button = gr.Button(i18n("Preprocess Dataset")) |
|
preprocess_button.click( |
|
run_preprocess_script, |
|
[model_name, dataset_path, sampling_rate], |
|
preprocess_output_info, |
|
api_name="preprocess_dataset", |
|
) |
|
|
|
with gr.Accordion(i18n("Extract")): |
|
with gr.Row(): |
|
hop_length = gr.Slider( |
|
1, 512, 128, step=1, label=i18n("Hop Length"), interactive=True |
|
) |
|
with gr.Row(): |
|
with gr.Column(): |
|
f0method = gr.Radio( |
|
label=i18n("Pitch extraction algorithm"), |
|
choices=["pm", "dio", "crepe", "crepe-tiny", "harvest", "rmvpe"], |
|
value="rmvpe", |
|
interactive=True, |
|
) |
|
|
|
extract_output_info = gr.Textbox( |
|
label=i18n("Output Information"), |
|
value="", |
|
max_lines=8, |
|
interactive=False, |
|
) |
|
extract_button = gr.Button(i18n("Extract Features")) |
|
extract_button.click( |
|
run_extract_script, |
|
[model_name, rvc_version, f0method, hop_length, sampling_rate], |
|
extract_output_info, |
|
api_name="extract_features", |
|
) |
|
|
|
with gr.Accordion(i18n("Train")): |
|
with gr.Row(): |
|
batch_size = gr.Slider( |
|
1, |
|
50, |
|
max_vram_gpu(0), |
|
step=1, |
|
label=i18n("Batch Size"), |
|
interactive=True, |
|
) |
|
save_every_epoch = gr.Slider( |
|
1, 100, 10, step=1, label=i18n("Save Every Epoch"), interactive=True |
|
) |
|
total_epoch = gr.Slider( |
|
1, 1000, 500, step=1, label=i18n("Total Epoch"), interactive=True |
|
) |
|
with gr.Row(): |
|
pitch_guidance = gr.Checkbox( |
|
label=i18n("Pitch Guidance"), value=True, interactive=True |
|
) |
|
pretrained = gr.Checkbox( |
|
label=i18n("Pretrained"), value=True, interactive=True |
|
) |
|
save_only_latest = gr.Checkbox( |
|
label=i18n("Save Only Latest"), value=False, interactive=True |
|
) |
|
save_every_weights = gr.Checkbox( |
|
label=i18n("Save Every Weights"), |
|
value=True, |
|
interactive=True, |
|
) |
|
custom_pretrained = gr.Checkbox( |
|
label=i18n("Custom Pretrained"), value=False, interactive=True |
|
) |
|
multiple_gpu = gr.Checkbox( |
|
label=i18n("GPU Settings"), value=False, interactive=True |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(visible=False) as pretrained_custom_settings: |
|
with gr.Accordion("Pretrained Custom Settings"): |
|
upload_pretrained = gr.File( |
|
label=i18n("Upload Pretrained Model"), |
|
type="filepath", |
|
interactive=True, |
|
) |
|
refresh_custom_pretaineds_button = gr.Button( |
|
i18n("Refresh Custom Pretraineds") |
|
) |
|
g_pretrained_path = gr.Dropdown( |
|
label=i18n("Custom Pretrained G"), |
|
choices=sorted(pretraineds_list_g), |
|
interactive=True, |
|
allow_custom_value=True, |
|
) |
|
d_pretrained_path = gr.Dropdown( |
|
label=i18n("Custom Pretrained D"), |
|
choices=sorted(pretraineds_list_d), |
|
interactive=True, |
|
allow_custom_value=True, |
|
) |
|
with gr.Column(visible=False) as gpu_custom_settings: |
|
with gr.Accordion("GPU Settings"): |
|
gpu = gr.Textbox( |
|
label=i18n("GPU Number"), |
|
placeholder=i18n("0 to ∞ separated by -"), |
|
value="0", |
|
interactive=True, |
|
) |
|
gr.Textbox( |
|
label=i18n("GPU Information"), |
|
value=get_gpu_info(), |
|
interactive=False, |
|
) |
|
|
|
with gr.Row(): |
|
train_output_info = gr.Textbox( |
|
label=i18n("Output Information"), |
|
value="", |
|
max_lines=8, |
|
interactive=False, |
|
) |
|
|
|
with gr.Row(): |
|
train_button = gr.Button(i18n("Start Training")) |
|
train_button.click( |
|
run_train_script, |
|
[ |
|
model_name, |
|
rvc_version, |
|
save_every_epoch, |
|
save_only_latest, |
|
save_every_weights, |
|
total_epoch, |
|
sampling_rate, |
|
batch_size, |
|
gpu, |
|
pitch_guidance, |
|
pretrained, |
|
custom_pretrained, |
|
g_pretrained_path, |
|
d_pretrained_path, |
|
], |
|
train_output_info, |
|
api_name="start_training", |
|
) |
|
|
|
index_button = gr.Button(i18n("Generate Index")) |
|
index_button.click( |
|
run_index_script, |
|
[model_name, rvc_version], |
|
train_output_info, |
|
api_name="generate_index", |
|
) |
|
|
|
def toggle_visible(checkbox): |
|
return {"visible": checkbox, "__type__": "update"} |
|
|
|
refresh_datasets_button.click( |
|
fn=refresh_datasets, |
|
inputs=[], |
|
outputs=[dataset_path], |
|
) |
|
|
|
dataset_creator.change( |
|
fn=toggle_visible, |
|
inputs=[dataset_creator], |
|
outputs=[dataset_creator_settings], |
|
) |
|
|
|
upload_audio_dataset.upload( |
|
fn=save_drop_dataset_audio, |
|
inputs=[upload_audio_dataset, dataset_name], |
|
outputs=[upload_audio_dataset, dataset_path], |
|
) |
|
|
|
custom_pretrained.change( |
|
fn=toggle_visible, |
|
inputs=[custom_pretrained], |
|
outputs=[pretrained_custom_settings], |
|
) |
|
|
|
refresh_custom_pretaineds_button.click( |
|
fn=refresh_custom_pretraineds, |
|
inputs=[], |
|
outputs=[g_pretrained_path, d_pretrained_path], |
|
) |
|
|
|
upload_pretrained.upload( |
|
fn=save_drop_model, |
|
inputs=[upload_pretrained], |
|
outputs=[upload_pretrained], |
|
) |
|
|
|
multiple_gpu.change( |
|
fn=toggle_visible, |
|
inputs=[multiple_gpu], |
|
outputs=[gpu_custom_settings], |
|
) |
|
|