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 i18n = I18nAuto() now_dir = os.getcwd() sys.path.append(now_dir) pretraineds_custom_path = os.path.join( now_dir, "rvc", "pretraineds", "pretraineds_custom" ) if not os.path.exists(pretraineds_custom_path): os.makedirs(pretraineds_custom_path) def get_pretrained_list(suffix): return [ os.path.join(dirpath, filename) for dirpath, _, filenames in os.walk(pretraineds_custom_path) 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"}, ) def run_train( 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, ): core = os.path.join("core.py") command = [ "python", core, "train", str(model_name), str(rvc_version), str(save_every_epoch), str(save_only_latest), str(save_every_weights), str(total_epoch), str(sampling_rate), str(batch_size), str(gpu), str(pitch_guidance), str(pretrained), str(custom_pretrained), str(g_pretrained_path), str(d_pretrained_path), ] subprocess.run(command) 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, 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 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.Textbox( label=i18n("Dataset Path"), placeholder=i18n("Enter dataset path"), 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, [ 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"} 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], )