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 1.63GB." ["DOWNLOADED"]="File is downloaded correctly." ["CORRUPTED"]="The file may not have been downloaded, or the download might be incomplete, and it could also be corrupted." ["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必须下载这些模型,将占用大约1.63GB。" ["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 # Shift arguments to the left to handle URLs 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 mkdir -p bert_vits2/bert/bert-base-japanese-v3 EXPECTED_MD5="6d0f8f3503dae04df0711b6175ef0c8e" FILE_PATH="bert_vits2/bert/bert-base-japanese-v3/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/bert-base-japanese-v3/pytorch_model.bin \ "https://huggingface.co/cl-tohoku/bert-base-japanese-v3/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"]}"