|
INSTALL_DIR=/usr/local/vits-simple-api |
|
|
|
RED='\033[0;31m' |
|
GREEN='\033[0;32m' |
|
YELLOW='\033[0;33m' |
|
PLAIN='\033[0m' |
|
|
|
declare -A EN_MESSAGES |
|
declare -A ZH_MESSAGES |
|
|
|
EN_MESSAGES=( |
|
["ATTEMPT_DOWNLOAD"]="Attempting to download" |
|
["FROM"]="from" |
|
["DOWNLOAD_FAIL"]="Failed to download" |
|
["FROM_ALL_URLS"]="from all provided URLs." |
|
["DOWNLOADING"]="Downloading..." |
|
["VERIFYING"]="Verifying..." |
|
["UNZIPPING"]="Unzipping..." |
|
["CHOOSE_VERSION"]="Which version of docker-compose.yaml do you want to download?" |
|
["DOCKER_CPU"]="docker-compose.yaml (CPU version)" |
|
["DOCKER_GPU"]="docker-compose-gpu.yaml (GPU version)" |
|
["ENTER_CHOICE"]="Enter your choice (1 or 2): " |
|
["INVALID_CHOICE"]="Invalid choice. Please enter 1 or 2." |
|
["DOWNLOAD_CONFIG"]="Downloading configuration file shortly..." |
|
["PULL_IMAGE"]="Do you want to start pulling the image? Enter 1 for yes or 2 for no" |
|
["DOWNLOAD_DICT"]="Do you want to download the pyopenjtalk dictionary file? Enter 1 for yes or 2 for no" |
|
["MUST_DOWNLOAD_JP"]="Japanese model must be downloaded." |
|
["DOWNLOAD_VITS_CHINESE"]="Do you want to download the bert model for vits_chinese? Enter 1 for yes, 2 for no." |
|
["MUST_DOWNLOAD_VITS_CHINESE"]="Using vits_chinese requires downloading these models, which will take up about 410MB." |
|
["DOWNLOAD_BERT_VITS2"]="Do you want to download chinese-roberta-wwm-ext-large? Enter 1 for yes or 2 for no" |
|
["MUST_DOWNLOAD_BERT_VITS2"]="To use Bert-VITS2, you must download these models, which will take up about 3.64GB." |
|
["DOWNLOADED"]="File is downloaded correctly." |
|
["CORRUPTED"]="File is corrupted or incomplete." |
|
["INSTALL_COMPLETE"]="The upgrade or installation has been completed." |
|
["CONFIG_DIR"]="The configuration file directory is" |
|
["IMPORT_NOTICE"]="If the vits model is not imported, it cannot be used. Import the model in the configuration file directory." |
|
["RESTART_NOTICE"]="After modifying the configuration file, restart the docker container for the modification to take effect." |
|
["ISSUE_NOTICE"]="If you have any questions, please put them in the issues." |
|
["GITHUB_LINK"]="https://github.com/Artrajz/vits-simple-api" |
|
) |
|
|
|
ZH_MESSAGES=( |
|
["ATTEMPT_DOWNLOAD"]="正在尝试下载" |
|
["FROM"]="从" |
|
["DOWNLOAD_FAIL"]="都下载失败" |
|
["FROM_ALL_URLS"]="从所有提供的URLs" |
|
["DOWNLOADING"]="正在下载..." |
|
["VERIFYING"]="正在校验" |
|
["UNZIPPING"]="正在解压..." |
|
["CHOOSE_VERSION"]="你想下载哪个版本的docker-compose.yaml?" |
|
["DOCKER_CPU"]="docker-compose.yaml (CPU版本)" |
|
["DOCKER_GPU"]="docker-compose-gpu.yaml (GPU版本)" |
|
["ENTER_CHOICE"]="请输入您的选择 (1 或 2): " |
|
["INVALID_CHOICE"]="无效选择。 请重新输入 1 或 2。" |
|
["DOWNLOAD_CONFIG"]="即将下载配置文件..." |
|
["PULL_IMAGE"]="是否要开始拉取镜像?输入1表示是,2表示否。" |
|
["DOWNLOAD_DICT"]="是否要下载pyopenjtalk的词典文件?输入1表示是,2表示否。" |
|
["MUST_DOWNLOAD_JP"]="使用日语模型必须下载该词典文件,将占用大约102MB。" |
|
["DOWNLOAD_VITS_CHINESE"]="是否要下载vits_chinese的bert模型?输入1表示是,2表示否。" |
|
["MUST_DOWNLOAD_VITS_CHINESE"]="使用vits_chinese必须下载这些模型,将占用大约410MB。" |
|
["DOWNLOAD_BERT_VITS2"]="是否要下载chinese-roberta-wwm-ext-large?输入1表示是,2表示否。" |
|
["MUST_DOWNLOAD_BERT_VITS2"]="使用Bert-VITS2必须下载这些模型,将占用大约3.64GB。" |
|
["DOWNLOADED"]="文件已正确下载。" |
|
["CORRUPTED"]="文件已损坏或不完整。" |
|
["INSTALL_COMPLETE"]="更新或安装已完成。" |
|
["CONFIG_DIR"]="配置文件目录是" |
|
["IMPORT_NOTICE"]="如果vits模型没有被导入,它是无法使用的。请在配置文件目录中导入模型。" |
|
["RESTART_NOTICE"]="修改配置文件后,请重启docker容器以使修改生效。" |
|
["ISSUE_NOTICE"]="如果你有任何问题,请在issues中提出,或者加入q群提问。" |
|
["GITHUB_LINK"]="https://github.com/Artrajz/vits-simple-api" |
|
) |
|
|
|
echo -e "${PLAIN}${GREEN}Choose a language/选择语言: ${PLAIN}" |
|
echo "1. English" |
|
echo "2. 中文" |
|
read -p "Enter your choice (1 or 2): " choice_language |
|
|
|
declare -A MESSAGES |
|
if [ "$choice_language" -eq 1 ]; then |
|
for key in "${!EN_MESSAGES[@]}"; do |
|
MESSAGES["$key"]="${EN_MESSAGES[$key]}" |
|
done |
|
else |
|
for key in "${!ZH_MESSAGES[@]}"; do |
|
MESSAGES["$key"]="${ZH_MESSAGES[$key]}" |
|
done |
|
fi |
|
|
|
mkdir -p $INSTALL_DIR |
|
cd $INSTALL_DIR |
|
|
|
download_with_fallback() { |
|
local filename=$1 |
|
shift |
|
|
|
local success=0 |
|
local url |
|
for url in "$@"; do |
|
echo -e "${YELLOW}${MESSAGES["ATTEMPT_DOWNLOAD"]} $filename ${MESSAGES["FROM"]} $url\n${PLAIN}" |
|
if wget -O "$INSTALL_DIR/$filename" "$url"; then |
|
success=1 |
|
break |
|
fi |
|
done |
|
|
|
if [ "$success" -ne 1 ]; then |
|
echo -e "${RED} $filename ${MESSAGES["FROM_ALL_URLS"]} ${MESSAGES["DOWNLOAD_FAIL"]}${PLAIN}" |
|
exit 1 |
|
fi |
|
} |
|
|
|
version_gt() { |
|
test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1" |
|
} |
|
|
|
while true; do |
|
echo -e "${GREEN}${MESSAGES["CHOOSE_VERSION"]}${PLAIN}" |
|
echo -e "1. ${MESSAGES["DOCKER_CPU"]}" |
|
echo -e "2. ${MESSAGES["DOCKER_GPU"]}" |
|
read -p "${MESSAGES["ENTER_CHOICE"]}" choice_gpu |
|
case $choice_gpu in |
|
1) |
|
echo -e "${MESSAGES["DOWNLOADING"]}" |
|
download_with_fallback docker-compose.yaml \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/docker-compose.yaml" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/docker-compose.yaml" |
|
break |
|
;; |
|
2) |
|
echo -e "${MESSAGES["DOWNLOADING"]}" |
|
download_with_fallback docker-compose.yaml \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/docker-compose-gpu.yaml" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/docker-compose-gpu.yaml" |
|
break |
|
;; |
|
*) |
|
echo -e "${RED}${MESSAGES["INVALID_CHOICE"]}${PLAIN}" |
|
;; |
|
esac |
|
done |
|
|
|
if [ "$choice_gpu" -eq 2 ]; then |
|
DOCKER_VERSION=$(docker version --format '{{.Server.Version}}') |
|
MIN_DOCKER_VERSION="19.03" |
|
|
|
if version_gt $MIN_DOCKER_VERSION $DOCKER_VERSION; then |
|
echo -e "${RED}Your Docker version ($DOCKER_VERSION) does not support GPU. You need at least version $MIN_DOCKER_VERSION.${PLAIN}" |
|
exit 1 |
|
fi |
|
fi |
|
|
|
if ! command -v docker-compose &>/dev/null; then |
|
echo -e "${RED}docker-compose could not be found.${PLAIN}" |
|
exit 1 |
|
fi |
|
|
|
echo -e "${GREEN}${MESSAGES["PULL_IMAGE"]}${PLAIN}" |
|
read -p "${MESSAGES["ENTER_CHOICE"]}" choice_pull |
|
|
|
if [ "$choice_pull" -eq 1 ]; then |
|
docker compose pull |
|
docker compose up -d |
|
fi |
|
|
|
echo -e "${YELLOW}${MESSAGES["DOWNLOAD_CONFIG"]}${PLAIN}" |
|
|
|
if [ ! -f config.py ]; then |
|
download_with_fallback config.py \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/config.py" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/config.py" |
|
fi |
|
|
|
if [ ! -f gunicorn_config.py ]; then |
|
download_with_fallback gunicorn_config.py \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/gunicorn_config.py" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/gunicorn_config.py" |
|
fi |
|
|
|
download_with_fallback config.example.py \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/config.py" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/config.py" |
|
|
|
download_with_fallback gunicorn_config.example.py \ |
|
"https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/gunicorn_config.py" \ |
|
"https://ghproxy.com/https://raw.githubusercontent.com/Artrajz/vits-simple-api/main/gunicorn_config.py" |
|
|
|
echo -e "${GREEN}${MESSAGES["DOWNLOAD_DICT"]}${PLAIN}" |
|
echo -e "${GREEN}${MESSAGES["MUST_DOWNLOAD_JP"]}${PLAIN}" |
|
read -p "${MESSAGES["ENTER_CHOICE"]}" choice_download_pyopenjtalk |
|
|
|
if [ "$choice_download_pyopenjtalk" -eq 1 ]; then |
|
mkdir -p pyopenjtalk |
|
echo -e "${MESSAGES["DOWNLOADING"]}" |
|
download_with_fallback open_jtalk_dic_utf_8-1.11.tar.gz \ |
|
"https://github.com/r9y9/open_jtalk/releases/download/v1.11.1/open_jtalk_dic_utf_8-1.11.tar.gz" \ |
|
"https://ghproxy.com/https://github.com/r9y9/open_jtalk/releases/download/v1.11.1/open_jtalk_dic_utf_8-1.11.tar.gz" |
|
echo -e "${MESSAGES["UNZIPPING"]}" |
|
tar -xzvf open_jtalk_dic_utf_8-1.11.tar.gz -C pyopenjtalk/ |
|
rm open_jtalk_dic_utf_8-1.11.tar.gz |
|
fi |
|
|
|
echo -e "${GREEN}${MESSAGES["DOWNLOAD_VITS_CHINESE"]}${PLAIN}" |
|
echo -e "${GREEN}${MESSAGES["MUST_DOWNLOAD_VITS_CHINESE"]}${PLAIN}" |
|
read -p "${MESSAGES["ENTER_CHOICE"]}" choice_download_vits_chinese |
|
|
|
if [ "$choice_download_vits_chinese" -eq 1 ]; then |
|
mkdir -p vits/bert |
|
|
|
EXPECTED_MD5="dea78034433141adc8002404aa1b3184" |
|
FILE_PATH="vits/bert/prosody_model.pt" |
|
echo -e "${MESSAGES["VERIFYING"]}$FILE_PATH" |
|
ACTUAL_MD5=$(md5sum $FILE_PATH | awk '{print $1}') |
|
|
|
if [ "$EXPECTED_MD5" == "$ACTUAL_MD5" ]; then |
|
echo "${MESSAGES["DOWNLOADED"]}" |
|
else |
|
echo "${MESSAGES["CORRUPTED"]}" |
|
download_with_fallback vits/bert/prosody_model.pt \ |
|
"https://huggingface.co/spaces/maxmax20160403/vits_chinese/resolve/main/bert/prosody_model.pt" |
|
fi |
|
|
|
fi |
|
|
|
echo -e "${GREEN}${MESSAGES["DOWNLOAD_BERT_VITS2"]}${PLAIN}" |
|
echo -e "${GREEN}${MESSAGES["MUST_DOWNLOAD_BERT_VITS2"]}${PLAIN}" |
|
read -p "${MESSAGES["ENTER_CHOICE"]}" choice_download_bert_vits2 |
|
|
|
if [ "$choice_download_bert_vits2" -eq 1 ]; then |
|
mkdir -p bert_vits2/bert/chinese-roberta-wwm-ext-large |
|
|
|
EXPECTED_MD5="15d7435868fef1bd4222ff7820149a2a" |
|
FILE_PATH="bert_vits2/bert/chinese-roberta-wwm-ext-large/pytorch_model.bin" |
|
echo -e "${MESSAGES["VERIFYING"]}$FILE_PATH" |
|
ACTUAL_MD5=$(md5sum $FILE_PATH | awk '{print $1}') |
|
|
|
if [ "$EXPECTED_MD5" == "$ACTUAL_MD5" ]; then |
|
echo "${MESSAGES["DOWNLOADED"]}" |
|
else |
|
echo ${MESSAGES["CORRUPTED"]} |
|
download_with_fallback bert_vits2/bert/chinese-roberta-wwm-ext-large/pytorch_model.bin \ |
|
"https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/resolve/main/pytorch_model.bin" |
|
fi |
|
|
|
fi |
|
|
|
if [ "$choice_gpu" -eq 2 ]; then |
|
if ! docker run --gpus all artrajz/vits-simple-api:latest-gpu nvidia-smi &>/dev/null; then |
|
echo -e "${RED}Your Docker does not seem to support GPU or NVIDIA Docker is not installed properly.${PLAIN}" |
|
exit 1 |
|
fi |
|
fi |
|
|
|
echo -e "\n${MESSAGES["INSTALL_COMPLETE"]}" |
|
echo -e "${MESSAGES["CONFIG_DIR"]} $(realpath $INSTALL_DIR)" |
|
echo -e "${YELLOW}${MESSAGES["IMPORT_NOTICE"]}${PLAIN}" |
|
echo -e "${YELLOW}${MESSAGES["RESTART_NOTICE"]}${PLAIN}" |
|
echo -e "${MESSAGES["ISSUE_NOTICE"]}" |
|
echo -e "${MESSAGES["GITHUB_LINK"]}" |
|
|