Spaces:
Build error
Build error
import os | |
import shutil | |
import sys | |
import warnings | |
import platform | |
import psutil | |
import signal | |
import site | |
import traceback | |
import torch | |
import gradio as gr | |
from subprocess import Popen | |
from config import python_exec, is_share, webui_port_main | |
from tools.i18n.i18n import I18nAuto | |
from tools import my_utils | |
from multiprocessing import cpu_count | |
now_dir = os.getcwd() | |
sys.path.insert(0, now_dir) | |
warnings.filterwarnings("ignore") | |
torch.manual_seed(233333) | |
tmp = os.path.join(now_dir, "TEMP") | |
os.makedirs(tmp, exist_ok=True) | |
os.environ["TEMP"] = tmp | |
if(os.path.exists(tmp)): | |
for name in os.listdir(tmp): | |
if(name=="jieba.cache"):continue | |
path="%s/%s"%(tmp,name) | |
delete=os.remove if os.path.isfile(path) else shutil.rmtree | |
try: | |
delete(path) | |
except Exception as e: | |
print(str(e)) | |
pass | |
import site | |
site_packages_roots = [] | |
for path in site.getsitepackages(): | |
if "packages" in path: | |
site_packages_roots.append(path) | |
if(site_packages_roots==[]):site_packages_roots=["%s/runtime/Lib/site-packages" % now_dir] | |
#os.environ["OPENBLAS_NUM_THREADS"] = "4" | |
os.environ["no_proxy"] = "localhost, 127.0.0.1, ::1" | |
os.environ["all_proxy"] = "" | |
for site_packages_root in site_packages_roots: | |
if os.path.exists(site_packages_root): | |
try: | |
with open("%s/users.pth" % (site_packages_root), "w") as f: | |
f.write( | |
"%s\n%s/tools\n%s/tools/damo_asr\n%s/GPT_SoVITS\n%s/tools/uvr5" | |
% (now_dir, now_dir, now_dir, now_dir, now_dir) | |
) | |
break | |
except PermissionError: | |
pass | |
i18n = I18nAuto() | |
# os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 当遇到mps不支持的步骤时使用cpu | |
n_cpu=cpu_count() | |
ngpu = torch.cuda.device_count() | |
gpu_infos = [] | |
mem = [] | |
if_gpu_ok = False | |
if if_gpu_ok and len(gpu_infos) > 0: | |
gpu_info = "\n".join(gpu_infos) | |
default_batch_size = min(mem) // 2 | |
else: | |
gpu_info = ("%s\t%s" % ("0", "CPU")) | |
gpu_infos.append("%s\t%s" % ("0", "CPU")) | |
default_batch_size = psutil.virtual_memory().total/ 1024 / 1024 / 1024 / 2 | |
gpus = "-".join([i[0] for i in gpu_infos]) | |
p_label=None | |
p_uvr5=None | |
p_asr=None | |
p_denoise=None | |
p_tts_inference=None | |
def kill_proc_tree(pid, including_parent=True): | |
try: | |
parent = psutil.Process(pid) | |
except psutil.NoSuchProcess: | |
# Process already terminated | |
return | |
children = parent.children(recursive=True) | |
for child in children: | |
try: | |
os.kill(child.pid, signal.SIGTERM) # or signal.SIGKILL | |
except OSError: | |
pass | |
if including_parent: | |
try: | |
os.kill(parent.pid, signal.SIGTERM) # or signal.SIGKILL | |
except OSError: | |
pass | |
system=platform.system() | |
def kill_process(pid): | |
if(system=="Windows"): | |
cmd = "taskkill /t /f /pid %s" % pid | |
os.system(cmd) | |
else: | |
kill_proc_tree(pid) | |
ps_slice=[] | |
def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): | |
global ps_slice | |
inp = my_utils.clean_path(inp) | |
opt_root = my_utils.clean_path(opt_root) | |
if(os.path.exists(inp)==False): | |
yield "输入路径不存在",{"__type__":"update","visible":True},{"__type__":"update","visible":False} | |
return | |
if os.path.isfile(inp):n_parts=1 | |
elif os.path.isdir(inp):pass | |
else: | |
yield "输入路径存在但既不是文件也不是文件夹",{"__type__":"update","visible":True},{"__type__":"update","visible":False} | |
return | |
if (ps_slice == []): | |
for i_part in range(n_parts): | |
cmd = '"%s" tools/slice_audio.py "%s" "%s" %s %s %s %s %s %s %s %s %s''' % (python_exec,inp, opt_root, threshold, min_length, min_interval, hop_size, max_sil_kept, _max, alpha, i_part, n_parts) | |
print(cmd) | |
p = Popen(cmd, shell=True) | |
ps_slice.append(p) | |
yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} | |
for p in ps_slice: | |
p.wait() | |
ps_slice=[] | |
yield "切割结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} | |
else: | |
yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} | |
def close_slice(): | |
global ps_slice | |
if (ps_slice != []): | |
for p_slice in ps_slice: | |
try: | |
kill_process(p_slice.pid) | |
except: | |
traceback.print_exc() | |
ps_slice=[] | |
return "已终止所有切割进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} | |
with gr.Blocks(title="GPT-SoVITS WebUI") as app: | |
gr.Markdown( | |
value= | |
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.") | |
) | |
gr.Markdown( | |
value= | |
i18n("中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e") | |
) | |
with gr.Tabs(): | |
with gr.TabItem(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标 | |
gr.Markdown(value=i18n("0b-语音切分工具")) | |
with gr.Row(): | |
with gr.Row(): | |
slice_inp_path=gr.Textbox(label=i18n("音频自动切分输入路径,可文件可文件夹"),value="") | |
slice_opt_root=gr.Textbox(label=i18n("切分后的子音频的输出根目录"),value="output/slicer_opt") | |
threshold=gr.Textbox(label=i18n("threshold:音量小于这个值视作静音的备选切割点"),value="-34") | |
min_length=gr.Textbox(label=i18n("min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值"),value="4000") | |
min_interval=gr.Textbox(label=i18n("min_interval:最短切割间隔"),value="300") | |
hop_size=gr.Textbox(label=i18n("hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)"),value="10") | |
max_sil_kept=gr.Textbox(label=i18n("max_sil_kept:切完后静音最多留多长"),value="500") | |
with gr.Row(): | |
open_slicer_button=gr.Button(i18n("开启语音切割"), variant="primary",visible=True) | |
close_slicer_button=gr.Button(i18n("终止语音切割"), variant="primary",visible=False) | |
_max=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("max:归一化后最大值多少"),value=0.9,interactive=True) | |
alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True) | |
n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True) | |
slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息")) | |
open_slicer_button.click(open_slice, [slice_inp_path, slice_opt_root, threshold, min_length, min_interval, hop_size, max_sil_kept, _max, alpha, n_process], [slicer_info, open_slicer_button, close_slicer_button]) | |
close_slicer_button.click(close_slice, [], [slicer_info, open_slicer_button, close_slicer_button]) | |
app.queue(concurrency_count=511, max_size=1022).launch( | |
server_name="0.0.0.0", | |
inbrowser=True, | |
share=is_share, | |
server_port=webui_port_main, | |
quiet=True, | |
) | |