vits聲音合成-本地部署(windows)-自己組合ai的第二步
這些是vits的衍生版本(沒有配置使用過):
https://github.com/PlayVoice/vits_chinese(不是教程版本)
https://github.com/Plachtaa/VITS-fast-fine-tuning(小白的最好選擇)
https://github.com/svc-develop-team/so-vits-svc(三方維護衍生版)
本文檔基于:
windows11
CUDA 12.1
Anaconda
Anaconda對于配置單個AI可有可無,這是用來用于虛擬多個python環(huán)境,防止之后組合別的ai出現(xiàn)環(huán)境和包不匹配導致安裝多AI失敗的情況,比如擬聲鳥需要的是python3.9,而stablediffusion需要的是python3.10,以及各個包之間會有相同的依賴庫但版本不同
nccl(無法在windows運行),windows使用的是gloo(無需下載文件)
Cmake(需要先下載microsoft visual studio【社區(qū)版就行(community)】)
FFmpeg
顯卡2080ti(很慢,1500的訓練用了一天,一般建議配置不好的各位后面配置config.json的時候填的雖然是10000,但可以在1500左右就使MogGoeGUI跑一下,一般好的訓練材料已經(jīng)可以出效果了)

開始(前置準備):
【這版教程很匆忙,我沒有設置網(wǎng)盤資源】
查看當前電腦的CUDA版本:
打開“命令提示符(CMD)”
輸入nvidia-smi

下載所用文件:
下載vits項目(Github)
https://github.com/jaywalnut310/vits(原版,非教程版,步驟差不多,但是缺少對于中文的支持,動手能力強的可以自己修改其中代碼增加對于中文的支持,尤其是symbol.py和cleaner.py)
github.com/CjangCjengh/vits(Cj中文版vits【大部分改動在對于中文的處理上】)
下載AnaConda(Windows):
https://www.anaconda.com (主頁)
https://repo.anaconda.com/archive/Anaconda3-2023.03-Windows-x86_64.exe
https://mirrors.bfsu.edu.cn/anaconda/(北京外國語大學開源軟件鏡像站)
msvc:
https://visualstudio.microsoft.com/zh-hans/downloads/
下載pytorch文件(以防各種莫名其妙的pytorch報錯):
命令行方式:https://pytorch.org/get-started/locally/
Pytorch下載:
https://download.pytorch.org/whl/ (所有庫下載)
pytorch:
https://download.pytorch.org/whl/torch
cp:python版本(cp310=python3.10版本)
cu:cuda版本(cu118=cuda11.8版本)? ? ?使用顯卡
cu118可以適用于cuda12.1版本
cpu:cpu版本? ? 使用CPU
cpu版本適用于顯卡顯存不足6g的電腦
2.0.0為最新版本
Pytorch Audio
https://download.pytorch.org/whl/torchaudio
Pytorch Vision
https://download.pytorch.org/torchvision/
CUDA下載(CUDA Toolkit):
https://developer.nvidia.com/cuda-downloads?
Git下載(梯子在這個項目中非常重要,最好有梯子):
https://git-scm.com/downloads
需要的軟件:
shotcut(導出音頻文件):
https://www.shotcut.org
buzz(語音轉文字,安裝運行,基于openai的whisper,我項目里直接使用的代碼制作訓練集,放置于評論區(qū))
https://github.com/chidiwilliams/buzz/releases/tag/v0.7.2
audio-slicer(視頻切片,.exe文件運行,可以多切幾次弄多一點訓練材料,參數(shù)自己調整,最好每一條都在5秒以內)
https://github.com/flutydeer/audio-slicer/releases/tag/v1.1.0
Espeak:
https://github.com/espeak-ng/espeak-ng/releases/tag/1.51(只在環(huán)境變量中用到)
FFmpeg:
https://github.com/BtbN/FFmpeg-Builds/releases(win,文件大小126M的版本,只在環(huán)境變量中用到)
MoeGoeGUI:
https://github.com/CjangCjengh/MoeGoe_GUI/issues(用于使用訓練好的模型)

配置環(huán)境變量:
按照自己的安裝路徑修改
PHONEMIZER_ESPEAK_LIBRARY
PHONEMIZER_ESPEAK_PATH


