File size: 8,237 Bytes
316049c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e92b0a
 
 
 
 
316049c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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!<br> [![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)