From 7cb00eac17866bed1c59f206bb1701f2ce9f1dcf Mon Sep 17 00:00:00 2001 From: Karasukaigan <80465610+Karasukaigan@users.noreply.github.com> Date: Sun, 4 May 2025 18:28:43 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=90=8E=E4=BB=85=E5=85=81=E8=AE=B8=E6=9C=AC=E6=9C=BA=E8=AE=BF?= =?UTF-8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在`config.py`新增`local_mode`本地模式开关,默认关闭,启用后服务仅限本机访问(127.0.0.1或localhost),可以提升开发调试时的安全性。 --- config.py | 3 +++ webui.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config.py b/config.py index 5f90c5cd..fe0bf4d1 100644 --- a/config.py +++ b/config.py @@ -30,6 +30,9 @@ webui_port_subfix = 9871 api_port = 9880 +# 设置为True可启用本地模式,该模式只允许本机访问,避免出现潜在安全问题。默认为False。 +local_mode = False + if infer_device == "cuda": gpu_name = torch.cuda.get_device_name(0) if ( diff --git a/webui.py b/webui.py index cddbb029..edaeafe8 100644 --- a/webui.py +++ b/webui.py @@ -74,6 +74,7 @@ from config import ( webui_port_main, webui_port_subfix, webui_port_uvr5, + local_mode, ) from tools import my_utils from tools.i18n.i18n import I18nAuto, scan_language_list @@ -1955,7 +1956,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: gr.Markdown(value=i18n("施工中,请静候佳音")) app.queue().launch( # concurrency_count=511, max_size=1022 - server_name="0.0.0.0", + server_name="127.0.0.1" if local_mode else "0.0.0.0", inbrowser=True, share=is_share, server_port=webui_port_main, From e58426d23b177d712dce141ed108221cca6f1d0a Mon Sep 17 00:00:00 2001 From: Karasukaigan <80465610+Karasukaigan@users.noreply.github.com> Date: Sun, 4 May 2025 19:05:11 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=90=8E=E4=BB=85=E5=85=81=E8=AE=B8=E6=9C=AC=E6=9C=BA=E8=AE=BF?= =?UTF-8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在`config.py`新增`local_mode`本地模式开关,默认关闭,启用后服务仅限本机访问(127.0.0.1或localhost),可以提升开发调试时的安全性。 --- GPT_SoVITS/inference_webui.py | 4 +++- tools/subfix_webui.py | 3 ++- tools/uvr5/webui.py | 3 ++- webui.py | 5 +++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py index 4bee27cd..ae3b4036 100644 --- a/GPT_SoVITS/inference_webui.py +++ b/GPT_SoVITS/inference_webui.py @@ -91,6 +91,8 @@ infer_ttswebui = os.environ.get("infer_ttswebui", 9872) infer_ttswebui = int(infer_ttswebui) is_share = os.environ.get("is_share", "False") is_share = eval(is_share) +local_mode = os.environ.get("local_mode", "False") +local_mode = eval(local_mode) if "_CUDA_VISIBLE_DEVICES" in os.environ: os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"] is_half = eval(os.environ.get("is_half", "True")) and torch.cuda.is_available() @@ -1273,7 +1275,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: if __name__ == "__main__": app.queue().launch( # concurrency_count=511, max_size=1022 - server_name="0.0.0.0", + server_name="127.0.0.1" if local_mode else "0.0.0.0", inbrowser=True, share=is_share, server_port=infer_ttswebui, diff --git a/tools/subfix_webui.py b/tools/subfix_webui.py index eae1c980..faaf0238 100644 --- a/tools/subfix_webui.py +++ b/tools/subfix_webui.py @@ -298,6 +298,7 @@ if __name__ == "__main__": parser.add_argument("--json_key_text", default="text", help="the text key name in json, Default: text") parser.add_argument("--json_key_path", default="wav_path", help="the path key name in json, Default: wav_path") parser.add_argument("--g_batch", default=10, help="max number g_batch wav to display, Default: 10") + parser.add_argument("--local_mode", action="store_true", help="enable local mode (bind to 127.0.0.1)") args = parser.parse_args() @@ -407,7 +408,7 @@ if __name__ == "__main__": ) demo.launch( - server_name="0.0.0.0", + server_name="127.0.0.1" if args.local_mode else "0.0.0.0", inbrowser=True, # quiet=True, share=eval(args.is_share), diff --git a/tools/uvr5/webui.py b/tools/uvr5/webui.py index a3d7fe46..66b0d267 100644 --- a/tools/uvr5/webui.py +++ b/tools/uvr5/webui.py @@ -32,6 +32,7 @@ device = sys.argv[1] is_half = eval(sys.argv[2]) webui_port_uvr5 = int(sys.argv[3]) is_share = eval(sys.argv[4]) +local_mode = sys.argv[5].lower() == 'true' if len(sys.argv) > 5 else False def html_left(text, label="p"): @@ -220,7 +221,7 @@ with gr.Blocks(title="UVR5 WebUI") as app: api_name="uvr_convert", ) app.queue().launch( # concurrency_count=511, max_size=1022 - server_name="0.0.0.0", + server_name="127.0.0.1" if local_mode else "0.0.0.0", inbrowser=True, share=is_share, server_port=webui_port_uvr5, diff --git a/webui.py b/webui.py index edaeafe8..6b9a8951 100644 --- a/webui.py +++ b/webui.py @@ -389,6 +389,8 @@ def change_label(path_list): webui_port_subfix, is_share, ) + if local_mode: + cmd += " --local_mode" yield ( process_info(process_name_subfix, "opened"), {"__type__": "update", "visible": False}, @@ -413,6 +415,8 @@ def change_uvr5(): global p_uvr5 if p_uvr5 is None: cmd = '"%s" tools/uvr5/webui.py "%s" %s %s %s' % (python_exec, infer_device, is_half, webui_port_uvr5, is_share) + if local_mode: + cmd += " True" yield ( process_info(process_name_uvr5, "opened"), {"__type__": "update", "visible": False}, @@ -451,6 +455,7 @@ def change_tts_inference(bert_path, cnhubert_base_path, gpu_number, gpt_path, so os.environ["is_half"] = str(is_half) os.environ["infer_ttswebui"] = str(webui_port_infer_tts) os.environ["is_share"] = str(is_share) + os.environ["local_mode"] = str(local_mode) yield ( process_info(process_name_tts, "opened"), {"__type__": "update", "visible": False}, From 9ebae35a7d03aefd55e8e5509bc66c910fc4a19a Mon Sep 17 00:00:00 2001 From: Karasukaigan <80465610+Karasukaigan@users.noreply.github.com> Date: Wed, 7 May 2025 21:30:04 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20#2354?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复了因tts_infer.yaml中缺少version字段,导致version永远被设置为“v2”的问题。 --- GPT_SoVITS/TTS_infer_pack/TTS.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPT_SoVITS/TTS_infer_pack/TTS.py b/GPT_SoVITS/TTS_infer_pack/TTS.py index d20daee3..8caf1e16 100644 --- a/GPT_SoVITS/TTS_infer_pack/TTS.py +++ b/GPT_SoVITS/TTS_infer_pack/TTS.py @@ -287,8 +287,9 @@ class TTS_Config: configs: dict = self._load_configs(self.configs_path) assert isinstance(configs, dict) - version = configs.get("version", "v2").lower() - assert version in ["v1", "v2", "v3", "v4"] + version = "v2" + if "custom" in configs and configs["custom"]["version"].lower() in ["v1", "v2", "v3", "v4"]: + version = configs["custom"]["version"].lower() self.default_configs[version] = configs.get(version, self.default_configs[version]) self.configs: dict = configs.get("custom", deepcopy(self.default_configs[version])) From b122988be0a4c47d81a731dead738a0a75233d37 Mon Sep 17 00:00:00 2001 From: Karasukaigan <80465610+Karasukaigan@users.noreply.github.com> Date: Fri, 9 May 2025 03:24:50 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20#2354?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改`api.py`使其可以正常兼容v4模型。已经过测试,可以使用。 --- api.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/api.py b/api.py index 4b79d501..aa9a6668 100644 --- a/api.py +++ b/api.py @@ -176,9 +176,9 @@ import subprocess class DefaultRefer: def __init__(self, path, text, language): - self.path = args.default_refer_path - self.text = args.default_refer_text - self.language = args.default_refer_language + self.path = path + self.text = text + self.language = language def is_ready(self) -> bool: return is_full(self.path, self.text, self.language) @@ -294,11 +294,13 @@ from process_ckpt import get_sovits_version_from_path_fast, load_sovits_new def get_sovits_weights(sovits_path): path_sovits_v3 = "GPT_SoVITS/pretrained_models/s2Gv3.pth" - is_exist_s2gv3 = os.path.exists(path_sovits_v3) + path_sovits_v4 = "GPT_SoVITS/pretrained_models/gsv-v4-pretrained/s2Gv4.pth" version, model_version, if_lora_v3 = get_sovits_version_from_path_fast(sovits_path) - if if_lora_v3 == True and is_exist_s2gv3 == False: + if if_lora_v3 == True and not os.path.exists(path_sovits_v3): logger.info("SoVITS V3 底模缺失,无法加载相应 LoRA 权重") + if model_version == "v4" and not os.path.exists(path_sovits_v4): + logger.info("SoVITS V4 底模缺失,无法加载相应 LoRA 权重") dict_s2 = load_sovits_new(sovits_path) hps = dict_s2["config"] @@ -310,12 +312,13 @@ def get_sovits_weights(sovits_path): hps.model.version = "v1" else: hps.model.version = "v2" - if model_version == "v3": hps.model.version = "v3" + if model_version == "v4": + hps.model.version = "v4" model_params_dict = vars(hps.model) - if model_version != "v3": + if model_version != "v3" and model_version != "v4": vq_model = SynthesizerTrn( hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, @@ -342,10 +345,13 @@ def get_sovits_weights(sovits_path): else: vq_model = vq_model.to(device) vq_model.eval() - if if_lora_v3 == False: + if if_lora_v3 == False or model_version != "v4": vq_model.load_state_dict(dict_s2["weight"], strict=False) else: - vq_model.load_state_dict(load_sovits_new(path_sovits_v3)["weight"], strict=False) + if model_version == "v4": + vq_model.load_state_dict(load_sovits_new(path_sovits_v4)["weight"], strict=False) + else: + vq_model.load_state_dict(load_sovits_new(path_sovits_v3)["weight"], strict=False) lora_rank = dict_s2["lora_rank"] lora_config = LoraConfig( target_modules=["to_k", "to_q", "to_v", "to_out.0"], @@ -394,13 +400,11 @@ def change_gpt_sovits_weights(gpt_path, sovits_path): try: gpt = get_gpt_weights(gpt_path) sovits = get_sovits_weights(sovits_path) + speaker_list["default"] = Speaker(name="default", gpt=gpt, sovits=sovits) + return JSONResponse({"code": 0, "message": "Success"}, status_code=200) except Exception as e: return JSONResponse({"code": 400, "message": str(e)}, status_code=400) - - speaker_list["default"] = Speaker(name="default", gpt=gpt, sovits=sovits) - return JSONResponse({"code": 0, "message": "Success"}, status_code=200) - - + def get_bert_feature(text, word2ph): with torch.no_grad(): inputs = tokenizer(text, return_tensors="pt") @@ -759,7 +763,7 @@ def get_tts_wav( prompt_semantic = codes[0, 0] prompt = prompt_semantic.unsqueeze(0).to(device) - if version != "v3": + if version != "v3" and version != "v4": refers = [] if inp_refs: for path in inp_refs: @@ -811,7 +815,7 @@ def get_tts_wav( pred_semantic = pred_semantic[:, -idx:].unsqueeze(0) t3 = ttime() - if version != "v3": + if version != "v3" and version != "v4": audio = ( vq_model.decode(pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0), refers, speed=speed) .detach() @@ -880,7 +884,7 @@ def get_tts_wav( audio_opt = np.concatenate(audio_opt, 0) t4 = ttime() - sr = hps.data.sampling_rate if version != "v3" else 24000 + sr = hps.data.sampling_rate if version != "v3" and version != "v4" else 24000 if if_sr and sr == 24000: audio_opt = torch.from_numpy(audio_opt).float().to(device) audio_opt, sr = audio_sr(audio_opt.unsqueeze(0), sr) @@ -901,7 +905,7 @@ def get_tts_wav( if not stream_mode == "normal": if media_type == "wav": sr = 48000 if if_sr else 24000 - sr = hps.data.sampling_rate if version != "v3" else sr + sr = hps.data.sampling_rate if version != "v3" and version != "v4" else sr audio_bytes = pack_wav(audio_bytes, sr) yield audio_bytes.getvalue()