From 36c9edab214a1e1d4d379a8f86734012f647da33 Mon Sep 17 00:00:00 2001 From: wataru Date: Fri, 23 Sep 2022 14:35:32 +0900 Subject: [PATCH] updat --- README.md | 4 +- demo/SoftVcServerSIO.py | 99 ++++++++++++++---- .../monotonic_align/core.cp39-win_amd64.pyd | Bin 0 -> 145920 bytes demo/serverSIO.py | 93 ++++++++++++++-- demo/setup.sh | 4 +- start2.sh | 2 +- trainer/Dockerfile | 2 +- 7 files changed, 169 insertions(+), 35 deletions(-) create mode 100755 demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd diff --git a/README.md b/README.md index b5c131ce..73be45b8 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ AIを使ったリアルタイムボイスチェンジャー[MMVC](https://github - CPU/GPU切り替え - リアルタイム/ニアリアルタイム声質変換 +## 使用方法 + 使用方法等は[wiki](https://github.com/w-okada/voice-changer/wiki)をご参照ください。 ## MMVCのトレーニング用音声データと、実行時の音声入力の考え方 @@ -21,7 +23,7 @@ AIを使ったリアルタイムボイスチェンジャー[MMVC](https://github ## 関連技術 -本レポジトリでは、関連するボイスチェンジャとしてsoft-vcに注目しています。soft-vcにもリアルタイムでボイスチェンジできるようにしています。下記の「Docker不要な実行方法」のセクションからご利用ください。 +本レポジトリでは、関連するボイスチェンジャとして[soft-vc](https://github.com/bshall/soft-vc)に注目しています。soft-vcにもリアルタイムでボイスチェンジできるようにしています。下記の「Docker不要な実行方法」のセクションからご利用ください。 # Docker不要な実行方法 diff --git a/demo/SoftVcServerSIO.py b/demo/SoftVcServerSIO.py index 06f1e920..86c85def 100755 --- a/demo/SoftVcServerSIO.py +++ b/demo/SoftVcServerSIO.py @@ -1,8 +1,9 @@ import eventlet import socketio -import sys, math, base64 +import sys,os , math, struct, argparse +from distutils.util import strtobool from datetime import datetime -import struct +from OpenSSL import SSL, crypto import torch, torchaudio import numpy as np @@ -80,37 +81,95 @@ class MyCustomNamespace(socketio.Namespace): int_size = 2**(16 - 1) - 1 arr = (arr * int_size).astype(np.int16) - # write("logs/converted_data.wav", 24000, arr) - # changedVoiceBase64 = base64.b64encode(arr).decode('utf-8') - - # data = { - # "gpu":gpu, - # "srcId":srcId, - # "dstId":dstId, - # "timestamp":timestamp, - # "changedVoiceBase64":changedVoiceBase64 - # } - - # audio1 = audio1.astype(np.int16) bin = struct.pack('<%sh'%len(arr), *arr) - # print("return timestamp", timestamp) self.emit('response',[timestamp, bin]) def on_disconnect(self, sid): - # print('[{}] disconnect'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) pass; +def setupArgParser(): + parser = argparse.ArgumentParser() + parser.add_argument("-p", type=int, required=True, help="port") + parser.add_argument("--https", type=strtobool, default=False, help="use https") + parser.add_argument("--httpsKey", type=str, default="ssl.key", help="path for the key of https") + parser.add_argument("--httpsCert", type=str, default="ssl.cert", help="path for the cert of https") + parser.add_argument("--httpsSelfSigned", type=strtobool, default=True, help="generate self-signed certificate") + return parser + +def create_self_signed_cert(certfile, keyfile, certargs, cert_dir="."): + C_F = os.path.join(cert_dir, certfile) + K_F = os.path.join(cert_dir, keyfile) + if not os.path.exists(C_F) or not os.path.exists(K_F): + k = crypto.PKey() + k.generate_key(crypto.TYPE_RSA, 2048) + cert = crypto.X509() + cert.get_subject().C = certargs["Country"] + cert.get_subject().ST = certargs["State"] + cert.get_subject().L = certargs["City"] + cert.get_subject().O = certargs["Organization"] + cert.get_subject().OU = certargs["Org. Unit"] + cert.get_subject().CN = 'Example' + cert.set_serial_number(1000) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(315360000) + cert.set_issuer(cert.get_subject()) + cert.set_pubkey(k) + cert.sign(k, 'sha1') + open(C_F, "wb").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + open(K_F, "wb").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k)) + if __name__ == '__main__': - args = sys.argv - PORT = args[1] + parser = setupArgParser() + args = parser.parse_args() + PORT = args.p print(f"start... PORT:{PORT}") + + if args.https and args.httpsSelfSigned == 1: + # HTTPS(おれおれ証明書生成) + os.makedirs("./key", 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="./key") + key_path = os.path.join("./key", keyname) + cert_path = os.path.join("./key", certname) + print(f"protocol: HTTPS(self-signed), key:{key_path}, cert:{cert_path}") + elif args.https and args.httpsSelfSigned == 0: + # HTTPS + key_path = args.httpsKey + cert_path = args.httpsCert + print(f"protocol: HTTPS, key:{key_path}, cert:{cert_path}") + else: + # HTTP + print("protocol: HTTP") + + # SocketIOセットアップ sio = socketio.Server(cors_allowed_origins='*') sio.register_namespace(MyCustomNamespace('/test')) app = socketio.WSGIApp(sio,static_files={ '': '../frontend/dist', '/': '../frontend/dist/index.html', }) - eventlet.wsgi.server(eventlet.listen(('0.0.0.0',int(PORT))), app) - \ No newline at end of file + + if args.https: + # HTTPS サーバ起動 + sslWrapper = eventlet.wrap_ssl( + eventlet.listen(('0.0.0.0',int(PORT))), + certfile=cert_path, + keyfile=key_path, + # server_side=True + ) + eventlet.wsgi.server(sslWrapper, app) + else: + # HTTP サーバ起動 + eventlet.wsgi.server(eventlet.listen(('0.0.0.0',int(PORT))), app) + + + diff --git a/demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd b/demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd new file mode 100755 index 0000000000000000000000000000000000000000..9e9bacb7ad1a4759a7cfce3f162f7d927efebe80 GIT binary patch literal 145920 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 literal 0 HcmV?d00001 diff --git a/demo/serverSIO.py b/demo/serverSIO.py index 14a91d19..5209c93e 100755 --- a/demo/serverSIO.py +++ b/demo/serverSIO.py @@ -1,8 +1,9 @@ import eventlet import socketio -import sys +import sys, os, struct, argparse +from distutils.util import strtobool from datetime import datetime -import struct +from OpenSSL import SSL, crypto import torch import numpy as np @@ -77,19 +78,91 @@ class MyCustomNamespace(socketio.Namespace): # print('[{}] disconnect'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) pass; +def setupArgParser(): + parser = argparse.ArgumentParser() + parser.add_argument("-p", type=int, required=True, help="port") + parser.add_argument("-c", type=str, required=True, help="path for the config.json") + parser.add_argument("-m", type=str, required=True, help="path for the model file") + parser.add_argument("--https", type=strtobool, default=False, help="use https") + parser.add_argument("--httpsKey", type=str, default="ssl.key", help="path for the key of https") + parser.add_argument("--httpsCert", type=str, default="ssl.cert", help="path for the cert of https") + parser.add_argument("--httpsSelfSigned", type=strtobool, default=True, help="generate self-signed certificate") + return parser + +def create_self_signed_cert(certfile, keyfile, certargs, cert_dir="."): + C_F = os.path.join(cert_dir, certfile) + K_F = os.path.join(cert_dir, keyfile) + if not os.path.exists(C_F) or not os.path.exists(K_F): + k = crypto.PKey() + k.generate_key(crypto.TYPE_RSA, 2048) + cert = crypto.X509() + cert.get_subject().C = certargs["Country"] + cert.get_subject().ST = certargs["State"] + cert.get_subject().L = certargs["City"] + cert.get_subject().O = certargs["Organization"] + cert.get_subject().OU = certargs["Org. Unit"] + cert.get_subject().CN = 'Example' + cert.set_serial_number(1000) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(315360000) + cert.set_issuer(cert.get_subject()) + cert.set_pubkey(k) + cert.sign(k, 'sha1') + open(C_F, "wb").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + open(K_F, "wb").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k)) + if __name__ == '__main__': - args = sys.argv - PORT = args[1] - CONFIG = args[2] - MODEL = args[3] - print(f"start... PORT:{PORT}, CONFIG:{CONFIG}, MODEL:{MODEL}") - # sio = socketio.Server(cors_allowed_origins='http://localhost:8080') + parser = setupArgParser() + args = parser.parse_args() + PORT = args.p + CONFIG = args.c + MODEL = args.m + print(f"start... PORT:{PORT}, CONFIG:{CONFIG}, MODEL:{MODEL}") + + if args.https and args.httpsSelfSigned == 1: + # HTTPS(おれおれ証明書生成) + os.makedirs("./key", 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="./key") + key_path = os.path.join("./key", keyname) + cert_path = os.path.join("./key", certname) + print(f"protocol: HTTPS(self-signed), key:{key_path}, cert:{cert_path}") + elif args.https and args.httpsSelfSigned == 0: + # HTTPS + key_path = args.httpsKey + cert_path = args.httpsCert + print(f"protocol: HTTPS, key:{key_path}, cert:{cert_path}") + else: + # HTTP + print("protocol: HTTP") + + + # SocketIOセットアップ sio = socketio.Server(cors_allowed_origins='*') sio.register_namespace(MyCustomNamespace('/test', CONFIG, MODEL)) app = socketio.WSGIApp(sio,static_files={ '': '../frontend/dist', '/': '../frontend/dist/index.html', }) - eventlet.wsgi.server(eventlet.listen(('0.0.0.0',int(PORT))), app) - \ No newline at end of file + + if args.https: + # HTTPS サーバ起動 + sslWrapper = eventlet.wrap_ssl( + eventlet.listen(('0.0.0.0',int(PORT))), + certfile=cert_path, + keyfile=key_path, + # server_side=True + ) + eventlet.wsgi.server(sslWrapper, app) + else: + # HTTP サーバ起動 + eventlet.wsgi.server(eventlet.listen(('0.0.0.0',int(PORT))), app) + diff --git a/demo/setup.sh b/demo/setup.sh index 8c1c730a..9e2a4983 100755 --- a/demo/setup.sh +++ b/demo/setup.sh @@ -29,13 +29,13 @@ fi # 起動 if [ "${TYPE}" = "SOFT_VC" ] ; then echo "SOFT_VCを起動します" - python3 SoftVcServerSIO.py 8080 + python3 SoftVcServerSIO.py -p 8080 --https True --httpsSelfSigned True elif [ "${TYPE}" = "SOFT_VC_FAST_API" ] ; then echo "SOFT_VC_FAST_APIを起動します" python3 SoftVcServerFastAPI.py 8080 docker else echo "MMVCを起動します" - python3 serverSIO.py 8080 $CONFIG $MODEL + python3 serverSIO.py -p 8080 -c $CONFIG -m $MODEL --https True --httpsSelfSigned True fi diff --git a/start2.sh b/start2.sh index d70cd012..76b4492a 100644 --- a/start2.sh +++ b/start2.sh @@ -2,7 +2,7 @@ # 参考:https://programwiz.org/2022/03/22/how-to-write-shell-script-for-option-parsing/ -DOCKER_IMAGE=dannadori/voice-changer:20220919_073405 +DOCKER_IMAGE=dannadori/voice-changer:20220923_143426 TENSORBOARD_PORT=6006 VOICE_CHANGER_PORT=8080 diff --git a/trainer/Dockerfile b/trainer/Dockerfile index 0a857d95..3c06beed 100644 --- a/trainer/Dockerfile +++ b/trainer/Dockerfile @@ -1,4 +1,4 @@ -FROM dannadori/voice-changer-internal:20220919_073236 as front +FROM dannadori/voice-changer-internal:20220923_142757 as front FROM debian:bullseye-slim as base ARG DEBIAN_FRONTEND=noninteractive