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"