From 4839e8214862808bea45b86c7c26ff643b0175ee Mon Sep 17 00:00:00 2001 From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com> Date: Fri, 27 Jun 2025 01:04:18 +0800 Subject: [PATCH] Add Windows Install Powershell Scripts (#2487) --- README.md | 8 ++ docs/cn/README.md | 6 ++ docs/ko/README.md | 6 ++ docs/tr/README.md | 6 ++ install.ps1 | 241 ++++++++++++++++++++++++++++++++++++++++++++++ install.sh | 28 +++--- 6 files changed, 283 insertions(+), 12 deletions(-) create mode 100644 install.ps1 diff --git a/README.md b/README.md index 978bb3c..e67288e 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,14 @@ If you are a Windows user (tested with win>=10), you can [download the integrate **Users in China can [download the package here](https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/dkxgpiy9zb96hob4#KTvnO).** +Install the program by running the following commands: + +```pwsh +conda create -n GPTSoVits python=3.10 +conda activate GPTSoVits +pwsh -F install.ps1 --Device --Source [--DownloadUVR5] +``` + ### Linux ```bash diff --git a/docs/cn/README.md b/docs/cn/README.md index 70ce428..77841b9 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -62,6 +62,12 @@ **中国地区的用户可以[在此处下载整合包](https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/dkxgpiy9zb96hob4#KTvnO).** +```pwsh +conda create -n GPTSoVits python=3.10 +conda activate GPTSoVits +pwsh -F install.ps1 --Device --Source [--DownloadUVR5] +``` + ### Linux ```bash diff --git a/docs/ko/README.md b/docs/ko/README.md index bfc7039..1028c00 100644 --- a/docs/ko/README.md +++ b/docs/ko/README.md @@ -58,6 +58,12 @@ https://github.com/RVC-Boss/GPT-SoVITS/assets/129054828/05bee1fa-bdd8-4d85-9350- Windows 사용자라면 (win>=10에서 테스트됨), [통합 패키지를 다운로드](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-v3lora-20250228.7z?download=true)한 후 압축을 풀고 _go-webui.bat_ 파일을 더블 클릭하면 GPT-SoVITS-WebUI를 시작할 수 있습니다. +```pwsh +conda create -n GPTSoVits python=3.10 +conda activate GPTSoVits +pwsh -F install.ps1 --Device --Source [--DownloadUVR5] +``` + ### Linux ```bash diff --git a/docs/tr/README.md b/docs/tr/README.md index 2ce02b6..dd5d79b 100644 --- a/docs/tr/README.md +++ b/docs/tr/README.md @@ -58,6 +58,12 @@ https://github.com/RVC-Boss/GPT-SoVITS/assets/129054828/05bee1fa-bdd8-4d85-9350- Eğer bir Windows kullanıcısıysanız (win>=10 ile test edilmiştir), [entegre paketi indirin](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-v3lora-20250228.7z?download=true) ve _go-webui.bat_ dosyasına çift tıklayarak GPT-SoVITS-WebUI'yi başlatın. +```pwsh +conda create -n GPTSoVits python=3.10 +conda activate GPTSoVits +pwsh -F install.ps1 --Device --Source [--DownloadUVR5] +``` + ### Linux ```bash diff --git a/install.ps1 b/install.ps1 new file mode 100644 index 0000000..9c33ace --- /dev/null +++ b/install.ps1 @@ -0,0 +1,241 @@ +Param ( + [Parameter(Mandatory=$true)][ValidateSet("CU126", "CU128", "CPU")][string]$Device, + [Parameter(Mandatory=$true)][ValidateSet("HF", "HF-Mirror", "ModelScope")][string]$Source, + [switch]$DownloadUVR5 +) + +$global:ErrorActionPreference = 'Stop' + +trap { + Write-ErrorLog $_ +} + +function Write-ErrorLog { + param ( + [System.Management.Automation.ErrorRecord]$ErrorRecord + ) + + Write-Host "`n[ERROR] Command failed:" -ForegroundColor Red + if (-not $ErrorRecord.Exception.Message){ + } else { + Write-Host "Message:" -ForegroundColor Red + $ErrorRecord.Exception.Message -split "`n" | ForEach-Object { + Write-Host " $_" + } + } + + Write-Host "Command:" -ForegroundColor Red -NoNewline + Write-Host " $($ErrorRecord.InvocationInfo.Line)".Replace("`r", "").Replace("`n", "") + Write-Host "Location:" -ForegroundColor Red -NoNewline + Write-Host " $($ErrorRecord.InvocationInfo.ScriptName):$($ErrorRecord.InvocationInfo.ScriptLineNumber)" + Write-Host "Call Stack:" -ForegroundColor DarkRed + $ErrorRecord.ScriptStackTrace -split "`n" | ForEach-Object { + Write-Host " $_" -ForegroundColor DarkRed + } + + exit 1 +} + +function Write-Info($msg) { + Write-Host "[INFO]:" -ForegroundColor Green -NoNewline + Write-Host " $msg" +} +function Write-Success($msg) { + Write-Host "[SUCCESS]:" -ForegroundColor Blue -NoNewline + Write-Host " $msg" +} + + +function Invoke-Conda { + param ( + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$Args + ) + + $output = & conda install -y -q -c conda-forge @Args 2>&1 + $exitCode = $LASTEXITCODE + + if ($exitCode -ne 0) { + Write-Host "Conda Install $Args Failed" -ForegroundColor Red + $errorMessages = @() + foreach ($item in $output) { + if ($item -is [System.Management.Automation.ErrorRecord]) { + $msg = $item.Exception.Message + Write-Host "$msg" -ForegroundColor Red + $errorMessages += $msg + } + else { + Write-Host $item + $errorMessages += $item + } + } + throw [System.Exception]::new(($errorMessages -join "`n")) + } +} + +function Invoke-Pip { + param ( + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$Args + ) + + $output = & pip install @Args 2>&1 + $exitCode = $LASTEXITCODE + + if ($exitCode -ne 0) { + $errorMessages = @() + Write-Host "Pip Install $Args Failed" -ForegroundColor Red + foreach ($item in $output) { + if ($item -is [System.Management.Automation.ErrorRecord]) { + $msg = $item.Exception.Message + Write-Host "$msg" -ForegroundColor Red + $errorMessages += $msg + } + else { + Write-Host $item + $errorMessages += $item + } + } + throw [System.Exception]::new(($errorMessages -join "`n")) + } +} + +function Invoke-Download { + param ( + [Parameter(Mandatory = $true)] + [string]$Uri, + + [Parameter()] + [string]$OutFile + ) + + try { + $params = @{ + Uri = $Uri + } + + if ($OutFile) { + $params["OutFile"] = $OutFile + } + + $null = Invoke-WebRequest @params -ErrorAction Stop + + } catch { + Write-Host "Failed to download:" -ForegroundColor Red + Write-Host " $Uri" + throw + } +} + +function Invoke-Unzip { + param($ZipPath, $DestPath) + Expand-Archive -Path $ZipPath -DestinationPath $DestPath -Force + Remove-Item $ZipPath -Force +} + +chcp 65001 +Set-Location $PSScriptRoot + +Write-Info "Installing FFmpeg & CMake..." +Invoke-Conda ffmpeg cmake +Write-Success "FFmpeg & CMake Installed" + +$PretrainedURL = "" +$G2PWURL = "" +$UVR5URL = "" +$NLTKURL = "" +$OpenJTalkURL = "" + +switch ($Source) { + "HF" { + Write-Info "Download Model From HuggingFace" + $PretrainedURL = "https://huggingface.co/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/pretrained_models.zip" + $G2PWURL = "https://huggingface.co/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/G2PWModel.zip" + $UVR5URL = "https://huggingface.co/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/uvr5_weights.zip" + $NLTKURL = "https://huggingface.co/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/nltk_data.zip" + $OpenJTalkURL = "https://huggingface.co/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/open_jtalk_dic_utf_8-1.11.tar.gz" + } + "HF-Mirror" { + Write-Info "Download Model From HuggingFace-Mirror" + $PretrainedURL = "https://hf-mirror.com/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/pretrained_models.zip" + $G2PWURL = "https://hf-mirror.com/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/G2PWModel.zip" + $UVR5URL = "https://hf-mirror.com/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/uvr5_weights.zip" + $NLTKURL = "https://hf-mirror.com/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/nltk_data.zip" + $OpenJTalkURL = "https://hf-mirror.com/XXXXRT/GPT-SoVITS-Pretrained/resolve/main/open_jtalk_dic_utf_8-1.11.tar.gz" + } + "ModelScope" { + Write-Info "Download Model From ModelScope" + $PretrainedURL = "https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/pretrained_models.zip" + $G2PWURL = "https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/G2PWModel.zip" + $UVR5URL = "https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/uvr5_weights.zip" + $NLTKURL = "https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/nltk_data.zip" + $OpenJTalkURL = "https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/open_jtalk_dic_utf_8-1.11.tar.gz" + } +} + +if (-not (Test-Path "GPT_SoVITS/pretrained_models/sv")) { + Write-Info "Downloading Pretrained Models..." + Invoke-Download -Uri $PretrainedURL -OutFile "pretrained_models.zip" + Invoke-Unzip "pretrained_models.zip" "GPT_SoVITS" + Write-Success "Pretrained Models Downloaded" +} else { + Write-Info "Pretrained Model Exists" + Write-Info "Skip Downloading Pretrained Models" +} + + +if (-not (Test-Path "GPT_SoVITS/text/G2PWModel")) { + Write-Info "Downloading G2PWModel..." + Invoke-Download -Uri $G2PWURL -OutFile "G2PWModel.zip" + Invoke-Unzip "G2PWModel.zip" "GPT_SoVITS/text" + Write-Success "G2PWModel Downloaded" +} else { + Write-Info "G2PWModel Exists" + Write-Info "Skip Downloading G2PWModel" +} + +if ($DownloadUVR5) { + if (-not (Test-Path "tools/uvr5/uvr5_weights")) { + Write-Info "Downloading UVR5 Models..." + Invoke-Download -Uri $UVR5URL -OutFile "uvr5_weights.zip" + Invoke-Unzip "uvr5_weights.zip" "tools/uvr5" + Write-Success "UVR5 Models Downloaded" + } else { + Write-Info "UVR5 Models Exists" + Write-Info "Skip Downloading UVR5 Models" + } +} + +switch ($Device) { + "CU128" { + Write-Info "Installing PyTorch For CUDA 12.8..." + Invoke-Pip torch torchaudio --index-url "https://download.pytorch.org/whl/cu128" + } + "CU126" { + Write-Info "Installing PyTorch For CUDA 12.6..." + Invoke-Pip torch torchaudio --index-url "https://download.pytorch.org/whl/cu126" + } + "CPU" { + Write-Info "Installing PyTorch For CPU..." + Invoke-Pip torch torchaudio --index-url "https://download.pytorch.org/whl/cpu" + } +} +Write-Success "PyTorch Installed" + +Write-Info "Installing Python Dependencies From requirements.txt..." +Invoke-Pip -r extra-req.txt --no-deps +Invoke-Pip -r requirements.txt +Write-Success "Python Dependencies Installed" + +Write-Info "Downloading NLTK Data..." +Invoke-Download -Uri $NLTKURL -OutFile "nltk_data.zip" +Invoke-Unzip "nltk_data.zip" (python -c "import sys; print(sys.prefix)").Trim() + +Write-Info "Downloading Open JTalk Dict..." +Invoke-Download -Uri $OpenJTalkURL -OutFile "open_jtalk_dic_utf_8-1.11.tar.gz" +$target = (python -c "import os, pyopenjtalk; print(os.path.dirname(pyopenjtalk.__file__))").Trim() +tar -xzf open_jtalk_dic_utf_8-1.11.tar.gz -C $target +Remove-Item "open_jtalk_dic_utf_8-1.11.tar.gz" -Force +Write-Success "Open JTalk Dic Downloaded" + +Write-Success "Installation Completed" diff --git a/install.sh b/install.sh index ea8d2e2..a2fa751 100644 --- a/install.sh +++ b/install.sh @@ -48,11 +48,12 @@ run_pip_quiet() { } run_wget_quiet() { - local output - output=$(wget --tries=25 --wait=5 --read-timeout=40 --retry-on-http-error=404 "$@" 2>&1) || { - echo -e "${ERROR} Wget failed:\n$output" + if wget --tries=25 --wait=5 --read-timeout=40 -q --show-progress "$@" 2>&1; then + tput cuu1 && tput el + else + echo -e "${ERROR} Wget failed" exit 1 - } + fi } if ! command -v conda &>/dev/null; then @@ -171,10 +172,13 @@ if ! $USE_HF && ! $USE_HF_MIRROR && ! $USE_MODELSCOPE; then fi case "$(uname -m)" in - x86_64|amd64) SYSROOT_PKG="sysroot_linux-64>=2.28" ;; - aarch64|arm64) SYSROOT_PKG="sysroot_linux-aarch64>=2.28" ;; - ppc64le) SYSROOT_PKG="sysroot_linux-ppc64le>=2.28" ;; - *) echo "Unsupported architecture: $(uname -m)"; exit 1 ;; +x86_64 | amd64) SYSROOT_PKG="sysroot_linux-64>=2.28" ;; +aarch64 | arm64) SYSROOT_PKG="sysroot_linux-aarch64>=2.28" ;; +ppc64le) SYSROOT_PKG="sysroot_linux-ppc64le>=2.28" ;; +*) + echo "Unsupported architecture: $(uname -m)" + exit 1 + ;; esac # Install build tools @@ -248,10 +252,7 @@ elif [ "$USE_MODELSCOPE" = "true" ]; then PYOPENJTALK_URL="https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/open_jtalk_dic_utf_8-1.11.tar.gz" fi -if find -L "GPT_SoVITS/pretrained_models" -mindepth 1 ! -name '.gitignore' | grep -q .; then - echo -e "${INFO}Pretrained Model Exists" - echo -e "${INFO}Skip Downloading Pretrained Models" -else +if [ ! -d "GPT_SoVITS/pretrained_models/sv" ]; then echo -e "${INFO}Downloading Pretrained Models..." rm -rf pretrained_models.zip run_wget_quiet "$PRETRINED_URL" @@ -259,6 +260,9 @@ else unzip -q -o pretrained_models.zip -d GPT_SoVITS rm -rf pretrained_models.zip echo -e "${SUCCESS}Pretrained Models Downloaded" +else + echo -e "${INFO}Pretrained Model Exists" + echo -e "${INFO}Skip Downloading Pretrained Models" fi if [ ! -d "GPT_SoVITS/text/G2PWModel" ]; then