mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-02-02 16:23:58 +03:00
update
This commit is contained in:
parent
3f2462933a
commit
31507fae62
@ -6,8 +6,8 @@ from distutils.util import strtobool
|
||||
import numpy as np
|
||||
from scipy.io.wavfile import write, read
|
||||
|
||||
sys.path.append("/MMVC_Trainer")
|
||||
sys.path.append("/MMVC_Trainer/text")
|
||||
sys.path.append("MMVC_Trainer")
|
||||
sys.path.append("MMVC_Trainer/text")
|
||||
|
||||
from fastapi.routing import APIRoute
|
||||
from fastapi import HTTPException, Request, Response, FastAPI, UploadFile, File, Form
|
||||
@ -244,7 +244,7 @@ if __name__ == thisFilename or args.colab == True:
|
||||
# ##########
|
||||
UPLOAD_DIR = "upload_dir"
|
||||
os.makedirs(UPLOAD_DIR, exist_ok=True)
|
||||
MODEL_DIR = "/MMVC_Trainer/logs"
|
||||
MODEL_DIR = "MMVC_Trainer/logs"
|
||||
os.makedirs(MODEL_DIR, exist_ok=True)
|
||||
|
||||
@app_fastapi.post("/upload_file")
|
||||
@ -290,7 +290,7 @@ if __name__ == thisFilename or args.colab == True:
|
||||
):
|
||||
zipFilePath = concat_file_chunks(
|
||||
UPLOAD_DIR, zipFilename, zipFileChunkNum, UPLOAD_DIR)
|
||||
shutil.unpack_archive(zipFilePath, "/MMVC_Trainer/dataset/textful/")
|
||||
shutil.unpack_archive(zipFilePath, "MMVC_Trainer/dataset/textful/")
|
||||
return {"Zip file unpacked": f"{zipFilePath}"}
|
||||
|
||||
############
|
||||
|
1
demo/MMVC_Trainer
Submodule
1
demo/MMVC_Trainer
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 39723b3243e0265b8802e020e4d4d90a4b8b65ee
|
35
demo/exec.sh
Normal file
35
demo/exec.sh
Normal file
@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
MODE=$1
|
||||
PARAMS=${@:2:($#-1)}
|
||||
|
||||
|
||||
echo "------"
|
||||
echo "$@"
|
||||
echo "TYPE: $MODE"
|
||||
echo "PARAMS: $PARAMS"
|
||||
# echo "VERBOSE: $VERBOSE"
|
||||
echo "------"
|
||||
|
||||
cd /voice-changer-internal/voice-change-service
|
||||
# 起動
|
||||
if [ "${MODE}" = "MMVC" ] ; then
|
||||
if [[ -e /resources/setting.json ]]; then
|
||||
echo "指定された設定(setting.json)を使用します。"
|
||||
cp /resources/setting.json ../frontend/dist/assets/setting.json
|
||||
fi
|
||||
|
||||
find /resources/ -type f -name "config.json" | xargs -I{} sh -c 'echo "config.jsonをコピーします。" && cp {} ./'
|
||||
find /resources/ -type f -name "*.pth" | xargs -I{} sh -c 'echo "`basename {}`をコピーします。" && cp {} ./'
|
||||
|
||||
echo "MMVCを起動します"
|
||||
python3 MMVCServerSIO.py -t MMVC $PARAMS #2>stderr.txt
|
||||
|
||||
elif [ "${MODE}" = "TRAIN" ] ; then
|
||||
python3 -m tensorboard.main --logdir /MMVC_Trainer/logs --port 6006 --host 0.0.0.0 &
|
||||
python3 MMVCServerSIO.py -t TRAIN $PARAMS
|
||||
fi
|
||||
|
||||
|
@ -3,11 +3,11 @@ from fastapi.responses import FileResponse
|
||||
import os
|
||||
|
||||
def mod_get_model(modelFile:str):
|
||||
modelPath = os.path.join("/MMVC_Trainer/logs", modelFile)
|
||||
modelPath = os.path.join("MMVC_Trainer/logs", modelFile)
|
||||
return FileResponse(path=modelPath)
|
||||
|
||||
def mod_delete_model(modelFile:str):
|
||||
modelPath = os.path.join("/MMVC_Trainer/logs", modelFile)
|
||||
modelPath = os.path.join("MMVC_Trainer/logs", modelFile)
|
||||
os.unlink(modelPath)
|
||||
return {"Model deleted": f"{modelFile}"}
|
||||
|
||||
|
@ -5,8 +5,8 @@ from trainer_mods.files import get_file_list
|
||||
import os
|
||||
|
||||
def mod_get_models():
|
||||
gModels = get_file_list(f'/MMVC_Trainer/logs/G*.pth')
|
||||
dModels = get_file_list(f'/MMVC_Trainer/logs/D*.pth')
|
||||
gModels = get_file_list(f'MMVC_Trainer/logs/G*.pth')
|
||||
dModels = get_file_list(f'MMVC_Trainer/logs/D*.pth')
|
||||
models = []
|
||||
models.extend(gModels)
|
||||
models.extend(dModels)
|
||||
|
@ -2,7 +2,7 @@ from fastapi.responses import JSONResponse
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
import os
|
||||
|
||||
MULTI_SPEAKER_SETTING_PATH = "/MMVC_Trainer/dataset/multi_speaker_correspondence.txt"
|
||||
MULTI_SPEAKER_SETTING_PATH = "MMVC_Trainer/dataset/multi_speaker_correspondence.txt"
|
||||
def mod_get_multi_speaker_setting():
|
||||
data = {}
|
||||
if os.path.isfile(MULTI_SPEAKER_SETTING_PATH) == False:
|
||||
|
@ -2,7 +2,7 @@ import shutil
|
||||
from mods.Trainer_MultiSpeakerSetting import MULTI_SPEAKER_SETTING_PATH
|
||||
|
||||
def mod_delete_speaker(speaker:str):
|
||||
shutil.rmtree(f"/MMVC_Trainer/dataset/textful/{speaker}")
|
||||
shutil.rmtree(f"MMVC_Trainer/dataset/textful/{speaker}")
|
||||
|
||||
with open(MULTI_SPEAKER_SETTING_PATH, "r") as f:
|
||||
setting = f.readlines()
|
||||
|
@ -3,9 +3,9 @@ from fastapi.encoders import jsonable_encoder
|
||||
import os, base64
|
||||
|
||||
def mod_get_speaker_voice(speaker:str, voice:str):
|
||||
wav_file = f'/MMVC_Trainer/dataset/textful/{speaker}/wav/{voice}.wav'
|
||||
text_file = f'/MMVC_Trainer/dataset/textful/{speaker}/text/{voice}.txt'
|
||||
readable_text_file = f'/MMVC_Trainer/dataset/textful/{speaker}/readable_text/{voice}.txt'
|
||||
wav_file = f'MMVC_Trainer/dataset/textful/{speaker}/wav/{voice}.wav'
|
||||
text_file = f'MMVC_Trainer/dataset/textful/{speaker}/text/{voice}.txt'
|
||||
readable_text_file = f'MMVC_Trainer/dataset/textful/{speaker}/readable_text/{voice}.txt'
|
||||
|
||||
data = {}
|
||||
if os.path.exists(wav_file):
|
||||
|
@ -4,11 +4,11 @@ from trainer_mods.files import get_file_list
|
||||
import os
|
||||
|
||||
def mod_get_speaker_voices(speaker:str):
|
||||
voices = get_file_list(f'/MMVC_Trainer/dataset/textful/{speaker}/wav/*.wav')
|
||||
voices = get_file_list(f'MMVC_Trainer/dataset/textful/{speaker}/wav/*.wav')
|
||||
|
||||
texts = get_file_list(f'/MMVC_Trainer/dataset/textful/{speaker}/text/*.txt')
|
||||
texts = get_file_list(f'MMVC_Trainer/dataset/textful/{speaker}/text/*.txt')
|
||||
|
||||
readable_texts = get_file_list(f'/MMVC_Trainer/dataset/textful/{speaker}/readable_text/*.txt')
|
||||
readable_texts = get_file_list(f'MMVC_Trainer/dataset/textful/{speaker}/readable_text/*.txt')
|
||||
|
||||
items = voices
|
||||
items.extend(texts)
|
||||
|
@ -5,8 +5,8 @@ import os
|
||||
# CreateはFileUploaderで実装。
|
||||
|
||||
def mod_get_speakers():
|
||||
os.makedirs("/MMVC_Trainer/dataset/textful", exist_ok=True)
|
||||
speakers = get_dir_list("/MMVC_Trainer/dataset/textful/")
|
||||
os.makedirs("MMVC_Trainer/dataset/textful", exist_ok=True)
|
||||
speakers = get_dir_list("MMVC_Trainer/dataset/textful/")
|
||||
|
||||
data = {
|
||||
"speakers":sorted(speakers)
|
||||
|
@ -3,7 +3,7 @@ from trainer_mods.files import get_file_list
|
||||
from fastapi.responses import JSONResponse
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
|
||||
LOG_DIR = "/MMVC_Trainer/info"
|
||||
LOG_DIR = "MMVC_Trainer/info"
|
||||
train_proc = None
|
||||
|
||||
SUCCESS = 0
|
||||
@ -13,7 +13,7 @@ def sync_exec(cmd:str, log_path:str):
|
||||
shortCmdStr = cmd[:20]
|
||||
try:
|
||||
with open(log_path, 'w') as log_file:
|
||||
proc = subprocess.run(cmd, shell=True, text=True, stdout=log_file, stderr=log_file, cwd="/MMVC_Trainer")
|
||||
proc = subprocess.run(cmd, shell=True, text=True, stdout=log_file, stderr=log_file, cwd="MMVC_Trainer")
|
||||
print(f"{shortCmdStr} returncode:{proc.returncode}")
|
||||
if proc.returncode != 0:
|
||||
print(f"{shortCmdStr} exception:")
|
||||
@ -28,7 +28,7 @@ def sync_exec_with_stdout(cmd:str, log_path:str):
|
||||
try:
|
||||
with open(log_path, 'w') as log_file:
|
||||
proc = subprocess.run(cmd, shell=True, text=True, stdout=subprocess.PIPE,
|
||||
stderr=log_file, cwd="/MMVC_Trainer")
|
||||
stderr=log_file, cwd="MMVC_Trainer")
|
||||
print(f"STDOUT{shortCmdStr}",proc.stdout)
|
||||
except Exception as e:
|
||||
print(f"{shortCmdStr} exception:", str(e))
|
||||
@ -43,13 +43,13 @@ def create_dataset():
|
||||
return res
|
||||
|
||||
def set_batch_size(batch:int):
|
||||
cmd = "sed -i 's/\"batch_size\": [0-9]*/\"batch_size\": " + str(batch) + "/' /MMVC_Trainer/configs/baseconfig.json"
|
||||
cmd = "sed -i 's/\"batch_size\": [0-9]*/\"batch_size\": " + str(batch) + "/' MMVC_Trainer/configs/baseconfig.json"
|
||||
log_file = os.path.join(LOG_DIR, "log_set_batch_size.txt")
|
||||
res = sync_exec(cmd, log_file)
|
||||
return res
|
||||
|
||||
def set_dummy_device_count():
|
||||
cmd = 'sed -ie "s/torch.cuda.device_count()/1/" /MMVC_Trainer/train_ms.py'
|
||||
cmd = 'sed -ie "s/torch.cuda.device_count()/1/" MMVC_Trainer/train_ms.py'
|
||||
log_file = os.path.join(LOG_DIR, "log_set_dummy_device_count.txt")
|
||||
res = sync_exec(cmd, log_file)
|
||||
return res
|
||||
@ -73,7 +73,7 @@ def exec_training():
|
||||
with open(log_file, 'w') as log_file:
|
||||
cmd = 'python3 train_ms.py -c configs/train_config.json -m ./'
|
||||
print("exec:",cmd)
|
||||
train_proc = subprocess.Popen("exec "+cmd, shell=True, text=True, stdout=log_file, stderr=log_file, cwd="/MMVC_Trainer")
|
||||
train_proc = subprocess.Popen("exec "+cmd, shell=True, text=True, stdout=log_file, stderr=log_file, cwd="MMVC_Trainer")
|
||||
print("Training stated")
|
||||
print(f"returncode:{train_proc.returncode}")
|
||||
except Exception as e:
|
||||
@ -133,11 +133,11 @@ def mod_post_stop_training():
|
||||
def mod_get_related_files():
|
||||
files = get_file_list(os.path.join(LOG_DIR,"*"))
|
||||
files.extend([
|
||||
"/MMVC_Trainer/dataset/multi_speaker_correspondence.txt",
|
||||
"/MMVC_Trainer/train_ms.py",
|
||||
"MMVC_Trainer/dataset/multi_speaker_correspondence.txt",
|
||||
"MMVC_Trainer/train_ms.py",
|
||||
])
|
||||
files.extend(
|
||||
get_file_list("/MMVC_Trainer/configs/*")
|
||||
get_file_list("MMVC_Trainer/configs/*")
|
||||
)
|
||||
|
||||
res = []
|
||||
|
@ -1,56 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 参考:https://programwiz.org/2022/03/22/how-to-write-shell-script-for-option-parsing/
|
||||
|
||||
set -eu
|
||||
# 実行ユーザ作成
|
||||
USER_ID=${LOCAL_UID:-9001}
|
||||
GROUP_ID=${LOCAL_GID:-9001}
|
||||
|
||||
if [ $# = 0 ]; then
|
||||
echo "
|
||||
usage:
|
||||
$0 -t <TYPE> <params...>
|
||||
TYPE: select one of ['TRAIN', 'MMVC']
|
||||
" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# TYPE=$1
|
||||
# PARAMS=${@:2:($#-1)}
|
||||
|
||||
# echo $TYPE
|
||||
# echo $PARAMS
|
||||
|
||||
|
||||
if [ -e /resources ]; then
|
||||
echo "/resources の中身をコピーします。"
|
||||
cp -r /resources/* .
|
||||
else
|
||||
echo "/resourcesが存在しません。デフォルトの動作をします。"
|
||||
fi
|
||||
|
||||
|
||||
## Config 設置
|
||||
if [[ -e ./setting.json ]]; then
|
||||
echo "カスタムセッティングを使用"
|
||||
cp ./setting.json ../frontend/dist/assets/setting.json
|
||||
fi
|
||||
|
||||
echo "起動します" "$@"
|
||||
python3 MMVCServerSIO.py "$@"
|
||||
|
||||
###
|
||||
# 起動パラメータ
|
||||
# (1) トレーニングの場合
|
||||
# python3 MMVCServerSIO.py -t <type> [--https on|off, --httpsKey <key>, --httpsCert <key>, --httpsSelfSigned on|off]
|
||||
# 環境変数: EX_PORT, EX_TB_PORT, EX_IP (EX_IPはEX_IP="`hostname -I`"で自動取得)
|
||||
# ※ Colabの場合:python3 MMVCServerSIO.py -t Train -p {PORT} --colab True
|
||||
# (2) VCの場合
|
||||
|
||||
|
||||
# # 起動
|
||||
# if [ "${TYPE}" = "MMVC" ] ; then
|
||||
|
||||
# elif [ "${TYPE}" = "MMVC_VERBOSE" ] ; then
|
||||
# echo "MMVCを起動します(verbose)"
|
||||
# python3 MMVCServerSIO.py $PARAMS
|
||||
# fi
|
||||
echo "exec with [UID : $USER_ID, GID: $GROUP_ID]"
|
||||
useradd -u $USER_ID -o -m user
|
||||
groupmod -g $GROUP_ID user
|
||||
|
||||
#su user
|
||||
#echo "parameter: $@"
|
||||
exec /usr/sbin/gosu user /bin/bash exec.sh "$@"
|
||||
#/bin/bash
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM dannadori/voice-changer-internal:20221114_095228 as front
|
||||
FROM dannadori/voice-changer-internal:20221209_112157 as front
|
||||
FROM debian:bullseye-slim as base
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
@ -48,29 +48,33 @@ RUN apt-get update \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
### Copy local resource
|
||||
COPY fine_model/G_180000.pth /MMVC_Trainer/fine_model/G_180000.pth
|
||||
COPY fine_model/D_180000.pth /MMVC_Trainer/fine_model/D_180000.pth
|
||||
# ### Copy local resource
|
||||
# COPY fine_model/G_180000.pth /MMVC_Trainer/fine_model/G_180000.pth
|
||||
# COPY fine_model/D_180000.pth /MMVC_Trainer/fine_model/D_180000.pth
|
||||
|
||||
### Copy from base
|
||||
COPY --from=base --chmod=777 /usr/local/lib/python3.9/dist-packages /usr/local/lib/python3.9/dist-packages
|
||||
|
||||
### Copy from frontend
|
||||
##### MMVC Trainer
|
||||
COPY --from=front --chmod=777 /MMVC_Trainer /MMVC_Trainer
|
||||
RUN chmod 0777 /MMVC_Trainer
|
||||
# ### Copy from frontend
|
||||
# ##### MMVC Trainer
|
||||
# COPY --from=front --chmod=777 /MMVC_Trainer /MMVC_Trainer
|
||||
# RUN chmod 0777 /MMVC_Trainer
|
||||
|
||||
ADD /setup.sh /MMVC_Trainer/
|
||||
ADD /exec.sh /MMVC_Trainer/
|
||||
# ADD /setup.sh /MMVC_Trainer/
|
||||
# ADD /exec.sh /MMVC_Trainer/
|
||||
|
||||
##### Voice changer Internal
|
||||
COPY --from=front --chmod=777 /voice-changer-internal/frontend/dist /voice-changer-internal/frontend/dist
|
||||
COPY --from=front --chmod=777 /voice-changer-internal/voice-change-service /voice-changer-internal/voice-change-service
|
||||
RUN chmod 0777 /voice-changer-internal/voice-change-service
|
||||
|
||||
ADD /setup.sh /voice-changer-internal/voice-change-service/
|
||||
ADD /exec.sh /voice-changer-internal/voice-change-service/
|
||||
COPY fine_model/G_180000.pth /voice-changer-internal/voice-change-service/MMVC_Trainer/fine_model/G_180000.pth
|
||||
COPY fine_model/D_180000.pth /voice-changer-internal/voice-change-service/MMVC_Trainer/fine_model/D_180000.pth
|
||||
|
||||
## 歴史的な経緯でsetup.shをMMVC_Trainerに置いているのでそこを起動時のWORKDIRにしている。
|
||||
WORKDIR /MMVC_Trainer
|
||||
WORKDIR /voice-changer-internal/voice-change-service
|
||||
|
||||
# ##### Soft VC
|
||||
# COPY --from=front /hubert /hubert
|
||||
|
@ -13,11 +13,9 @@ echo "PARAMS: $PARAMS"
|
||||
# echo "VERBOSE: $VERBOSE"
|
||||
echo "------"
|
||||
|
||||
|
||||
cd /voice-changer-internal/voice-change-service
|
||||
# 起動
|
||||
if [ "${MODE}" = "MMVC" ] ; then
|
||||
cd /voice-changer-internal/voice-change-service
|
||||
|
||||
if [[ -e /resources/setting.json ]]; then
|
||||
echo "指定された設定(setting.json)を使用します。"
|
||||
cp /resources/setting.json ../frontend/dist/assets/setting.json
|
||||
@ -30,7 +28,6 @@ if [ "${MODE}" = "MMVC" ] ; then
|
||||
python3 MMVCServerSIO.py -t MMVC $PARAMS #2>stderr.txt
|
||||
|
||||
elif [ "${MODE}" = "TRAIN" ] ; then
|
||||
cd /voice-changer-internal/voice-change-service
|
||||
python3 -m tensorboard.main --logdir /MMVC_Trainer/logs --port 6006 --host 0.0.0.0 &
|
||||
python3 MMVCServerSIO.py -t TRAIN $PARAMS
|
||||
fi
|
||||
|
2
frontend/dist/index.js
vendored
2
frontend/dist/index.js
vendored
File diff suppressed because one or more lines are too long
6
frontend/dist/index.js.LICENSE.txt
vendored
6
frontend/dist/index.js.LICENSE.txt
vendored
@ -5,12 +5,6 @@
|
||||
(c) 2013-2017 Mozilla, Apache License 2.0
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2022 Fonticons, Inc.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* The buffer module from node.js, for the browser.
|
||||
*
|
||||
|
72
misc/requirements.txt
Normal file
72
misc/requirements.txt
Normal file
@ -0,0 +1,72 @@
|
||||
anyio==3.6.2
|
||||
appdirs==1.4.4
|
||||
attrs==22.1.0
|
||||
audioread==3.0.0
|
||||
Babel==2.11.0
|
||||
bidict==0.22.0
|
||||
certifi @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_4d2o0arbv6/croot/certifi_1665076671099/work/certifi
|
||||
cffi==1.15.1
|
||||
charset-normalizer==2.1.1
|
||||
click==8.1.3
|
||||
clldutils==3.15.0
|
||||
colorama==0.4.6
|
||||
colorlog==6.7.0
|
||||
cryptography==38.0.4
|
||||
csvw==3.1.3
|
||||
Cython==0.29.32
|
||||
decorator==5.1.1
|
||||
dlinfo==1.2.1
|
||||
fastapi==0.88.0
|
||||
h11==0.14.0
|
||||
idna==3.4
|
||||
importlib-metadata==5.1.0
|
||||
isodate==0.6.1
|
||||
joblib==1.2.0
|
||||
jsonschema==4.17.3
|
||||
language-tags==1.1.0
|
||||
librosa==0.9.2
|
||||
llvmlite==0.39.1
|
||||
lxml==4.9.1
|
||||
Markdown==3.4.1
|
||||
numba==0.56.4
|
||||
numpy==1.23.5
|
||||
packaging==22.0
|
||||
phonemizer==3.2.1
|
||||
pooch==1.6.0
|
||||
py==1.11.0
|
||||
pycparser==2.21
|
||||
pydantic==1.10.2
|
||||
pylatexenc==2.10
|
||||
pyOpenSSL==22.1.0
|
||||
pyparsing==3.0.9
|
||||
pyrsistent==0.19.2
|
||||
python-dateutil==2.8.2
|
||||
python-engineio==4.3.4
|
||||
python-multipart==0.0.5
|
||||
python-socketio==5.7.2
|
||||
pytz==2022.6
|
||||
rdflib==6.2.0
|
||||
regex==2022.10.31
|
||||
requests==2.28.1
|
||||
resampy==0.4.2
|
||||
retry==0.9.2
|
||||
rfc3986==1.5.0
|
||||
scikit-learn==1.2.0
|
||||
scipy==1.9.3
|
||||
segments==2.2.1
|
||||
six==1.16.0
|
||||
sniffio==1.3.0
|
||||
soundfile==0.11.0
|
||||
starlette==0.22.0
|
||||
tabulate==0.9.0
|
||||
threadpoolctl==3.1.0
|
||||
torch==1.13.0
|
||||
torchaudio==0.13.0
|
||||
tqdm==4.64.1
|
||||
typing_extensions==4.4.0
|
||||
Unidecode==1.3.6
|
||||
uritemplate==4.1.1
|
||||
urllib3==1.26.13
|
||||
uvicorn==0.20.0
|
||||
websockets==10.4
|
||||
zipp==3.11.0
|
Loading…
Reference in New Issue
Block a user