環(huán)境變量(path中):
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp
D:\Microsoft\Microsoft Visual Studio\Visual Studio\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\
C:\Program Files\NVIDIA Corporation\Nsight Compute 2023.1.0\
D:\Microsoft\Microsoft Visual Studio\Visual Studio\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin




假設我的項目路徑在
C:\Users\用戶名\Desktop\AIS\vits-main\
Vits配置安裝:
使用anaconda prompt
conda create -n 名字 想要安裝的包(=指定版本)?
首先使用conda創(chuàng)建一個3.9的python環(huán)境
示例:
conda create -n vits python=3.9?
激活python環(huán)境
conda activate 你的環(huán)境名字

示例:
conda activate vits

cd 你的項目文件夾路徑(之后操作只有安裝依賴文件會改變路徑到monotonic_align下)
示例:
cd C:\Users\用戶名\Desktop\AIS\vits-main\
pip install 下好的torch,torchaudio,torchvision文件路徑
示例:
pip install C:/torch.whl

由于我們安裝好了pytorch,就不使用它自帶的老版本了容易出錯,所以我們需要修改安裝依賴文件
requirement.txt文件內容修改為:
Cython==0.29.21
librosa==0.8.0
matplotlib==3.3.1
numpy==1.18.5
phonemizer==2.2.1
scipy>=1.5.2(可能是python版本問題導致無法安裝1.5.2只能安裝大于1.5.2的版本)
tensorboard==2.3.0
Unidecode==1.1.1
anaconda prompt在項目文件夾路徑下輸入
pip install -r requirement.txt

修改項目文件(極度重要【中文訓練】),盡量避免之后的報錯:
都是項目文件夾下
train.py
52行【原版需要修改】:
os.environ['MASTER_PORT'] = '8000'
67行【windows修改,nccl在windows用不了】:
dist.init_process_group(backend='gloo', init_method='env://', world_size=n_gpus, rank=rank)
104行【問題在下面】:
net_g = DDP(net_g, device_ids=[rank],find_unused_parameters=True)
105行【同104】:
net_d = DDP(net_d, device_ids=[rank],find_unused_parameters=True)
preprocess.py
這個文件中可以不用設置,但在使用預處理命令時需要加上參數(shù)
9行【設置為你制作好的數(shù)據(jù)集文件,_val文件是校驗集】:
parser.add_argument("--filelists", nargs="+", default=["filelists/list.txt", "filelists/list_val.txt"])
10行【中文版設置,原版訓練英文的不用管】:
parser.add_argument("--text_cleaners", nargs="+", default=["chinese_cleaners"])
mel_processing.py
pytorch包太新了導致的
66行,67行【onesided=True后增加,return_complex=False】
spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device],center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)
104行,105行【onesided=True后增加,return_complex=False】
spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)
utils.py
146行,147行【default中為訓練時的config.json文件位置,可以不設置,訓練的時候可以使用-c參數(shù)配置】
parser.add_argument('-c', '--config', type=str, default="./configs/base.json",help='JSON file for configuration')
146行,147行【help中為訓練設置的模型名,可以不設置,訓練的時候可以使用-m參數(shù)配置】
? parser.add_argument('-m', '--model', type=str, required=True,help='Model name')
152行【訓練設置的模型名是個文件夾,在這個文件夾下,實際用到的是G_*.pth這個文件】
model_dir = os.path.join("../drive/MyDrive", args.model)
datautils.py
323行【不設置一定報錯】
for i in range(len(buckets) - 1, -1, -1):

訓練材料(煉丹材料)和list.txt放置方式以及config配置:
訓練集制作【最好沒有背景雜音】
下載視頻,然后使用Shotcut導出為wav,一定要是單聲道不然訓練容易報錯
點擊輸出

參數(shù)為:采樣22050Hz,16bit(16位),單聲道

然后打開audio-slicer:

然后彈出界面,配置參數(shù):

