From 3853bd6ccf5be137c7aa4734a728be5353825da3 Mon Sep 17 00:00:00 2001 From: wataru <wataru@fdev.local.com> Date: Wed, 19 Apr 2023 03:35:04 +0900 Subject: [PATCH] refactoring --- server/MMVCServerSIO.py | 216 ++++++------------ server/const.py | 16 +- .../voice_changer/SoVitsSvc40/SoVitsSvc40.py | 25 +- 3 files changed, 83 insertions(+), 174 deletions(-) diff --git a/server/MMVCServerSIO.py b/server/MMVCServerSIO.py index 35308465..e95b4cc7 100755 --- a/server/MMVCServerSIO.py +++ b/server/MMVCServerSIO.py @@ -9,24 +9,18 @@ import platform import os import argparse import uvicorn -import webbrowser from mods.ssl import create_self_signed_cert from voice_changer.VoiceChangerManager import VoiceChangerManager from sio.MMVC_SocketIOApp import MMVC_SocketIOApp from restapi.MMVC_Rest import MMVC_Rest -from const import NATIVE_CLIENT_FILE_MAC, NATIVE_CLIENT_FILE_WIN, SSL_KEY_DIR, setModelType +from const import NATIVE_CLIENT_FILE_MAC, NATIVE_CLIENT_FILE_WIN, SSL_KEY_DIR import subprocess import multiprocessing as mp def setupArgParser(): parser = argparse.ArgumentParser() - parser.add_argument("-t", type=str, default="MMVC", - help="Server type. MMVC|TRAIN") parser.add_argument("-p", type=int, default=18888, help="port") - parser.add_argument("-c", type=str, help="path for the config.json") - parser.add_argument("-m", type=str, help="path for the model file") - parser.add_argument("-o", type=str, help="path for the onnx model file") parser.add_argument("--https", type=strtobool, default=False, help="use https") parser.add_argument("--httpsKey", type=str, @@ -35,18 +29,8 @@ def setupArgParser(): default="ssl.cert", help="path for the cert of https") parser.add_argument("--httpsSelfSigned", type=strtobool, default=True, help="generate self-signed certificate") - parser.add_argument("--colab", type=strtobool, - default=False, help="run on colab") - parser.add_argument("--modelType", type=str, - default="MMVCv15", help="model type: MMVCv13, MMVCv15, so-vits-svc-40, so-vits-svc-40v2") - parser.add_argument("--cluster", type=str, help="path to cluster model") - parser.add_argument("--internal", type=strtobool, default=False, help="各種パスをmac appの中身に変換") - # parser.add_argument("--hubert", type=str, help="path to hubert model") - # parser.add_argument("--useHubertOnnx", type=strtobool, default=False, help="use hubert onnx") - # parser.add_argument("--hubertSoftPt", type=str, help="path to hubert-soft model(pytorch)") - # parser.add_argument("--enhancerPt", type=str, help="path to enhancer model(pytorch)") - # parser.add_argument("--enhancerOnnx", type=str, help="path to enhancer model(onnx)") + # parser.add_argument("--internal", type=strtobool, default=False, help="各種パスをmac appの中身に変換") parser.add_argument("--content_vec_500", type=str, help="path to content_vec_500 model(pytorch)") parser.add_argument("--content_vec_500_onnx", type=str, help="path to content_vec_500 model(onnx)") @@ -83,42 +67,9 @@ def printMessage(message, level=0): parser = setupArgParser() args, unknown = parser.parse_known_args() -# printMessage(f"Phase name:{__name__}", level=2) -# thisFilename = os.path.basename(__file__)[:-3] - -# if __name__ == thisFilename or args.colab == True: -# printMessage(f"PHASE3:{__name__}", level=2) - printMessage(f"Booting PHASE :{__name__}", level=2) -TYPE = args.t PORT = args.p -CONFIG = args.c -MODEL = args.m -ONNX_MODEL = args.o -CLUSTER_MODEL = args.cluster if args.cluster != None else None - - -if args.internal and hasattr(sys, "_MEIPASS"): - print("use internal path") - if CONFIG != None: - CONFIG = os.path.join(sys._MEIPASS, CONFIG) - if MODEL != None: - MODEL = os.path.join(sys._MEIPASS, MODEL) - if ONNX_MODEL: - ONNX_MODEL = os.path.join(sys._MEIPASS, ONNX_MODEL) - if CLUSTER_MODEL: - CLUSTER_MODEL = os.path.join(sys._MEIPASS, CLUSTER_MODEL) - print(" config path:", CONFIG) - print(" model path:", MODEL) - print(" onnx model path:", ONNX_MODEL) - print(" cluster model path:", CLUSTER_MODEL) - - -MODEL_TYPE = os.environ.get('MODEL_TYPE', None) -if MODEL_TYPE == None: - MODEL_TYPE = args.modelType -setModelType(MODEL_TYPE) def localServer(): @@ -131,9 +82,6 @@ def localServer(): ) -if args.colab == True: - os.environ["colab"] = "True" - if __name__ == 'MMVCServerSIO': voiceChangerManager = VoiceChangerManager.get_instance({ "content_vec_500": args.content_vec_500, @@ -143,13 +91,6 @@ if __name__ == 'MMVCServerSIO': "hubert_soft": args.hubert_soft, "nsf_hifigan": args.nsf_hifigan, }) - if CONFIG and (MODEL or ONNX_MODEL): - if MODEL_TYPE == "MMVCv15" or MODEL_TYPE == "MMVCv13": - voiceChangerManager.loadModel(CONFIG, MODEL, ONNX_MODEL, None) - elif MODEL_TYPE == "so-vits-svc-40" or MODEL_TYPE == "so-vits-svc-40v2" or MODEL_TYPE == "so-vits-svc-40_c": - voiceChangerManager.loadModel(CONFIG, MODEL, ONNX_MODEL, CLUSTER_MODEL) - else: - voiceChangerManager.loadModel(CONFIG, MODEL, ONNX_MODEL, CLUSTER_MODEL) app_fastapi = MMVC_Rest.get_instance(voiceChangerManager) app_socketio = MMVC_SocketIOApp.get_instance(app_fastapi, voiceChangerManager) @@ -162,94 +103,74 @@ if __name__ == '__main__': mp.freeze_support() printMessage(f"Voice Changerを起動しています。", level=2) - TYPE = args.t PORT = args.p - CONFIG = args.c - MODEL = args.m if args.m != None else None - ONNX_MODEL = args.o if args.o != None else None - if TYPE != "MMVC" and TYPE != "TRAIN": - print("Type(-t) should be MMVC or TRAIN") - exit(1) - # printMessage(f"Start MMVC SocketIO Server", level=0) - printMessage(f"-- 設定 -- ", level=1) - printMessage(f"CONFIG:{CONFIG}, MODEL:{MODEL} ONNX_MODEL:{ONNX_MODEL}", level=1) - - if args.colab == False: - if os.getenv("EX_PORT"): - EX_PORT = os.environ["EX_PORT"] - printMessage( - f"External_Port:{EX_PORT} Internal_Port:{PORT}", level=1) - else: - printMessage(f"Internal_Port:{PORT}", level=1) - - if os.getenv("EX_TB_PORT"): - EX_TB_PORT = os.environ["EX_TB_PORT"] - printMessage(f"External_TeonsorBord_Port:{EX_TB_PORT}", level=1) - - if os.getenv("EX_IP"): - EX_IP = os.environ["EX_IP"] - printMessage(f"External_IP:{EX_IP}", level=1) - - # HTTPS key/cert作成 - if args.https and args.httpsSelfSigned == 1: - # HTTPS(おれおれ証明書生成) - os.makedirs(SSL_KEY_DIR, exist_ok=True) - key_base_name = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}" - keyname = f"{key_base_name}.key" - certname = f"{key_base_name}.cert" - create_self_signed_cert(certname, keyname, certargs={"Country": "JP", - "State": "Tokyo", - "City": "Chuo-ku", - "Organization": "F", - "Org. Unit": "F"}, cert_dir=SSL_KEY_DIR) - key_path = os.path.join(SSL_KEY_DIR, keyname) - cert_path = os.path.join(SSL_KEY_DIR, certname) - printMessage( - f"protocol: HTTPS(self-signed), key:{key_path}, cert:{cert_path}", level=1) - elif args.https and args.httpsSelfSigned == 0: - # HTTPS - key_path = args.httpsKey - cert_path = args.httpsCert - printMessage( - f"protocol: HTTPS, key:{key_path}, cert:{cert_path}", level=1) - else: - # HTTP - printMessage(f"protocol: HTTP", level=1) - printMessage(f"-- ---- -- ", level=1) - - # アドレス表示 + if os.getenv("EX_PORT"): + EX_PORT = os.environ["EX_PORT"] printMessage( - f"ブラウザで次のURLを開いてください.", level=2) + f"External_Port:{EX_PORT} Internal_Port:{PORT}", level=1) + else: + printMessage(f"Internal_Port:{PORT}", level=1) + + if os.getenv("EX_IP"): + EX_IP = os.environ["EX_IP"] + printMessage(f"External_IP:{EX_IP}", level=1) + + # HTTPS key/cert作成 + if args.https and args.httpsSelfSigned == 1: + # HTTPS(おれおれ証明書生成) + os.makedirs(SSL_KEY_DIR, exist_ok=True) + key_base_name = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}" + keyname = f"{key_base_name}.key" + certname = f"{key_base_name}.cert" + create_self_signed_cert(certname, keyname, certargs={"Country": "JP", + "State": "Tokyo", + "City": "Chuo-ku", + "Organization": "F", + "Org. Unit": "F"}, cert_dir=SSL_KEY_DIR) + key_path = os.path.join(SSL_KEY_DIR, keyname) + cert_path = os.path.join(SSL_KEY_DIR, certname) + printMessage( + f"protocol: HTTPS(self-signed), key:{key_path}, cert:{cert_path}", level=1) + + elif args.https and args.httpsSelfSigned == 0: + # HTTPS + key_path = args.httpsKey + cert_path = args.httpsCert + printMessage( + f"protocol: HTTPS, key:{key_path}, cert:{cert_path}", level=1) + else: + # HTTP + printMessage(f"protocol: HTTP", level=1) + printMessage(f"-- ---- -- ", level=1) + + # アドレス表示 + printMessage( + f"ブラウザで次のURLを開いてください.", level=2) + if args.https == 1: + printMessage( + f"https://<IP>:<PORT>/", level=1) + else: + printMessage( + f"http://<IP>:<PORT>/", level=1) + + printMessage(f"多くの場合は次のいずれかのURLにアクセスすると起動します。", level=2) + if "EX_PORT" in locals() and "EX_IP" in locals(): # シェルスクリプト経由起動(docker) if args.https == 1: - printMessage( - f"https://<IP>:<PORT>/", level=1) + printMessage(f"https://localhost:{EX_PORT}/", level=1) + for ip in EX_IP.strip().split(" "): + printMessage(f"https://{ip}:{EX_PORT}/", level=1) else: - printMessage( - f"http://<IP>:<PORT>/", level=1) - - if TYPE == "MMVC": - path = f"" + printMessage(f"http://localhost:{EX_PORT}/", level=1) + else: # 直接python起動 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8", 80)) + hostname = s.getsockname()[0] + if args.https == 1: + printMessage(f"https://localhost:{PORT}/", level=1) + printMessage(f"https://{hostname}:{PORT}/", level=1) else: - path = "trainer" - - printMessage(f"多くの場合は次のいずれかのURLにアクセスすると起動します。", level=2) - if "EX_PORT" in locals() and "EX_IP" in locals(): # シェルスクリプト経由起動(docker) - if args.https == 1: - printMessage(f"https://localhost:{EX_PORT}/{path}", level=1) - for ip in EX_IP.strip().split(" "): - printMessage(f"https://{ip}:{EX_PORT}/{path}", level=1) - else: - printMessage(f"http://localhost:{EX_PORT}/{path}", level=1) - else: # 直接python起動 - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(("8.8.8.8", 80)) - hostname = s.getsockname()[0] - if args.https == 1: - printMessage(f"https://localhost:{PORT}/{path}", level=1) - printMessage(f"https://{hostname}:{PORT}/{path}", level=1) - else: - printMessage(f"http://localhost:{PORT}/{path}", level=1) + printMessage(f"http://localhost:{PORT}/", level=1) # サーバ起動 if args.https: @@ -273,19 +194,10 @@ if __name__ == '__main__': log_level="warning" ) else: - # uvicorn.run( - # f"{os.path.basename(__file__)[:-3]}:app_socketio", - # host="0.0.0.0", - # port=int(PORT), - # reload = False if hasattr(sys, "_MEIPASS") else True, - # log_level="warning" - # ) - os.environ['MODEL_TYPE'] = MODEL_TYPE p = mp.Process(name="p", target=localServer) p.start() try: if sys.platform.startswith('win'): - # process = subprocess.Popen(["voice-changer-native-client.exe", "-u", f"http://localhost:{PORT}/{path}"]) process = subprocess.Popen([NATIVE_CLIENT_FILE_WIN, "-u", f"http://localhost:{PORT}/{path}"]) return_code = process.wait() print("client closed.") diff --git a/server/const.py b/server/const.py index 16d3159c..3519a6c7 100644 --- a/server/const.py +++ b/server/const.py @@ -26,16 +26,12 @@ TMP_DIR = os.path.join(tmpdir.name, "tmp_dir") if hasattr(sys, "_MEIPASS") else os.makedirs(TMP_DIR, exist_ok=True) -modelType: ModelType = "MMVCv15" - - -def getModelType() -> ModelType: - return modelType - - -def setModelType(_modelType: ModelType): - global modelType - modelType = _modelType +# modelType: ModelType = "MMVCv15" +# def getModelType() -> ModelType: +# return modelType +# def setModelType(_modelType: ModelType): +# global modelType +# modelType = _modelType def getFrontendPath(): diff --git a/server/voice_changer/SoVitsSvc40/SoVitsSvc40.py b/server/voice_changer/SoVitsSvc40/SoVitsSvc40.py index 94b97140..60768a09 100644 --- a/server/voice_changer/SoVitsSvc40/SoVitsSvc40.py +++ b/server/voice_changer/SoVitsSvc40/SoVitsSvc40.py @@ -84,8 +84,8 @@ class SoVitsSvc40: clusterTorchModel = props["files"]["clusterTorchModelFilename"] content_vec_path = self.params["content_vec_500"] - content_vec_hubert_onnx_path = self.params["content_vec_500_onnx"] - content_vec_hubert_onnx_on = self.params["content_vec_500_onnx_on"] + content_vec_onnx_path = self.params["content_vec_500_onnx"] + content_vec_onnx_on = self.params["content_vec_500_onnx_on"] hubert_base_path = self.params["hubert_base"] # hubert model @@ -94,11 +94,11 @@ class SoVitsSvc40: if os.path.exists(content_vec_path) == False: content_vec_path = hubert_base_path - if content_vec_hubert_onnx_on == True: + if content_vec_onnx_on == True: ort_options = onnxruntime.SessionOptions() ort_options.intra_op_num_threads = 8 - self.hubert_onnx = onnxruntime.InferenceSession( - content_vec_hubert_onnx_path, + self.content_vec_onnx = onnxruntime.InferenceSession( + content_vec_onnx_path, providers=providers ) else: @@ -154,12 +154,12 @@ class SoVitsSvc40: self.settings.gpu = 0 provider_options = [{'device_id': self.settings.gpu}] self.onnx_session.set_providers(providers=[val], provider_options=provider_options) - if hasattr(self, "hubert_onnx"): - self.hubert_onnx.set_providers(providers=[val], provider_options=provider_options) + if hasattr(self, "content_vec_onnx"): + self.content_vec_onnx.set_providers(providers=[val], provider_options=provider_options) else: self.onnx_session.set_providers(providers=[val]) - if hasattr(self, "hubert_onnx"): - self.hubert_onnx.set_providers(providers=[val]) + if hasattr(self, "content_vec_onnx"): + self.content_vec_onnx.set_providers(providers=[val]) elif key == "onnxExecutionProvider" and self.onnx_session == None: print("Onnx is not enabled. Please load model.") return False @@ -227,14 +227,14 @@ class SoVitsSvc40: else: dev = torch.device("cuda", index=self.settings.gpu) - if hasattr(self, "hubert_onnx"): - c = self.hubert_onnx.run( + if hasattr(self, "content_vec_onnx"): + c = self.content_vec_onnx.run( ["units"], { "audio": wav16k_numpy.reshape(1, -1), }) c = torch.from_numpy(np.array(c)).squeeze(0).transpose(1, 2) - # print("onnx hubert:", self.hubert_onnx.get_providers()) + # print("onnx hubert:", self.content_vec_onnx.get_providers()) else: if self.hps.model.ssl_dim == 768: self.hubert_model = self.hubert_model.to(dev) @@ -257,6 +257,7 @@ class SoVitsSvc40: else: cluster_c = cluster.get_cluster_center_result(self.cluster_model, c.cpu().numpy().T, speaker[0]).T cluster_c = torch.FloatTensor(cluster_c).to(dev) + c = c.to(dev) c = self.settings.clusterInferRatio * cluster_c + (1 - self.settings.clusterInferRatio) * c c = c.unsqueeze(0)