mirror of
https://github.com/RVC-Boss/GPT-SoVITS.git
synced 2025-10-07 07:14:52 +08:00
fixed some bugs, and add some checking
This commit is contained in:
parent
a71c1a8481
commit
f5c01be48f
@ -7,7 +7,8 @@ inp_wav_dir = os.environ.get("inp_wav_dir")
|
|||||||
exp_name = os.environ.get("exp_name")
|
exp_name = os.environ.get("exp_name")
|
||||||
i_part = os.environ.get("i_part")
|
i_part = os.environ.get("i_part")
|
||||||
all_parts = os.environ.get("all_parts")
|
all_parts = os.environ.get("all_parts")
|
||||||
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ.get("_CUDA_VISIBLE_DEVICES")
|
if "_CUDA_VISIBLE_DEVICES" in os.environ:
|
||||||
|
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
|
||||||
opt_dir = os.environ.get("opt_dir")
|
opt_dir = os.environ.get("opt_dir")
|
||||||
bert_pretrained_dir = os.environ.get("bert_pretrained_dir")
|
bert_pretrained_dir = os.environ.get("bert_pretrained_dir")
|
||||||
import torch
|
import torch
|
||||||
|
@ -6,7 +6,8 @@ inp_wav_dir= os.environ.get("inp_wav_dir")
|
|||||||
exp_name= os.environ.get("exp_name")
|
exp_name= os.environ.get("exp_name")
|
||||||
i_part= os.environ.get("i_part")
|
i_part= os.environ.get("i_part")
|
||||||
all_parts= os.environ.get("all_parts")
|
all_parts= os.environ.get("all_parts")
|
||||||
os.environ["CUDA_VISIBLE_DEVICES"]= os.environ.get("_CUDA_VISIBLE_DEVICES")
|
if "_CUDA_VISIBLE_DEVICES" in os.environ:
|
||||||
|
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
|
||||||
from feature_extractor import cnhubert
|
from feature_extractor import cnhubert
|
||||||
opt_dir= os.environ.get("opt_dir")
|
opt_dir= os.environ.get("opt_dir")
|
||||||
cnhubert.cnhubert_base_path= os.environ.get("cnhubert_base_dir")
|
cnhubert.cnhubert_base_path= os.environ.get("cnhubert_base_dir")
|
||||||
|
@ -4,7 +4,8 @@ inp_text = os.environ.get("inp_text")
|
|||||||
exp_name = os.environ.get("exp_name")
|
exp_name = os.environ.get("exp_name")
|
||||||
i_part = os.environ.get("i_part")
|
i_part = os.environ.get("i_part")
|
||||||
all_parts = os.environ.get("all_parts")
|
all_parts = os.environ.get("all_parts")
|
||||||
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ.get("_CUDA_VISIBLE_DEVICES")
|
if "_CUDA_VISIBLE_DEVICES" in os.environ:
|
||||||
|
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
|
||||||
opt_dir = os.environ.get("opt_dir")
|
opt_dir = os.environ.get("opt_dir")
|
||||||
pretrained_s2G = os.environ.get("pretrained_s2G")
|
pretrained_s2G = os.environ.get("pretrained_s2G")
|
||||||
s2config_path = os.environ.get("s2config_path")
|
s2config_path = os.environ.get("s2config_path")
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
import platform,os,traceback
|
import platform,os,traceback
|
||||||
import ffmpeg
|
import ffmpeg
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import gradio as gr
|
||||||
|
from i18n.i18n import I18nAuto
|
||||||
|
import pandas as pd
|
||||||
|
i18n = I18nAuto(language=os.environ.get('language','Auto'))
|
||||||
|
|
||||||
def load_audio(file, sr):
|
def load_audio(file, sr):
|
||||||
try:
|
try:
|
||||||
@ -20,7 +23,7 @@ def load_audio(file, sr):
|
|||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
raise RuntimeError(f"Failed to load audio: {e}")
|
raise RuntimeError(i18n("Failed to load audio:")+e)
|
||||||
|
|
||||||
return np.frombuffer(out, np.float32).flatten()
|
return np.frombuffer(out, np.float32).flatten()
|
||||||
|
|
||||||
@ -30,3 +33,75 @@ def clean_path(path_str:str):
|
|||||||
return clean_path(path_str[0:-1])
|
return clean_path(path_str[0:-1])
|
||||||
path_str = path_str.replace('/', os.sep).replace('\\', os.sep)
|
path_str = path_str.replace('/', os.sep).replace('\\', os.sep)
|
||||||
return path_str.strip(" ").strip('\'').strip("\n").strip('"').strip(" ").strip("\u202a")
|
return path_str.strip(" ").strip('\'').strip("\n").strip('"').strip(" ").strip("\u202a")
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_existance(file_list:list=None,is_train=False,is_dataset_processing=False):
|
||||||
|
files_status=[]
|
||||||
|
if is_train == True and file_list:
|
||||||
|
file_list.append(os.path.join(file_list[0],'2-name2text.txt'))
|
||||||
|
file_list.append(os.path.join(file_list[0],'3-bert'))
|
||||||
|
file_list.append(os.path.join(file_list[0],'4-cnhubert'))
|
||||||
|
file_list.append(os.path.join(file_list[0],'5-wav32k'))
|
||||||
|
file_list.append(os.path.join(file_list[0],'6-name2semantic.tsv'))
|
||||||
|
for file in file_list:
|
||||||
|
if os.path.exists(file):files_status.append(True)
|
||||||
|
else:files_status.append(False)
|
||||||
|
|
||||||
|
if sum(files_status)!=0:
|
||||||
|
if is_train:
|
||||||
|
for file,status in zip(file_list,files_status):
|
||||||
|
if status:pass
|
||||||
|
else:gr.Warning(file)
|
||||||
|
gr.Warning(i18n('以下文件或文件夹不存在:'))
|
||||||
|
elif is_dataset_processing:
|
||||||
|
if not files_status[0]:
|
||||||
|
gr.Warning(file_list[0])
|
||||||
|
if not files_status[1] and file_list[1]:
|
||||||
|
gr.Warning(file_list[1])
|
||||||
|
gr.Warning(i18n('以下文件或文件夹不存在:'))
|
||||||
|
else:
|
||||||
|
if file_list[0]:
|
||||||
|
gr.Warning(file_list[0])
|
||||||
|
gr.Warning(i18n('以下文件或文件夹不存在:'))
|
||||||
|
else:
|
||||||
|
gr.Warning(i18n('路径不能为空'))
|
||||||
|
|
||||||
|
def check_details(path_list=None,is_train=False,is_dataset_processing=False):
|
||||||
|
if is_dataset_processing:
|
||||||
|
list_path, audio_path = path_list
|
||||||
|
if (not list_path.endswith('.list')):
|
||||||
|
gr.Warning(i18n('请填入正确的list路径'))
|
||||||
|
return
|
||||||
|
if audio_path:
|
||||||
|
if not os.path.isdir(audio_path):
|
||||||
|
gr.Warning(i18n('请填入正确的音频文件夹路径'))
|
||||||
|
return
|
||||||
|
with open(list_path,"r",encoding="utf8")as f:
|
||||||
|
line=f.readline().strip("\n").split("\n")
|
||||||
|
wav_name, spk_name, language, text = line.split("|")
|
||||||
|
wav_name=clean_path(wav_name)
|
||||||
|
if (audio_path != "" and audio_path != None):
|
||||||
|
wav_name = os.path.basename(wav_name)
|
||||||
|
wav_path = "%s/%s"%(audio_path, wav_name)
|
||||||
|
else:
|
||||||
|
wav_path=wav_name
|
||||||
|
if os.path.exists(wav_path):
|
||||||
|
...
|
||||||
|
else:
|
||||||
|
gr.Warning(i18n('路径错误'))
|
||||||
|
if is_train:
|
||||||
|
path_list.append(os.path.join(path_list[0],'2-name2text.txt'))
|
||||||
|
path_list.append(os.path.join(path_list[0],'4-cnhubert'))
|
||||||
|
path_list.append(os.path.join(path_list[0],'5-wav32k'))
|
||||||
|
path_list.append(os.path.join(path_list[0],'6-name2semantic.tsv'))
|
||||||
|
phone_path, hubert_path, wav_path, semantic_path = path_list[1:]
|
||||||
|
with open(phone_path) as f:
|
||||||
|
if f.read(1):...
|
||||||
|
else:gr.Warning(i18n('缺少音素数据集'))
|
||||||
|
if os.listdir(hubert_path):...
|
||||||
|
else:gr.Warning(i18n('缺少Hubert数据集'))
|
||||||
|
if os.listdir(wav_path):...
|
||||||
|
else:gr.Warning(i18n('缺少音频数据集'))
|
||||||
|
df = pd.read_csv(semantic_path)
|
||||||
|
if len(pd) > 1:...
|
||||||
|
else:gr.Warning(i18n('缺少语义数据集'))
|
||||||
|
52
webui.py
52
webui.py
@ -56,7 +56,7 @@ language=sys.argv[-1] if sys.argv[-1] in scan_language_list() else "Auto"
|
|||||||
os.environ["language"]=language
|
os.environ["language"]=language
|
||||||
i18n = I18nAuto(language=language)
|
i18n = I18nAuto(language=language)
|
||||||
from scipy.io import wavfile
|
from scipy.io import wavfile
|
||||||
from tools.my_utils import load_audio
|
from tools.my_utils import load_audio, check_for_existance, check_details
|
||||||
from multiprocessing import cpu_count
|
from multiprocessing import cpu_count
|
||||||
# os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 当遇到mps不支持的步骤时使用cpu
|
# os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 当遇到mps不支持的步骤时使用cpu
|
||||||
try:
|
try:
|
||||||
@ -248,7 +248,7 @@ def open_asr(asr_inp_dir, asr_opt_dir, asr_model, asr_model_size, asr_lang, asr_
|
|||||||
if(p_asr==None):
|
if(p_asr==None):
|
||||||
asr_inp_dir=my_utils.clean_path(asr_inp_dir)
|
asr_inp_dir=my_utils.clean_path(asr_inp_dir)
|
||||||
asr_opt_dir=my_utils.clean_path(asr_opt_dir)
|
asr_opt_dir=my_utils.clean_path(asr_opt_dir)
|
||||||
check_for_exists([asr_inp_dir])
|
check_for_existance([asr_inp_dir])
|
||||||
cmd = f'"{python_exec}" tools/asr/{asr_dict[asr_model]["path"]}'
|
cmd = f'"{python_exec}" tools/asr/{asr_dict[asr_model]["path"]}'
|
||||||
cmd += f' -i "{asr_inp_dir}"'
|
cmd += f' -i "{asr_inp_dir}"'
|
||||||
cmd += f' -o "{asr_opt_dir}"'
|
cmd += f' -o "{asr_opt_dir}"'
|
||||||
@ -279,7 +279,7 @@ def open_denoise(denoise_inp_dir, denoise_opt_dir):
|
|||||||
if(p_denoise==None):
|
if(p_denoise==None):
|
||||||
denoise_inp_dir=my_utils.clean_path(denoise_inp_dir)
|
denoise_inp_dir=my_utils.clean_path(denoise_inp_dir)
|
||||||
denoise_opt_dir=my_utils.clean_path(denoise_opt_dir)
|
denoise_opt_dir=my_utils.clean_path(denoise_opt_dir)
|
||||||
check_for_exists([denoise_inp_dir])
|
check_for_existance([denoise_inp_dir])
|
||||||
cmd = '"%s" tools/cmd-denoise.py -i "%s" -o "%s" -p %s'%(python_exec,denoise_inp_dir,denoise_opt_dir,"float16"if is_half==True else "float32")
|
cmd = '"%s" tools/cmd-denoise.py -i "%s" -o "%s" -p %s'%(python_exec,denoise_inp_dir,denoise_opt_dir,"float16"if is_half==True else "float32")
|
||||||
|
|
||||||
yield "语音降噪任务开启:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
|
yield "语音降噪任务开启:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
|
||||||
@ -308,7 +308,8 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s
|
|||||||
data=json.loads(data)
|
data=json.loads(data)
|
||||||
s2_dir="%s/%s"%(exp_root,exp_name)
|
s2_dir="%s/%s"%(exp_root,exp_name)
|
||||||
os.makedirs("%s/logs_s2"%(s2_dir),exist_ok=True)
|
os.makedirs("%s/logs_s2"%(s2_dir),exist_ok=True)
|
||||||
check_for_exists([s2_dir],is_train=True)
|
check_for_existance([s2_dir],is_train=True)
|
||||||
|
check_details([s2_dir],is_train=True)
|
||||||
if(is_half==False):
|
if(is_half==False):
|
||||||
data["train"]["fp16_run"]=False
|
data["train"]["fp16_run"]=False
|
||||||
batch_size=max(1,batch_size//2)
|
batch_size=max(1,batch_size//2)
|
||||||
@ -355,7 +356,8 @@ def open1Bb(batch_size,total_epoch,exp_name,if_dpo,if_save_latest,if_save_every_
|
|||||||
data=yaml.load(data, Loader=yaml.FullLoader)
|
data=yaml.load(data, Loader=yaml.FullLoader)
|
||||||
s1_dir="%s/%s"%(exp_root,exp_name)
|
s1_dir="%s/%s"%(exp_root,exp_name)
|
||||||
os.makedirs("%s/logs_s1"%(s1_dir),exist_ok=True)
|
os.makedirs("%s/logs_s1"%(s1_dir),exist_ok=True)
|
||||||
check_for_exists([s1_dir],is_train=True)
|
check_for_existance([s1_dir],is_train=True)
|
||||||
|
check_details([s1_dir],is_train=True)
|
||||||
if(is_half==False):
|
if(is_half==False):
|
||||||
data["train"]["precision"]="32"
|
data["train"]["precision"]="32"
|
||||||
batch_size = max(1, batch_size // 2)
|
batch_size = max(1, batch_size // 2)
|
||||||
@ -400,7 +402,7 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k
|
|||||||
global ps_slice
|
global ps_slice
|
||||||
inp = my_utils.clean_path(inp)
|
inp = my_utils.clean_path(inp)
|
||||||
opt_root = my_utils.clean_path(opt_root)
|
opt_root = my_utils.clean_path(opt_root)
|
||||||
check_for_exists([inp])
|
check_for_existance([inp])
|
||||||
if(os.path.exists(inp)==False):
|
if(os.path.exists(inp)==False):
|
||||||
yield "输入路径不存在", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
yield "输入路径不存在", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||||
return
|
return
|
||||||
@ -439,7 +441,8 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
|
|||||||
global ps1a
|
global ps1a
|
||||||
inp_text = my_utils.clean_path(inp_text)
|
inp_text = my_utils.clean_path(inp_text)
|
||||||
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
||||||
check_for_exists([inp_text,inp_wav_dir], is_dataset_processing=True)
|
check_for_existance([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
|
check_details([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
if (ps1a == []):
|
if (ps1a == []):
|
||||||
opt_dir="%s/%s"%(exp_root,exp_name)
|
opt_dir="%s/%s"%(exp_root,exp_name)
|
||||||
config={
|
config={
|
||||||
@ -501,7 +504,8 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
|
|||||||
global ps1b
|
global ps1b
|
||||||
inp_text = my_utils.clean_path(inp_text)
|
inp_text = my_utils.clean_path(inp_text)
|
||||||
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
||||||
check_for_exists([inp_text,inp_wav_dir], is_dataset_processing=True)
|
check_for_existance([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
|
check_details([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
if (ps1b == []):
|
if (ps1b == []):
|
||||||
config={
|
config={
|
||||||
"inp_text":inp_text,
|
"inp_text":inp_text,
|
||||||
@ -549,7 +553,8 @@ ps1c=[]
|
|||||||
def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
||||||
global ps1c
|
global ps1c
|
||||||
inp_text = my_utils.clean_path(inp_text)
|
inp_text = my_utils.clean_path(inp_text)
|
||||||
check_for_exists([inp_text,''], is_dataset_processing=True)
|
check_for_existance([inp_text,''], is_dataset_processing=True)
|
||||||
|
check_details([inp_text,''], is_dataset_processing=True)
|
||||||
if (ps1c == []):
|
if (ps1c == []):
|
||||||
opt_dir="%s/%s"%(exp_root,exp_name)
|
opt_dir="%s/%s"%(exp_root,exp_name)
|
||||||
config={
|
config={
|
||||||
@ -608,7 +613,8 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
|||||||
global ps1abc
|
global ps1abc
|
||||||
inp_text = my_utils.clean_path(inp_text)
|
inp_text = my_utils.clean_path(inp_text)
|
||||||
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
inp_wav_dir = my_utils.clean_path(inp_wav_dir)
|
||||||
check_for_exists([inp_text,inp_wav_dir])
|
check_for_existance([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
|
check_details([inp_text,inp_wav_dir], is_dataset_processing=True)
|
||||||
if (ps1abc == []):
|
if (ps1abc == []):
|
||||||
opt_dir="%s/%s"%(exp_root,exp_name)
|
opt_dir="%s/%s"%(exp_root,exp_name)
|
||||||
try:
|
try:
|
||||||
@ -745,32 +751,6 @@ def switch_version(version_):
|
|||||||
gr.Warning(i18n(f'未下载{version.upper()}模型'))
|
gr.Warning(i18n(f'未下载{version.upper()}模型'))
|
||||||
return {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2].replace("s2G","s2D")}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}
|
return {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2].replace("s2G","s2D")}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}
|
||||||
|
|
||||||
def check_for_exists(file_list=None,is_train=False,is_dataset_processing=False):
|
|
||||||
missing_files=[]
|
|
||||||
if is_train == True and file_list:
|
|
||||||
file_list.append(os.path.join(file_list[0],'2-name2text.txt'))
|
|
||||||
file_list.append(os.path.join(file_list[0],'3-bert'))
|
|
||||||
file_list.append(os.path.join(file_list[0],'4-cnhubert'))
|
|
||||||
file_list.append(os.path.join(file_list[0],'5-wav32k'))
|
|
||||||
file_list.append(os.path.join(file_list[0],'6-name2semantic.tsv'))
|
|
||||||
for file in file_list:
|
|
||||||
if os.path.exists(file):pass
|
|
||||||
else:missing_files.append(file)
|
|
||||||
if missing_files:
|
|
||||||
if is_train:
|
|
||||||
for missing_file in missing_files:
|
|
||||||
if missing_file != '':
|
|
||||||
gr.Warning(missing_file)
|
|
||||||
gr.Warning(i18n('以下文件或文件夹不存在:'))
|
|
||||||
else:
|
|
||||||
for missing_file in missing_files:
|
|
||||||
if missing_file != '':
|
|
||||||
gr.Warning(missing_file)
|
|
||||||
if file_list[-1]==[''] and is_dataset_processing:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
gr.Warning(i18n('以下文件或文件夹不存在:'))
|
|
||||||
|
|
||||||
if os.path.exists('GPT_SoVITS/text/G2PWModel'):...
|
if os.path.exists('GPT_SoVITS/text/G2PWModel'):...
|
||||||
else:
|
else:
|
||||||
cmd = '"%s" GPT_SoVITS/download.py'%python_exec
|
cmd = '"%s" GPT_SoVITS/download.py'%python_exec
|
||||||
|
Loading…
x
Reference in New Issue
Block a user