左上點擊選擇文件
參數(shù):
Threshold(dB):低于這個分貝就會切割
Minimum Length(ms):最小的切割長度
Minimum Interval(ms):最小的切割間隔
Hop Size(ms):粗略理解為精確度(10-20就行了)
Maximum Silence Length(ms):最大沉默(無聲)時間
最后這個是輸出目錄
進度條到100%就去文件夾里看看
【假設我導出的文件夾在C:\Users\用戶名\Desktop\AIS\Vedios】
然后使用buzz(沒有批量導出,批量導出還是自己想辦法或者用python自己寫,有人需要的話評論區(qū)留言,下一期我就寫whisper的配置以及在python中的使用)

點擊+號導入文件,可以按住shift批量選,
Tiny改選medium(模型,這個軟件用的是CPU)
Language:選中文(其他語言也可以)
點擊run就行

這樣就是完成

雙擊這條數(shù)據(jù),然后右下角選TXT導出到文件夾中,作為訓練音頻的文本數(shù)據(jù)
【假設我導出的文件夾在C:\Users\用戶名\Desktop\AIS\Txt】
然后制作兩個文件,文件名隨意,但一個是訓練集一個是驗證集,而且是txt文件(無BOM頭),不然訓練時會報錯,文件中的格式參考官方【兩個文件格式一樣】

【官方為多人多訓練數(shù)據(jù)格式】
黃色:audio-slicer切割好的wav音頻文件路徑(絕對路徑最好,相對路徑會計算也可以)
綠色:說話人數(shù)大于一個人時設置,第一個說話的為0,第二個為1以此類推(只有一個人時不寫)
天藍色(湖藍色):文字語言類型(可以不寫)
橙色:音頻文本(涉及訓練質量)
紫色:文字語言類型(可以不寫)
【單個人說話的基本格式】(|:分割符)
音頻文件路徑|音頻文本
示例:
C:\Users\用戶名\Desktop\AIS\Vedios\test.wav|示例文本
(默認說話人為0)
【假設我導出的文件夾在C:\Users\用戶名\Desktop\AIS\vits-main\filelist】
文件名為【list.txt,list_val.txt】
文件路徑為:
【C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list.txt】
【C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list_val.txt】
訓練參數(shù)文件:
以下操作全在
【C:\Users\用戶名\Desktop\AIS\vits-main\】文件夾下(假設的項目文件夾)
config下創(chuàng)建文件(原版基于ljs_base.json,中文版基于chinese_base.json)
【可以復制粘貼然后直接改名】,文件名自定義:
【假設文件名:chinese_config.json】
重要訓練參數(shù):
查看中文版官方給的chinese_base.json為例

eval_interval【保存間隔】:
默認的1000即可以滿足保存的需求,設置過小會訓練過程會耗費大量時間在保存上,設置過大出現(xiàn)問題無法及時保存最近的模型。
epochs【迭代次數(shù)】:
比較好的數(shù)據(jù)集訓練1500次就能出現(xiàn)效果,2000已經(jīng)勉強可以使用,這里建議一萬到兩萬效果最佳,但是那是顯卡好的情況,差的話可能要訓練好幾天,甚至一個月。
batch_size【使用顯存,4:6GB,6:10GB】
(除非富哥或者租卡的,不然不設置就等著一直爆顯存了):
請按照你的顯存酌情修改,否則開始訓練就爆顯存。
fp16_run【半精度訓練】:
默認開啟即可,配置足夠優(yōu)秀可以嘗試關閉。

data部分:
training_files:訓練數(shù)據(jù)文本文件preprocess(預處理)后文件路徑
示例:
C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list.txt.cleaned
validation_files:訓練數(shù)據(jù)驗證文件preprocess(預處理)后文件路徑
示例:
C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list_val.txt.cleaned
text_cleaners【text文件夾下cleaner.py中的def方法,就是這里的名稱】
n_speakers【說話人數(shù)】:
單人改為0
cleaned_text【保持默認的true即可】
【假設配置文件路徑:C:\Users\用戶名\Desktop\AIS\vits-main\config\chinese_config.json】

開始訓練:
回到anaconda prompt:

