Spaces:
Running
Running
File size: 8,687 Bytes
643df07 ed6a17b 4644d21 a03fefd 22ac523 4644d21 efc306e a03fefd 4644d21 3d8e1f4 4644d21 3d8e1f4 a03fefd 3d8e1f4 4644d21 3d8e1f4 efc306e 3d8e1f4 efc306e 3d8e1f4 efc306e 20765d0 c5e2020 3d8e1f4 b94e79b 3d8e1f4 b94e79b 3d8e1f4 b94e79b 3d8e1f4 b94e79b 3d8e1f4 b94e79b c5e2020 b53f2d0 6f7d938 b53f2d0 6f7d938 b53f2d0 6f7d938 eebe326 b53f2d0 eebe326 d414b06 ed6a17b 7bae381 6f7d938 3d8e1f4 ed6a17b 3d8e1f4 6f7d938 643df07 3d8e1f4 4644d21 22ac523 ed6a17b eebe326 6a6e875 3d8e1f4 4644d21 3d8e1f4 b94e79b 4644d21 3d8e1f4 6f7d938 3d8e1f4 6f7d938 3d8e1f4 7bae381 6f7d938 3d8e1f4 4644d21 3d8e1f4 22ac523 4644d21 22ac523 |
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 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
import gradio as gr
import os, shutil
import subprocess, glob
from datetime import datetime
os.environ["rmvpe_root"] = "assets/rmvpe"
os.environ['index_root']="logs"
os.environ['weight_root']="assets/weights"
def convert(audio_picker,model_picker,index_picker,index_rate):
gr.Warning("Your audio is being converted. Please wait.")
now = datetime.now().strftime("%d%m%Y%H%M%S")
index_files = glob.glob(f"logs/{index_picker}/*.index")
if index_files:
print(f"Found index: {index_files[0]}")
else:
gr.Warning("Sorry, I couldn't find your .index file.")
print("Did not find a matching .index file")
index_files = [f'logs/{model_picker}/fake_index.index']
command = [
"python",
"tools/infer_cli.py",
"--f0up_key", "0",
"--input_path", f"audios/{audio_picker}",
"--index_path", index_files[0],
"--f0method", "rmvpe",
"--opt_path", f"audios/cli_output_{now}.wav",
"--model_name", f"{model_picker}",
"--index_rate", str(float(index_rate)),
"--device", "cpu",
"--filter_radius", "3",
"--resample_sr", "0",
"--rms_mix_rate", "0.21",
"--protect", "0"
]
try:
process = subprocess.run(command, check=True)
print("Script executed successfully.")
return {"choices":show_available("audios"),"__type__":"update","value":f"cli_output_{now}.wav"},f"audios/cli_output_{now}.wav"
except subprocess.CalledProcessError as e:
print(f"Error: {e}")
return {"choices":show_available("audios"),"__type__":"update"}, None
assets_folder = "assets"
if not os.path.exists(assets_folder):
os.makedirs(assets_folder)
files = {
"rmvpe/rmvpe.pt":"https://huggingface.co/Rejekts/project/resolve/main/rmvpe.pt",
"hubert/hubert_base.pt":"https://huggingface.co/Rejekts/project/resolve/main/hubert_base.pt",
"pretrained_v2/D40k.pth":"https://huggingface.co/Rejekts/project/resolve/main/D40k.pth",
"pretrained_v2/G40k.pth":"https://huggingface.co/Rejekts/project/resolve/main/G40k.pth",
"pretrained_v2/f0D40k.pth":"https://huggingface.co/Rejekts/project/resolve/main/f0D40k.pth",
"pretrained_v2/f0G40k.pth":"https://huggingface.co/Rejekts/project/resolve/main/f0G40k.pth"
}
for file, link in files.items():
file_path = os.path.join(assets_folder, file)
if not os.path.exists(file_path):
try:
subprocess.run(['wget', link, '-O', file_path], check=True)
except subprocess.CalledProcessError as e:
print(f"Error downloading {file}: {e}")
def download_from_url(url, model):
if url == '':
return "URL cannot be left empty.", {"choices":show_available("assets/weights"),"__type__":"update"}
if model =='':
return "You need to name your model. For example: My-Model", {"choices":show_available("assets/weights"),"__type__":"update"}
url = url.strip()
zip_dirs = ["zips", "unzips"]
for directory in zip_dirs:
if os.path.exists(directory):
shutil.rmtree(directory)
os.makedirs("zips", exist_ok=True)
os.makedirs("unzips", exist_ok=True)
zipfile = model + '.zip'
zipfile_path = './zips/' + zipfile
try:
if "drive.google.com" in url:
subprocess.run(["gdown", url, "--fuzzy", "-O", zipfile_path])
elif "mega.nz" in url:
m = Mega()
m.download_url(url, './zips')
else:
subprocess.run(["wget", url, "-O", zipfile_path])
for filename in os.listdir("./zips"):
if filename.endswith(".zip"):
zipfile_path = os.path.join("./zips/",filename)
shutil.unpack_archive(zipfile_path, "./unzips", 'zip')
else:
return "No zipfile found.", {"choices":show_available("assets/weights"),"__type__":"update"}
for root, dirs, files in os.walk('./unzips'):
for file in files:
file_path = os.path.join(root, file)
if file.endswith(".index"):
os.mkdir(f'./logs/{model}')
shutil.copy2(file_path,f'./logs/{model}')
elif "G_" not in file and "D_" not in file and file.endswith(".pth"):
shutil.copy(file_path,f'./assets/weights/{model}.pth')
shutil.rmtree("zips")
shutil.rmtree("unzips")
return "Success.", {"choices":show_available("assets/weights"),"__type__":"update"}
except:
return "There's been an error.", {"choices":show_available("assets/weights"),"__type__":"update"}
def show_available(filepath,format=None):
if format:
print(f"Format: {format}")
files = []
for file in os.listdir(filepath):
if file.endswith(format):
print(f"Matches format: {file}")
files.append(file)
else:
print(f"Does not match format: {file}")
print(f"Matches: {files}")
if len(files) < 1:
return ['']
return files
if len(os.listdir(filepath)) < 1:
return ['']
return os.listdir(filepath)
def upload_file(file):
audio_formats = ['.wav', '.mp3', '.ogg', '.flac', '.aac']
print(file)
try:
_, ext = os.path.splitext(file.name)
filename = os.path.basename(file.name)
file_path = file.name
except AttributeError:
_, ext = os.path.splitext(file)
filename = os.path.basename(file)
file_path = file
if ext.lower() in audio_formats:
if os.path.exists(f'audios/{filename}'):
os.remove(f'audios/{filename}')
shutil.move(file_path,'audios')
else:
gr.Warning('File incompatible')
return {"choices":show_available('audios'),"__type__": "update","value":filename}
def refresh():
return {"choices":show_available("audios"),"__type__": "update"},{"choices":show_available("assets/weights",".pth"),"__type__": "update"},{"choices":show_available("logs"),"__type__": "update"}
def update_audio_player(choice):
return os.path.join("audios",choice)
with gr.Blocks() as app:
with gr.Row():
gr.HTML("")
with gr.Row():
with gr.Column():
with gr.Tabs():
with gr.TabItem("1.Choose a voice model:"):
model_picker = gr.Dropdown(label="Model: ",choices=show_available('assets/weights','.pth'),value=show_available('assets/weights','.pth')[0],interactive=True,placeholder="Choose a VOICE MODEL here")
index_picker = gr.Dropdown(label="Index:",interactive=True,choices=show_available('logs'),value=show_available('logs')[0],allow_custom_value=True)
with gr.TabItem("(Or download a model here)"):
with gr.Row():
url = gr.Textbox(label="Paste the URL here:",value="",placeholder="(i.e. https://huggingface.co/repo/model/resolve/main/model.zip)")
with gr.Row():
with gr.Column():
model_rename = gr.Textbox(placeholder="My-Model", label="Name your model:",value="")
with gr.Column():
download_button = gr.Button("Download")
download_button.click(fn=download_from_url,inputs=[url,model_rename],outputs=[url,model_picker])
with gr.TabItem("Advanced"):
index_rate = gr.Slider(label='Index Rate: ',minimum=0,maximum=1,value=0.66,step=0.01)
with gr.Row():
with gr.Tabs():
with gr.TabItem("2.Choose an audio file:"):
recorder = gr.Microphone(label="Record audio here...",type='filepath')
audio_picker = gr.Dropdown(label="",choices=show_available('audios'),value='',interactive=True)
recorder.stop_recording(upload_file, inputs=[recorder],outputs=[audio_picker])
with gr.TabItem("(Or upload a new file here)"):
dropbox = gr.Audio(label="Drop an audio here.",sources=['upload'], type="filepath")
dropbox.upload(fn=upload_file, inputs=[dropbox],outputs=[audio_picker])
audio_refresher = gr.Button("Refresh")
audio_refresher.click(fn=refresh,inputs=[],outputs=[audio_picker,model_picker,index_picker])
convert_button = gr.Button("Convert")
with gr.Row():
audio_player = gr.Audio()
audio_picker.change(fn=update_audio_player, inputs=[audio_picker],outputs=[audio_player])
convert_button.click(convert, inputs=[audio_picker,model_picker,index_picker,index_rate],outputs=[audio_picker,audio_player])
app.queue().launch() |