From 275c008a619316b47ebf06b247cc93f7de48b0b2 Mon Sep 17 00:00:00 2001 From: wataru Date: Tue, 23 Aug 2022 03:57:54 +0900 Subject: [PATCH] WIP: merge with frontend --- README.md | 25 +++++++++- start.sh | 13 +++++ template.sh | 1 - trainer/Dockerfile | 15 ++++-- trainer/exec.sh | 122 +++++++++++++++++++++++++++++++++++++++++++++ trainer/setup.sh | 26 +++++----- 6 files changed, 182 insertions(+), 20 deletions(-) create mode 100644 start.sh create mode 100644 trainer/exec.sh diff --git a/README.md b/README.md index 13d06866..f3f8be67 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +Voice Changer AI Trainer and Player Container +---- + +[MMVC](https://github.com/isletennos/MMVC_Trainer)のトレーニングと実行を簡単にするためのDockerコンテナです。 # 使用方法 ## 前提 @@ -31,11 +35,22 @@ Sun Sep 15 22:40:52 2019 ``` こんな感じの出力が出ればOKです。 -ボイスチェンジ時にはGPUは必須ではありません。あればより高速にぼいちぇんできるかもしれません。 +ボイスチェンジ時にはGPUは必須ではありません。あればより高速にボイスチェンジできるかもしれません。 ## トレーニングデータの準備 +### Data作成(自分の声) + +[MMVC](https://github.com/isletennos/MMVC_Trainer)のドキュメントに従って、ITAコーパスなどの台本データ(textデータ)を入手し、でwavデータを作成してください。textデータとwavデータは、dataset/00_myvoiceフォルダの下においてください。 + +wavデータの作成は、こちらの[voice-recorder](https://github.com/w-okada/voice-recorder)アプリケーションを使用しても作成できます。 +wavのサンプリングレートやファイル名など、MMVCに適したデータを作成するように作られているので、いくらか手間が省けるかと思います。 + +### Data作成(なりたい声) +[MMVC](https://github.com/isletennos/MMVC_Trainer)のドキュメントに従って、公式サポートされている声データ(.zip形式)を取得してください。データはzip形式のまま、datasetフォルダにおいてください。 + ### Datasetの中身 +上記Data作成を実施すると、次のようなフォルダ構成になると思います。ご確認ください。 ``` $ ls dataset -l 合計 1656692 @@ -61,10 +76,16 @@ $ EXP_NAME=001_exp # テスト用フォルダ作成 $ sh template.sh $EXP_NAME -$ docker run -it --gpus all --shm-size=2g \ + +docker run -v .:/go/src/app:ro [container id] +USER_ID=$(id -u) +GROUP_ID=$(id -g) +$ USER_ID=$(id -u) docker run -it --gpus all --shm-size=2g \ -v `pwd`/exp/${EXP_NAME}/dataset:/MMVC_Trainer/dataset \ -v `pwd`/exp/${EXP_NAME}/logs:/MMVC_Trainer/logs \ -v `pwd`/exp/${EXP_NAME}/filelists:/MMVC_Trainer/filelists \ + -e LOCAL_UID=$(id -u $USER) \ + -e LOCAL_GID=$(id -g $USER) \ -p 6008:6006 mmvc_trainer_docker ``` diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..cff66724 --- /dev/null +++ b/start.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +EXP_NAME=$1 +shift + +docker run -it --gpus all --shm-size=2g \ + -v `pwd`/exp/${EXP_NAME}/dataset:/MMVC_Trainer/dataset \ + -v `pwd`/exp/${EXP_NAME}/logs:/MMVC_Trainer/logs \ + -v `pwd`/exp/${EXP_NAME}/filelists:/MMVC_Trainer/filelists \ + -v `pwd`/exp/${EXP_NAME}/filelists:/voice-changer-internal/voice-change-service/filelists + -e LOCAL_UID=$(id -u $USER) \ + -e LOCAL_GID=$(id -g $USER) \ + -p 6008:6006 mmvc_trainer_docker "$@" \ No newline at end of file diff --git a/template.sh b/template.sh index 911cf4b4..d1f5aea2 100644 --- a/template.sh +++ b/template.sh @@ -1,6 +1,5 @@ #!/bin/bash -## 005_expより複数話者対応。myvoiceのフォルダ階層を一つ深くする。 EXP_NAME=$1 echo $EXP_NAME diff --git a/trainer/Dockerfile b/trainer/Dockerfile index 3ae5fda7..4d1a980e 100644 --- a/trainer/Dockerfile +++ b/trainer/Dockerfile @@ -36,7 +36,7 @@ RUN cythonize -3 -i core.pyx \ FROM debian:bullseye-slim RUN apt-get update \ - && apt-get install -y python3-pip espeak\ + && apt-get install -y python3-pip espeak gosu\ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -46,11 +46,20 @@ COPY --from=base /MMVC_Trainer /MMVC_Trainer 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 +# RUN groupadd -g 61000 docker +# RUN useradd -g 61000 -l -m -s /bin/false -u 61000 docker +# USER docker + WORKDIR /MMVC_Trainer ADD /setup.sh /MMVC_Trainer/ +ADD /exec.sh /MMVC_Trainer/ +RUN chmod 0777 . -R +# RUN chmod 0777 exec.sh +# RUN chmod 0666 train_ms.py +RUN chmod 0777 /usr/local/lib/python3.9/dist-packages/pyopenjtalk -# ENTRYPOINT ["/bin/bash", "setup.sh"] -# CMD [ "8", "false"] +ENTRYPOINT ["/bin/bash", "setup.sh"] +CMD [ "-h"] # FROM ubuntu:focal-20220531 as base diff --git a/trainer/exec.sh b/trainer/exec.sh new file mode 100644 index 00000000..7bd03fbd --- /dev/null +++ b/trainer/exec.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# 参考:https://programwiz.org/2022/03/22/how-to-write-shell-script-for-option-parsing/ + +set -eu + +echo "------" +echo "$@" +echo "------" + +usage() { + echo " +usage: + For training + $0 [-t] [-b batch_size] [-r] + -t: flag for training mode + -b: batch_size. + -r: flag for resuming training. + For changing voice + $0 [-v] [-c config] [-m model] + -v: flag for voice change mode + -c: config + -m: model name + For help + $0 [-h] + -h: show this help +" >&2 +} +warn () { + echo "! ! ! $1 ! ! !" + exit 1 +} + + +training_flag=false +batch_size=10 +resume_flag=false + +voice_change_flag=false +config= +model= + +# オプション解析 +while getopts tb:rvc:m:h OPT; do + case $OPT in + t) + training_flag=true + ;; + b) + batch_size="$OPTARG" + ;; + r) + resume_flag=true + ;; + v) + voice_change_flag=true + ;; + c) + config="$OPTARG" + ;; + m) + model="$OPTARG" + ;; + h | \?) + usage && exit 1 + ;; + + esac +done + + +## コマンドライン引数から、オプション引数分を削除 +# shift $((OPTIND - 1)) + +# モード解析 +if $training_flag && $voice_change_flag; then + warn "-t(トレーニングモード) と -v(ボイチェンモード)は同時に指定できません。" + exit 1 +elif $training_flag; then + echo "■■■ ト レ ー ニ ン グ モ ー ド ■■■" +elif $voice_change_flag; then + echo "■■■ ボ イ チ ェ ン モ ー ド ■■■" +else + warn "-t(トレーニングモード) と -v(ボイチェンモード)のいずれかを指定してください。" + exit 1 +fi + + + +if $training_flag; then + + + python3 create_dataset_jtalk.py -f train_config -s 24000 -m dataset/multi_speaker_correspondence.txt + # date_tag=`date +%Y%m%d%H%M%S` + sed -ie 's/80000/8000/' train_ms.py + sed -ie "s/\"batch_size\": 10/\"batch_size\": $batch_size/" configs/train_config.json + + python3 -m tensorboard.main --logdir logs --port 6006 --host 0.0.0.0 & + + if ${resume_flag}; then + echo "トレーニング再開。バッチサイズ: ${batch_size}。" + python3 train_ms.py -c configs/train_config.json -m vc + else + echo "トレーニング開始。バッチサイズ: ${batch_size}。" + python3 train_ms.py -c configs/train_config.json -m vc -fg fine_model/G_180000.pth -fd fine_model/D_180000.pth + fi +fi + +# if $voice_change_flag; then +# if [[ -z "$config" ]]; then +# warn "コンフィグファイル(-c)を指定してください" +# fi +# if [[ -z "$model" ]]; then +# warn "モデルファイル(-m)を指定してください" +# fi + +# cp -r /resources/* . +# if [[ -e ./setting.json ]]; then +# cp ./setting.json ../frontend/dist/assets/setting.json +# fi +# python3 serverSIO.py 8080 $config $model +# fi diff --git a/trainer/setup.sh b/trainer/setup.sh index f573e0f1..4e869938 100644 --- a/trainer/setup.sh +++ b/trainer/setup.sh @@ -1,20 +1,18 @@ #!/bin/bash -BATCH_SIZE=$1 -RESUME=$2 -echo batch:${BATCH_SIZE} -echo resume:${RESUME} +# 参考:https://programwiz.org/2022/03/22/how-to-write-shell-script-for-option-parsing/ -python3 create_dataset_jtalk.py -f train_config -s 24000 -m dataset/multi_speaker_correspondence.txt +set -eu -sed -ie 's/80000/8000/' train_ms.py -sed -ie "s/\"batch_size\": 10/\"batch_size\": $BATCH_SIZE/" configs/train_config.json +# 実行ユーザ作成 +USER_ID=${LOCAL_UID:-9001} +GROUP_ID=${LOCAL_GID:-9001} +echo "" +echo "アプリケーション開始... (内部ユーザー [UID : $USER_ID, GID: $GROUP_ID])" +useradd -u $USER_ID -o -m user +groupmod -g $GROUP_ID user -# cd monotonic_align/ \ -# && cythonize -3 -i core.pyx \ -# && mv core.cpython-39-x86_64-linux-gnu.so monotonic_align/ \ -# && cd - - -python3 -m tensorboard.main --logdir logs --port 6006 --host 0.0.0.0 & -python3 train_ms.py -c configs/train_config.json -m 20220306_24000 -fg fine_model/G_180000.pth -fd fine_model/D_180000.pth \ No newline at end of file +#su user +echo "parameter: $@" +exec /usr/sbin/gosu user /bin/bash exec.sh "$@"