按照官方給的方式使用:
安裝訓練依賴:
切換到項目下的monotonic_align文件夾
cd?monotonic_align?
python setup.py build_ext --inplace
小坑:
monotonic_align下還要建立一個文件夾叫monotonic_align,不然報錯
回到項目文件夾:
cd ..
預處理:
python preprocess.py --text_index 1 --filelists 兩個list.txt文件的位置,中間用空格分開
示例:
python preprocess.py --text_index 1 --filelists?C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list.txt C:\Users\用戶名\Desktop\AIS\vits-main\filelist\list_val.txt
訓練
python?train.py -c 自定義config.json文件路徑?-m 輸出后的model名稱
#?LJ Speech(常用)
python train.py -c configs/ljs_base.json -m ljs_base
示例:
python train.py -c C:\Users\用戶名\Desktop\AIS\vits-main\config\chinese_config.json -m TestModel【之前文件設置過的話直接python train.py就行了】
#?VCTK
python train_ms.py -c configs/vctk_base.json -m vctk_base
示例:
python train_ms.py -c?C:\Users\用戶名\Desktop\AIS\vits-main\config\chinese_config.json?-m TestModel【之前文件設置過的話直接python train_ms.py就行了】

訓練模型使用
====> Epoch:1【顯示這個就是開始訓練了】

?訓練模型存放位置默認為項目文件的上一級文件夾的drive文件夾中
打開MoeGoe

打開文件是他自己的.exe
打開模型選擇【G_數(shù)字.pth】
示例:G_81000.pth
打開配置選擇【config.json】
config.json是在訓練后的模型這個文件夾中的,不要選項目文件夾中的那個,雖然文件格式一樣,但就怕出bug
然后說話人選之前文本中設置過的,單人為0
點擊保存,保存后的文件為wav文件

問題總覽:
包問題【No module named】(一律使用pip解決)
No module named 'numpy.random.bit_generator'
pip install numpy==1.19.3
TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are: 1. Downgrade the protobuf package to 3.20.x or lower. 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
pip install protobuf==3.20.0
問題:
ValueError: port must have value from 0 to 65535 but was 80000.
解決方法:
修改train.py或train_ms.py文件
? os.environ['MASTER_PORT'] = '80000'
改為沒被占用的端口號(80,3306,22,21,20,443等常用端口不要去設置,比如:網(wǎng)頁常用端口,后端和數(shù)據(jù)庫常用端口,應用服務已占用端口如微信、MC服務器等,服務占用的端口,數(shù)據(jù)庫常用端口,文件傳輸常用端口,各種協(xié)議如郵件傳輸協(xié)議的常用端口等端口,一定需要避免設置這些端口,且范圍控制在0~65535中)
例子:os.environ['MASTER_PORT'] =?'5321'
問題:
導致vits在windows上無法一次啟動的原因:
RuntimeError("Distributed package doesn't have NCCL " "built in")
RuntimeError: Distributed package doesn't have NCCL built in
解決方法:
(Linux)
https://developer.nvidia.com/nccl
https://docs.nvidia.com/deeplearning/nccl/install-guide/index.html
(windows)
修改train.py或者train_ms.py文件
init_process_group(backend="gloo", init_method="env://")
問題:
opencc的包導入問題
解決方法:
注釋所有text文件夾中使用opencc的地方,因為很難裝,有成功裝好的希望給出解決方式在評論區(qū)
問題:
NotImplementedError: Only 2D, 3D, 4D, 5D padding with non-constant padding are supported for now?
解決方法:
重新制作數(shù)據(jù)集,數(shù)據(jù)集需要是22050Hz,16bit,單聲道(重要?。。。?/span>
問題:
stft will soon require the return_complex parameter be given for real inputs, and will further require that return_complex=True
解決方法:
修改mel_processing.py文件
spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[str(y.device)], center=center, pad_mode='reflect', normalized=False, onesided=True,return_complex=False)
在出現(xiàn)STFT處增加False消除警告
問題
RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss
解決方法:
修改train.py或者train_ms.py文件
將104和105行模型的參數(shù)后加上find_unused_parameters=True
注:但是find_unused_parameters=True的設置會帶來額外的運行時開銷(而且還不小)。
其他問題解決方案:
https://www.bilibili.com/read/cv22206231/(多錯誤集合)
https://www.bilibili.com/read/cv21153903(很有用)
https://github.com/jaywalnut310/vits/issues(github評論區(qū))