SoftVC VITS Singing Voice Conversion 教程
?SoftVC VITS Singing Voice Conversion 教程目錄
參考資料
我寫的教程文檔:https://github.com/SUC-DriverOld/so-vits-svc-Chinese-Detaild-Documents
官方README文檔:https://github.com/svc-develop-team/so-vits-svc
一些報(bào)錯(cuò)的解決辦法(來(lái)自B站up:羽毛布団):https://www.bilibili.com/read/cv22206231
0. 用前須知
????????????? 法律依據(jù)
????????????? 硬件需求
????????????? 提前準(zhǔn)備
????????????? 訓(xùn)練周期
1. 環(huán)境依賴
涉及軟件:Cuda,Python,F(xiàn)Fmpeg
????????????? Cuda
????????????? Python
????????????? Pytorch
????????????? 依賴庫(kù)
????????????? FFmpeg
2. 配置及訓(xùn)練
涉及軟件:slicer-gui,Audition
????????????? 預(yù)下載模型及預(yù)下載底模
????????????? 訓(xùn)練集準(zhǔn)備
–??????????? 數(shù)據(jù)集準(zhǔn)備
–??????????? 數(shù)據(jù)集預(yù)處理
????????????? 訓(xùn)練
–??????????? 主模型訓(xùn)練
–??????????? 擴(kuò)散訓(xùn)練(可選)
–??????????? 使用Tensorboard跟進(jìn)訓(xùn)練進(jìn)度及收斂判斷
3. 推理
涉及軟件:Ultimate Vocal Remover
????????????? 命令行推理
????????????? WebUI推理
4. 增強(qiáng)效果的可選項(xiàng)
????????????? 自動(dòng)f0預(yù)測(cè)
????????????? 聚類音色泄漏控制
????????????? 特征檢索
5. 其他可選項(xiàng)
????????????? 模型壓縮
????????????? 聲線混合(本教程不講)
–??????????? 靜態(tài)聲線混合(本教程不講)
–??????????? 動(dòng)態(tài)聲線混合(本教程不講)
????????????? Onnx導(dǎo)出(本教程不講)
6. 簡(jiǎn)單混音處理及成品導(dǎo)出
????????????? 以FL Studio或Studio One為例
附錄:常見(jiàn)報(bào)錯(cuò)的解決辦法
?
SoftVC VITS Singing Voice Conversion 教程
?0. 用前須知
0.0 任何國(guó)家,地區(qū),組織和個(gè)人使用此項(xiàng)目必須遵守以下法律
《民法典》
第一千零一十九條
任何組織或者個(gè)人不得以丑化、污損,或者利用信息技術(shù)手段偽造等方式侵害他人的肖像權(quán)。未經(jīng)肖像權(quán)人同意,不得制作、使用、公開肖像權(quán)人的肖像,但是法律另有規(guī)定的除外。未經(jīng)肖像權(quán)人同意,肖像作品權(quán)利人不得以發(fā)表、復(fù)制、發(fā)行、出租、展覽等方式使用或者公開肖像權(quán)人的肖像。對(duì)自然人聲音的保護(hù),參照適用肖像權(quán)保護(hù)的有關(guān)規(guī)定。
對(duì)自然人聲音的保護(hù),參照適用肖像權(quán)保護(hù)的有關(guān)規(guī)定
第一千零二十四條
【名譽(yù)權(quán)】民事主體享有名譽(yù)權(quán)。任何組織或者個(gè)人不得以侮辱、誹謗等方式侵害他人的名譽(yù)權(quán)。
第一千零二十七條
【作品侵害名譽(yù)權(quán)】行為人發(fā)表的文學(xué)、藝術(shù)作品以真人真事或者特定人為描述對(duì)象,含有侮辱、誹謗內(nèi)容,侵害他人名譽(yù)權(quán)的,受害人有權(quán)依法請(qǐng)求該行為人承擔(dān)民事責(zé)任。行為人發(fā)表的文學(xué)、藝術(shù)作品不以特定人為描述對(duì)象,僅其中的情節(jié)與該特定人的情況相似的,不承擔(dān)民事責(zé)任。
《中華人民共和國(guó)憲法》
《中華人民共和國(guó)刑法》
《中華人民共和國(guó)民法典》
本教程僅供交流與學(xué)習(xí)使用,請(qǐng)勿用于違法違規(guī)或違反公序良德等不良用途
出于對(duì)音源提供者的尊重請(qǐng)勿用于鬼畜用途
0.0.1. 繼續(xù)使用視為已同意本教程所述相關(guān)條例,本教程已進(jìn)行勸導(dǎo)義務(wù),不對(duì)后續(xù)可能存在問(wèn)題負(fù)責(zé)。
1.????????? 本教程內(nèi)容僅代表個(gè)人,均不代表so-vits-svc團(tuán)隊(duì)及原作者觀點(diǎn)
2.????????? 本教程涉及到的開源代碼請(qǐng)自行遵守其開源協(xié)議
3.????????? 本教程默認(rèn)使用由so-vits-svc團(tuán)隊(duì)維護(hù)的倉(cāng)庫(kù)
4.????????? 若制作視頻發(fā)布,推薦注明使用項(xiàng)目的Github鏈接,tag推薦使用so-vits-svc以便和其他基于技術(shù)進(jìn)行區(qū)分
5.????????? 云端訓(xùn)練和推理部分可能涉及資金使用,如果你是未成年人,請(qǐng)?jiān)?strong>獲得監(jiān)護(hù)人的許可與理解后進(jìn)行,未經(jīng)許可引起的后續(xù)問(wèn)題,本教程概不負(fù)責(zé)
6.????????? 本地訓(xùn)練(尤其是在硬件較差的情況下)可能需要設(shè)備長(zhǎng)時(shí)間高負(fù)荷運(yùn)行,請(qǐng)做好設(shè)備養(yǎng)護(hù)和散熱措施
7.????????? 請(qǐng)確保你制作數(shù)據(jù)集的數(shù)據(jù)來(lái)源合法合規(guī),且數(shù)據(jù)提供者明確你在制作什么以及可能造成的后果
8.????????? 出于設(shè)備原因,本教程僅在Windows系統(tǒng)下進(jìn)行過(guò)測(cè)試,Mac和Linux請(qǐng)確保自己有一定解決問(wèn)題能力
9.????????? 該項(xiàng)目為歌聲合成項(xiàng)目,無(wú)法進(jìn)行其他用途,請(qǐng)知悉
0.0.2. 聲明
本項(xiàng)目為開源、離線的項(xiàng)目,SvcDevelopTeam的所有成員與本項(xiàng)目的所有開發(fā)者以及維護(hù)者(以下簡(jiǎn)稱貢獻(xiàn)者)對(duì)本項(xiàng)目沒(méi)有控制力。本項(xiàng)目的貢獻(xiàn)者從未向任何組織或個(gè)人提供包括但不限于數(shù)據(jù)集提取、數(shù)據(jù)集加工、算力支持、訓(xùn)練支持、推理等一切形式的幫助;本項(xiàng)目的貢獻(xiàn)者不知曉也無(wú)法知曉使用者使用該項(xiàng)目的用途。故一切基于本項(xiàng)目訓(xùn)練的AI模型和合成的音頻都與本項(xiàng)目貢獻(xiàn)者無(wú)關(guān)。一切由此造成的問(wèn)題由使用者自行承擔(dān)。
此項(xiàng)目完全離線運(yùn)行,不能收集任何用戶信息或獲取用戶輸入數(shù)據(jù)。因此,這個(gè)項(xiàng)目的貢獻(xiàn)者不知道所有的用戶輸入和模型,因此不負(fù)責(zé)任何用戶輸入。
本項(xiàng)目只是一個(gè)框架項(xiàng)目,本身并沒(méi)有語(yǔ)音合成的功能,所有的功能都需要用戶自己訓(xùn)練模型。同時(shí),這個(gè)項(xiàng)目沒(méi)有任何模型,任何二次分發(fā)的項(xiàng)目都與這個(gè)項(xiàng)目的貢獻(xiàn)者無(wú)關(guān)。
0.0.3. 使用規(guī)約
Warning:請(qǐng)自行解決數(shù)據(jù)集授權(quán)問(wèn)題,禁止使用非授權(quán)數(shù)據(jù)集進(jìn)行訓(xùn)練!任何由于使用非授權(quán)數(shù)據(jù)集進(jìn)行訓(xùn)練造成的問(wèn)題,需自行承擔(dān)全部責(zé)任和后果!與倉(cāng)庫(kù)、倉(cāng)庫(kù)維護(hù)者、svc develop team、教程發(fā)布者 無(wú)關(guān)
1.????????? 本項(xiàng)目是基于學(xué)術(shù)交流目的建立,僅供交流與學(xué)習(xí)使用,并非為生產(chǎn)環(huán)境準(zhǔn)備。
2.????????? 任何發(fā)布到視頻平臺(tái)的基于 sovits 制作的視頻,都必須要在簡(jiǎn)介明確指明用于變聲器轉(zhuǎn)換的輸入源歌聲、音頻,例如:使用他人發(fā)布的視頻 / 音頻,通過(guò)分離的人聲作為輸入源進(jìn)行轉(zhuǎn)換的,必須要給出明確的原視頻、音樂(lè)鏈接;若使用是自己的人聲,或是使用其他歌聲合成引擎合成的聲音作為輸入源進(jìn)行轉(zhuǎn)換的,也必須在簡(jiǎn)介加以說(shuō)明。
3.????????? 由輸入源造成的侵權(quán)問(wèn)題需自行承擔(dān)全部責(zé)任和一切后果。使用其他商用歌聲合成軟件作為輸入源時(shí),請(qǐng)確保遵守該軟件的使用條例,注意,許多歌聲合成引擎使用條例中明確指明不可用于輸入源進(jìn)行轉(zhuǎn)換!
4.????????? 禁止使用該項(xiàng)目從事違法行為與宗教、政治等活動(dòng),該項(xiàng)目維護(hù)者堅(jiān)決抵制上述行為,不同意此條則禁止使用該項(xiàng)目。
5.????????? 繼續(xù)使用視為已同意本倉(cāng)庫(kù) README 所述相關(guān)條例,本倉(cāng)庫(kù) README 已進(jìn)行勸導(dǎo)義務(wù),不對(duì)后續(xù)可能存在問(wèn)題負(fù)責(zé)。
6.????????? 如果將此項(xiàng)目用于任何其他企劃,請(qǐng)?zhí)崆奥?lián)系并告知本倉(cāng)庫(kù)作者,十分感謝。
0.1 硬件需求
1.????????? 推理目前分為命令行推理和WebUI推理,對(duì)速度要求不高的話CPU和GPU均可使用
2.????????? 至少需要6G以上顯存的NVIDIA顯卡(如RTX3060)
3.????????? 云端一般常見(jiàn)的為V100(16G)、V100(32G)、A100(40G)、A100(80G)等顯卡,部分云端提供RTX3090等顯卡
0.2 提前準(zhǔn)備
1.????????? 至少準(zhǔn)備200條8s(約30分鐘持續(xù)說(shuō)話時(shí)長(zhǎng),即約1.5小時(shí)正常說(shuō)話采樣)左右時(shí)長(zhǎng)的干凈人聲(無(wú)底噪,無(wú)混響)作為訓(xùn)練集。并且最好保持說(shuō)話者情緒起伏波動(dòng)較小,人聲響度合適,并且做好響度匹配
2.????????? 請(qǐng)?zhí)崆皽?zhǔn)備訓(xùn)練需要用到的底模(挺重要的)
3.????????? 須知:歌聲作為訓(xùn)練集只能用來(lái)推理歌聲,但語(yǔ)音作為訓(xùn)練集即可以推理歌聲,也可以用來(lái)生成TTS。但用語(yǔ)音作為訓(xùn)練集可能使高音和低音推理出現(xiàn)問(wèn)題(即缺少高低音訓(xùn)練樣本),有一種可行的解決方法是模型融合。
4.????????? 推理:需準(zhǔn)備底噪<30dB,盡量不要帶過(guò)多混響和和聲的干音進(jìn)行推理
5.????????? 須知:推理女聲歌曲時(shí),建議用女聲訓(xùn)練模型,同理男聲也類似
0.3 訓(xùn)練周期
在有底模的前提下,選取200條音頻作為訓(xùn)練集,經(jīng)多次測(cè)試(RTX3060, batch_size = 3)得到以下結(jié)論:
1.????????? 模型達(dá)到基本收斂的訓(xùn)練步數(shù)10w+(若每晚訓(xùn)練約8小時(shí),需要約7天+)
2.????????? 模型大概能用(一些高低音可能有問(wèn)題)的訓(xùn)練步數(shù)約2w-3w(若每晚訓(xùn)練約8小時(shí),需要約2-3天)
3.????????? 模型基本能用(沒(méi)大問(wèn)題)的訓(xùn)練步數(shù)約5w-8w(若每晚訓(xùn)練約8小時(shí),需要約4-5天)
?
?1. 環(huán)境依賴
????????????? 本項(xiàng)目需要的環(huán)境:
NVIDIA-CUDA
Python = 3.8.9
Pytorch
FFmpeg
1.1 Cuda
????????????? 在cmd控制臺(tái)里輸入nvidia-smi.exe以查看顯卡驅(qū)動(dòng)版本和對(duì)應(yīng)的cuda版本
????????????? 前往 NVIDIA-Developer 官網(wǎng)下載與系統(tǒng)對(duì)應(yīng)的Cuda版本
以Cuda-11.7版本為例(注:本文下述所有配置均在Cuda-11.7下演示)Cuda11.7下載地址 根據(jù)自己的系統(tǒng)和需求選擇安裝(一般本地Windows用戶請(qǐng)依次選擇Windows, x86_64, 系統(tǒng)版本, exe(local))
????????????? 安裝成功之后在cmd控制臺(tái)中輸入nvcc -V, 出現(xiàn)類似以下內(nèi)容則安裝成功:
??? nvcc: NVIDIA (R) Cuda compiler driver
??? Copyright (c) 2005-2022 NVIDIA Corporation
??? Built on Tue_May__3_19:00:59_Pacific_Daylight_Time_2022
??? Cuda compilation tools, release 11.7, V11.7.64
??? Build cuda_11.7.r11.7/compiler.31294372_0
特別注意!
????????????? 目前(2023/3/28)為止pytorch最高支持到cuda11.7
????????????? 如果您在上述第一步中查看到自己的Cuda版本>11.7,請(qǐng)依然選擇11.7進(jìn)行下載安裝(Cuda有版本兼容性)并且安裝完成后再次在cmd輸入nvidia-smi.exe并不會(huì)出現(xiàn)cuda版本變化,即任然顯示的是>11,7的版本
????????????? Cuda的卸載方法:打開控制面板-程序-卸載程序,將帶有NVIDIA CUDA的程序全部卸載即可(一共5個(gè))
1.2 Python
????????????? 前往 Python官網(wǎng) 下載Python,版本需要低于3.10(詳細(xì)安裝方法以及添加Path此處省略,網(wǎng)上隨便一查都有)
????????????? 安裝完成后在cmd控制臺(tái)中輸入python出現(xiàn)類似以下內(nèi)容則安裝成功:
??? Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
??? Type "help", "copyright", "credits" or "license" for more information.
??? >>>
????????????? 配置python下載鏡像源(有國(guó)外網(wǎng)絡(luò)條件可跳過(guò))
在cmd控制臺(tái)依次執(zhí)行
??? # 設(shè)置清華大學(xué)下載鏡像
??? pip config set global.index-url http://pypi.tuna.tsinghua.edu.cn/simple
??? pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
1.3 Pytorch
????????????? 首先我們需要單獨(dú)安裝torch, torchaudio, torchvision這三個(gè)庫(kù),下面提供兩種方法
方法1(便捷)
直接前往 Pytorch官網(wǎng) 選擇所需版本然后復(fù)制Run this Command欄顯示的命令至cmd安裝(不建議)
方法2(較慢但穩(wěn)定)
????????????? 前往該地址使用Ctrl+F搜索直接下載whl包 點(diǎn)擊前往
–??????????? 這個(gè)項(xiàng)目需要的是
torch==1.10.0+cu113
torchaudio==0.10.0+cu113
1.10.0和 0.10.0表示是pytorch版本,cu113表示cuda版本11.3
以此類推,請(qǐng)選擇適合自己的版本安裝
????????????? 下面我將以Cuda11.7版本為例
--示例開始--
–??????????? 我們需要安裝以下三個(gè)庫(kù)
1.????????? torch-1.13.0+cu117-cp310-cp310-win_amd64.whl 其中cp310指python3.10, win-amd64表示windows 64位操作系統(tǒng)
2.????????? torchaudio-0.13.0+cu117-cp310-cp310-win_amd64.whl
3.????????? torchvision-0.14.0+cu117-cp310-cp310-win_amd64.whl
????????????? 下載完成后進(jìn)入進(jìn)入下載的whl文件的目錄,在所處文件夾內(nèi)右擊空白處選擇 在終端中打開 并執(zhí)行下面命令以安裝庫(kù)
??? pip install .\torch-1.13.0+cu117-cp310-cp310-win_amd64.whl
??? # 回車運(yùn)行(安裝時(shí)間較長(zhǎng))
??? pip install .\torchaudio-0.13.0+cu117-cp310-cp310-win_amd64.whl
??? # 回車運(yùn)行
??? pip install .\torchvision-0.14.0+cu117-cp310-cp310-win_amd64.whl
??? # 回車運(yùn)行
????????????? 務(wù)必在出現(xiàn)Successfully installed ...之后再執(zhí)行下一條命令,第一個(gè)torch包安裝時(shí)間較長(zhǎng)
--示例結(jié)束--
安裝完torch, torchaudio, torchvision這三個(gè)庫(kù)之后,在cmd控制臺(tái)運(yùn)用以下命令檢測(cè)cuda與torch版本是否匹配
??? python
??? # 回車運(yùn)行
??? import torch
??? # 回車運(yùn)行
??? print(torch.__version__)
??? # 回車運(yùn)行
??? print(torch.cuda.is_available())
??? # 回車運(yùn)行
????????????? 最后一行出現(xiàn)True則成功,出現(xiàn)False則失敗,需要重新安裝
1.4 安裝依賴
????????????? 在項(xiàng)目文件夾內(nèi)右擊空白處選擇 在終端中打開 并執(zhí)行下面命令以安裝庫(kù)(若出現(xiàn)報(bào)錯(cuò)請(qǐng)嘗試用pip install [庫(kù)名稱]重新單獨(dú)安裝直至成功)
??? pip install -r requirements.txt
1.5 FFmpeg
????????????? 前往 FFmpeg官網(wǎng) 下載。解壓至任意位置并在高級(jí)系統(tǒng)設(shè)置-環(huán)境變量中添加Path定位至.\ffmpeg\bin(詳細(xì)安裝方法以及添加Path此處省略,網(wǎng)上隨便一查都有)
????????????? 安裝完成后在cmd控制臺(tái)中輸入ffmpeg -version出現(xiàn)類似以下內(nèi)容則安裝成功
ffmpeg version git-2020-08-12-bb59bdb Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805
configuration: [此處省略一大堆內(nèi)容]
libavutil????? 56. 58.100 / 56. 58.100
libavcodec???? 58.100.100 / 58.100.100
...
?2. 配置及訓(xùn)練(參考官方文檔)
2.0 關(guān)于兼容4.0模型的問(wèn)題
????????????? 可通過(guò)修改4.0模型的config.json對(duì)4.0的模型進(jìn)行支持,需要在config.json的model字段中添加speech_encoder字段,具體見(jiàn)下
? "model": {
??? .........
??? "ssl_dim": 256,
??? "n_speakers": 200,
??? "speech_encoder":"vec256l9"
? }
2.1 關(guān)于 Python 版本問(wèn)題
在進(jìn)行測(cè)試后,我們認(rèn)為Python 3.8.9能夠穩(wěn)定地運(yùn)行該項(xiàng)目
配置及訓(xùn)練
2.2 預(yù)先下載的模型文件
必須項(xiàng)
以下編碼器需要選擇一個(gè)使用
1. 若使用contentvec作為聲音編碼器(推薦)
vec768l12與vec256l9 需要該編碼器
????????????? contentvec :checkpoint_best_legacy_500.pt
–??????????? 放在pretrain目錄下
或者下載下面的ContentVec,大小只有199MB,但效果相同:
????????????? contentvec :hubert_base.pt
–??????????? 將文件名改為checkpoint_best_legacy_500.pt后,放在pretrain目錄下
# contentvec
wget -P pretrain/ http://obs.cstcloud.cn/share/obs/sankagenkeshi/checkpoint_best_legacy_500.pt
# 也可手動(dòng)下載放在pretrain目錄
2. 若使用hubertsoft作為聲音編碼器
????????????? soft vc hubert:hubert-soft-0d54a1f4.pt
–??????????? 放在pretrain目錄下
3. 若使用Whisper-ppg作為聲音編碼器
????????????? 下載模型 medium.pt, 該模型適配whisper-ppg
????????????? 下載模型 large-v2.pt, 該模型適配whisper-ppg-large
–??????????? 放在pretrain目錄下
4. 若使用cnhubertlarge作為聲音編碼器
????????????? 下載模型 chinese-hubert-large-fairseq-ckpt.pt
–??????????? 放在pretrain目錄下
5. 若使用dphubert作為聲音編碼器
????????????? 下載模型 DPHuBERT-sp0.75.pth
–??????????? 放在pretrain目錄下
6. 若使用OnnxHubert/ContentVec作為聲音編碼器
????????????? 下載模型 MoeSS-SUBModel
–??????????? 放在pretrain目錄下
編碼器列表
????????????? "vec768l12"
????????????? "vec256l9"
????????????? "vec256l9-onnx"
????????????? "vec256l12-onnx"
????????????? "vec768l9-onnx"
????????????? "vec768l12-onnx"
????????????? "hubertsoft-onnx"
????????????? "hubertsoft"
????????????? "whisper-ppg"
????????????? "cnhubertlarge"
????????????? "dphubert"
????????????? "whisper-ppg-large"
可選項(xiàng)(強(qiáng)烈建議使用)
????????????? 預(yù)訓(xùn)練底模文件: G_0.pth D_0.pth
–??????????? 放在logs/44k目錄下
????????????? 擴(kuò)散模型預(yù)訓(xùn)練底模文件: model_0.pt
–??????????? 放在logs/44k/diffusion目錄下
從svc-develop-team(待定)或任何其他地方獲取Sovits底模
擴(kuò)散模型引用了DDSP-SVC的Diffusion Model,底模與DDSP-SVC的擴(kuò)散模型底模通用,可以去DDSP-SVC獲取擴(kuò)散模型的底模
雖然底模一般不會(huì)引起什么版權(quán)問(wèn)題,但還是請(qǐng)注意一下,比如事先詢問(wèn)作者,又或者作者在模型描述中明確寫明了可行的用途
?
提供4.1訓(xùn)練底模,需自行下載,下載地址:https://huggingface.co/Sucial/so-vits-svc4.1-pretrain_model 還包含擴(kuò)散模型訓(xùn)練底模
提供4.0訓(xùn)練底模,需自行下載,下載地址:https://huggingface.co/datasets/ms903/sovits4.0-768vec-layer12/tree/main/sovits_768l12_pre_large_320k 并需要改名為G_0.pth和D_0.pth
提供3.0訓(xùn)練底模,需自行下載,下載地址:https://pan.baidu.com/s/1uw6W3gOBvMbVey1qt_AzhA?pwd=80eo 提取碼:80eo
?
可選項(xiàng)(根據(jù)情況選擇)
如果使用NSF-HIFIGAN增強(qiáng)器或淺層擴(kuò)散的話,需要下載預(yù)訓(xùn)練的NSF-HIFIGAN模型,如果不需要可以不下載
????????????? 預(yù)訓(xùn)練的NSF-HIFIGAN聲碼器 :nsf_hifigan_20221211.zip
–??????????? 解壓后,將四個(gè)文件放在pretrain/nsf_hifigan目錄下
# nsf_hifigan
wget -P pretrain/ https://github.com/openvpi/vocoders/releases/download/nsf-hifigan-v1/nsf_hifigan_20221211.zip
unzip -od pretrain/nsf_hifigan pretrain/nsf_hifigan_20221211.zip
# 也可手動(dòng)下載放在pretrain/nsf_hifigan目錄
# 地址:https://github.com/openvpi/vocoders/releases/tag/nsf-hifigan-v1
2.3 數(shù)據(jù)集準(zhǔn)備
僅需要以以下文件結(jié)構(gòu)將數(shù)據(jù)集放入dataset_raw目錄即可
dataset_raw
├───speaker0
│?? ├───xxx1-xxx1.wav
│?? ├───...
│?? └───Lxx-0xx8.wav
└───speaker1
??? ├───xx2-0xxx2.wav
??? ├───...
??? └───xxx7-xxx007.wav
可以自定義說(shuō)話人名稱
dataset_raw
└───suijiSUI
??? ├───1.wav
??? ├───...
??? └───25788785-20221210-200143-856_01_(Vocals)_0_0.wav
2.4 數(shù)據(jù)預(yù)處理
2.4.0 音頻切片
將音頻切片至5s - 15s, 稍微長(zhǎng)點(diǎn)也無(wú)傷大雅,實(shí)在太長(zhǎng)可能會(huì)導(dǎo)致訓(xùn)練中途甚至預(yù)處理就爆顯存
可以使用audio-slicer-GUI、audio-slicer-CLI
一般情況下只需調(diào)整其中的Minimum Interval,普通陳述素材通常保持默認(rèn)即可,歌唱素材可以調(diào)整至100甚至50
切完之后手動(dòng)刪除過(guò)長(zhǎng)過(guò)短的音頻
如果你使用Whisper-ppg聲音編碼器進(jìn)行訓(xùn)練,所有的切片長(zhǎng)度必須小于30s
2.4.1 重采樣至44100Hz單聲道
python resample.py
注意
雖然本項(xiàng)目擁有重采樣、轉(zhuǎn)換單聲道與響度匹配的腳本resample.py,但是默認(rèn)的響度匹配是匹配到0db。這可能會(huì)造成音質(zhì)的受損。而python的響度匹配包pyloudnorm無(wú)法對(duì)電平進(jìn)行壓限,這會(huì)導(dǎo)致爆音。所以建議可以考慮使用專業(yè)聲音處理軟件如adobe audition等軟件做響度匹配處理。若已經(jīng)使用其他軟件做響度匹配,可以在運(yùn)行上述命令時(shí)添加--skip_loudnorm跳過(guò)響度匹配步驟。如:
python resample.py --skip_loudnorm
2.4.2 自動(dòng)劃分訓(xùn)練集、驗(yàn)證集,以及自動(dòng)生成配置文件
python preprocess_flist_config.py --speech_encoder vec768l12
speech_encoder擁有七個(gè)選擇
vec768l12
vec256l9
hubertsoft
whisper-ppg
whisper-ppg-large
cnhubertlarge
dphubert
如果省略speech_encoder參數(shù),默認(rèn)值為vec768l12
使用響度嵌入
若使用響度嵌入,需要增加--vol_aug參數(shù),比如:
python preprocess_flist_config.py --speech_encoder vec768l12 --vol_aug
使用后訓(xùn)練出的模型將匹配到輸入源響度,否則為訓(xùn)練集響度。
此時(shí)可以在生成的config.json與diffusion.yaml修改部分參數(shù)
????????????? keep_ckpts:訓(xùn)練時(shí)保留最后幾個(gè)模型,0為保留所有,默認(rèn)只保留最后3個(gè)
????????????? all_in_mem,cache_all_data:加載所有數(shù)據(jù)集到內(nèi)存中,某些平臺(tái)的硬盤IO過(guò)于低下、同時(shí)內(nèi)存容量 遠(yuǎn)大于 數(shù)據(jù)集體積時(shí)可以啟用
????????????? batch_size:?jiǎn)未斡?xùn)練加載到GPU的數(shù)據(jù)量,調(diào)整到低于顯存容量的大小即可
????????????? vocoder_name : 選擇一種聲碼器,默認(rèn)為nsf-hifigan.
聲碼器列表
nsf-hifigan
nsf-snake-hifigan
2.4.3 生成hubert與f0
python preprocess_hubert_f0.py --f0_predictor dio
f0_predictor擁有四個(gè)選擇
crepe
dio
pm
harvest
如果訓(xùn)練集過(guò)于嘈雜,請(qǐng)使用crepe處理f0
如果省略f0_predictor參數(shù),默認(rèn)值為dio
尚若需要淺擴(kuò)散功能(可選),需要增加--use_diff參數(shù),比如
python preprocess_hubert_f0.py --f0_predictor dio --use_diff
執(zhí)行完以上步驟后 dataset 目錄便是預(yù)處理完成的數(shù)據(jù),可以刪除 dataset_raw 文件夾了
2.5 訓(xùn)練
2.5.1 擴(kuò)散模型(可選)
尚若需要淺擴(kuò)散功能,需要訓(xùn)練擴(kuò)散模型,擴(kuò)散模型訓(xùn)練方法為:
python train_diff.py -c configs/diffusion.yaml
2.5.2 主模型訓(xùn)練
python train.py -c configs/config.json -m 44k
模型訓(xùn)練結(jié)束后,模型文件保存在logs/44k目錄下,擴(kuò)散模型在logs/44k/diffusion下
?
?3. 推理(參考官方文檔)
3.1 命令行推理
使用 inference_main.py
# 例
python inference_main.py -m "logs/44k/G_30400.pth" -c "configs/config.json" -n "君の知らない物語(yǔ)-src.wav" -t 0 -s "nen"
必填項(xiàng)部分:
????????????? -m | --model_path:模型路徑
????????????? -c | --config_path:配置文件路徑
????????????? -n | --clean_names:wav 文件名列表,放在 raw 文件夾下
????????????? -t | --trans:音高調(diào)整,支持正負(fù)(半音)
????????????? -s | --spk_list:合成目標(biāo)說(shuō)話人名稱
????????????? -cl | --clip:音頻強(qiáng)制切片,默認(rèn)0為自動(dòng)切片,單位為秒/s
可選項(xiàng)部分:部分具體見(jiàn)下一節(jié)
????????????? -lg | --linear_gradient:兩段音頻切片的交叉淡入長(zhǎng)度,如果強(qiáng)制切片后出現(xiàn)人聲不連貫可調(diào)整該數(shù)值,如果連貫建議采用默認(rèn)值0,單位為秒
????????????? -f0p | --f0_predictor:選擇F0預(yù)測(cè)器,可選擇crepe,pm,dio,harvest,默認(rèn)為pm(注意:crepe為原F0使用均值濾波器)
????????????? -a | --auto_predict_f0:語(yǔ)音轉(zhuǎn)換自動(dòng)預(yù)測(cè)音高,轉(zhuǎn)換歌聲時(shí)不要打開這個(gè)會(huì)嚴(yán)重跑調(diào)
????????????? -cm | --cluster_model_path:聚類模型或特征檢索索引路徑,如果沒(méi)有訓(xùn)練聚類或特征檢索則隨便填
????????????? -cr | --cluster_infer_ratio:聚類方案或特征檢索占比,范圍0-1,若沒(méi)有訓(xùn)練聚類模型或特征檢索則默認(rèn)0即可
????????????? -eh | --enhance:是否使用NSF_HIFIGAN增強(qiáng)器,該選項(xiàng)對(duì)部分訓(xùn)練集少的模型有一定的音質(zhì)增強(qiáng)效果,但是對(duì)訓(xùn)練好的模型有反面效果,默認(rèn)關(guān)閉
????????????? -shd | --shallow_diffusion:是否使用淺層擴(kuò)散,使用后可解決一部分電音問(wèn)題,默認(rèn)關(guān)閉,該選項(xiàng)打開時(shí),NSF_HIFIGAN增強(qiáng)器將會(huì)被禁止
????????????? -usm | --use_spk_mix:是否使用角色融合/動(dòng)態(tài)聲線融合
????????????? -lea | --loudness_envelope_adjustment:輸入源響度包絡(luò)替換輸出響度包絡(luò)融合比例,越靠近1越使用輸出響度包絡(luò)
????????????? -fr | --feature_retrieval:是否使用特征檢索,如果使用聚類模型將被禁用,且cm與cr參數(shù)將會(huì)變成特征檢索的索引路徑與混合比例
淺擴(kuò)散設(shè)置:
????????????? -dm | --diffusion_model_path:擴(kuò)散模型路徑
????????????? -dc | --diffusion_config_path:擴(kuò)散模型配置文件路徑
????????????? -ks | --k_step:擴(kuò)散步數(shù),越大越接近擴(kuò)散模型的結(jié)果,默認(rèn)100
????????????? -od | --only_diffusion:純擴(kuò)散模式,該模式不會(huì)加載sovits模型,以擴(kuò)散模型推理
????????????? -se | --second_encoding:二次編碼,淺擴(kuò)散前會(huì)對(duì)原始音頻進(jìn)行二次編碼,玄學(xué)選項(xiàng),有時(shí)候效果好,有時(shí)候效果差
注意
如果使用whisper-ppg 聲音編碼器進(jìn)行推理,需要將--clip設(shè)置為25,-lg設(shè)置為1。否則將無(wú)法正常推理。
3.2 WebUI推理
使用以下命令打開webui界面,推理參數(shù)參考3.1
chcp 65001
@echo off
python webUI.py
pause
?
?
?4. 增強(qiáng)效果的可選項(xiàng)
如果前面的效果已經(jīng)滿意,或者沒(méi)看明白下面在講啥,那后面的內(nèi)容都可以忽略,不影響模型使用(這些可選項(xiàng)影響比較小,可能在某些特定數(shù)據(jù)上有點(diǎn)效果,但大部分情況似乎都感知不太明顯)
自動(dòng)f0預(yù)測(cè)
4.0模型訓(xùn)練過(guò)程會(huì)訓(xùn)練一個(gè)f0預(yù)測(cè)器,對(duì)于語(yǔ)音轉(zhuǎn)換可以開啟自動(dòng)音高預(yù)測(cè),如果效果不好也可以使用手動(dòng)的,但轉(zhuǎn)換歌聲時(shí)請(qǐng)不要啟用此功能?。。?huì)嚴(yán)重跑調(diào)??!
????????????? 在inference_main中設(shè)置auto_predict_f0為true即可
聚類音色泄漏控制
介紹:聚類方案可以減小音色泄漏,使得模型訓(xùn)練出來(lái)更像目標(biāo)的音色(但其實(shí)不是特別明顯),但是單純的聚類方案會(huì)降低模型的咬字(會(huì)口齒不清)(這個(gè)很明顯),本模型采用了融合的方式,可以線性控制聚類方案與非聚類方案的占比,也就是可以手動(dòng)在"像目標(biāo)音色" 和 "咬字清晰" 之間調(diào)整比例,找到合適的折中點(diǎn)
使用聚類前面的已有步驟不用進(jìn)行任何的變動(dòng),只需要額外訓(xùn)練一個(gè)聚類模型,雖然效果比較有限,但訓(xùn)練成本也比較低
????????????? 訓(xùn)練過(guò)程:
–??????????? 使用cpu性能較好的機(jī)器訓(xùn)練,據(jù)我的經(jīng)驗(yàn)在騰訊云6核cpu訓(xùn)練每個(gè)speaker需要約4分鐘即可完成訓(xùn)練
–??????????? 執(zhí)行python cluster/train_cluster.py,模型的輸出會(huì)在logs/44k/kmeans_10000.pt
–??????????? 聚類模型目前可以使用gpu進(jìn)行訓(xùn)練,執(zhí)行python cluster/train_cluster.py --gpu
????????????? 推理過(guò)程:
–??????????? inference_main.py中指定cluster_model_path
–??????????? inference_main.py中指定cluster_infer_ratio,0為完全不使用聚類,1為只使用聚類,通常設(shè)置0.5即可
特征檢索
介紹:跟聚類方案一樣可以減小音色泄漏,咬字比聚類稍好,但會(huì)降低推理速度,采用了融合的方式,可以線性控制特征檢索與非特征檢索的占比,
????????????? 訓(xùn)練過(guò)程:
首先需要在生成hubert與f0后執(zhí)行:
python train_index.py -c configs/config.json
模型的輸出會(huì)在logs/44k/feature_and_index.pkl
????????????? 推理過(guò)程:
–??????????? 需要首先制定--feature_retrieval,此時(shí)聚類方案會(huì)自動(dòng)切換到特征檢索方案
–??????????? inference_main.py中指定cluster_model_path 為模型輸出文件
–??????????? inference_main.py中指定cluster_infer_ratio,0為完全不使用特征檢索,1為只使用特征檢索,通常設(shè)置0.5即可
?
?5.其他可選項(xiàng)
5.1 模型壓縮
生成的模型含有繼續(xù)訓(xùn)練所需的信息。如果確認(rèn)不再訓(xùn)練,可以移除模型中此部分信息,得到約 1/3 大小的最終模型。
使用 compress_model.py
# 例
python compress_model.py -c="configs/config.json" -i="logs/44k/G_30400.pth" -o="logs/44k/release.pth"
5.2 聲線混合(本教程不講)
5.2.1 靜態(tài)聲線混合
參考webUI.py文件中,小工具/實(shí)驗(yàn)室特性的靜態(tài)聲線融合。
介紹:該功能可以將多個(gè)聲音模型合成為一個(gè)聲音模型(多個(gè)模型參數(shù)的凸組合或線性組合),從而制造出現(xiàn)實(shí)中不存在的聲線
注意:
1.????????? 該功能僅支持單說(shuō)話人的模型
2.????????? 如果強(qiáng)行使用多說(shuō)話人模型,需要保證多個(gè)模型的說(shuō)話人數(shù)量相同,這樣可以混合同一個(gè)SpaekerID下的聲音
3.????????? 保證所有待混合模型的config.json中的model字段是相同的
4.????????? 輸出的混合模型可以使用待合成模型的任意一個(gè)config.json,但聚類模型將不能使用
5.????????? 批量上傳模型的時(shí)候最好把模型放到一個(gè)文件夾選中后一起上傳
6.????????? 混合比例調(diào)整建議大小在0-100之間,也可以調(diào)為其他數(shù)字,但在線性組合模式下會(huì)出現(xiàn)未知的效果
7.????????? 混合完畢后,文件將會(huì)保存在項(xiàng)目根目錄中,文件名為output.pth
8.????????? 凸組合模式會(huì)將混合比例執(zhí)行Softmax使混合比例相加為1,而線性組合模式不會(huì)
5.2.2 動(dòng)態(tài)聲線混合
參考spkmix.py文件中關(guān)于動(dòng)態(tài)聲線混合的介紹
角色混合軌道 編寫規(guī)則:
角色I(xiàn)D : [[起始時(shí)間1, 終止時(shí)間1, 起始數(shù)值1, 起始數(shù)值1], [起始時(shí)間2, 終止時(shí)間2, 起始數(shù)值2, 起始數(shù)值2]]
起始時(shí)間和前一個(gè)的終止時(shí)間必須相同,第一個(gè)起始時(shí)間必須為0,最后一個(gè)終止時(shí)間必須為1 (時(shí)間的范圍為0-1)
全部角色必須填寫,不使用的角色填[[0., 1., 0., 0.]]即可
融合數(shù)值可以隨便填,在指定的時(shí)間段內(nèi)從起始數(shù)值線性變化為終止數(shù)值,內(nèi)部會(huì)自動(dòng)確保線性組合為1(凸組合條件),可以放心使用
推理的時(shí)候使用--use_spk_mix參數(shù)即可啟用動(dòng)態(tài)聲線混合
5.3 Onnx導(dǎo)出(本教程不講)
使用 onnx_export.py
????????????? 新建文件夾:checkpoints 并打開
????????????? 在checkpoints文件夾中新建一個(gè)文件夾作為項(xiàng)目文件夾,文件夾名為你的項(xiàng)目名稱,比如aziplayer
????????????? 將你的模型更名為model.pth,配置文件更名為config.json,并放置到剛才創(chuàng)建的aziplayer文件夾下
????????????? 將 onnx_export.py 中path = "NyaruTaffy" 的 "NyaruTaffy" 修改為你的項(xiàng)目名稱,path = "aziplayer" (onnx_export_speaker_mix,為支持角色混合的onnx導(dǎo)出)
????????????? 運(yùn)行 onnx_export.py
????????????? 等待執(zhí)行完畢,在你的項(xiàng)目文件夾下會(huì)生成一個(gè)model.onnx,即為導(dǎo)出的模型
注意:Hubert Onnx模型請(qǐng)使用MoeSS提供的模型,目前無(wú)法自行導(dǎo)出(fairseq中Hubert有不少onnx不支持的算子和涉及到常量的東西,在導(dǎo)出時(shí)會(huì)報(bào)錯(cuò)或者導(dǎo)出的模型輸入輸出shape和結(jié)果都有問(wèn)題)
?
?6. 簡(jiǎn)單混音處理及成品導(dǎo)出
以FL studio或Studio One為例
?
?附錄:常見(jiàn)報(bào)錯(cuò)的解決辦法
報(bào)錯(cuò)及解決方法,來(lái)自https://www.bilibili.com/read/cv22206231
?
報(bào)錯(cuò):UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position xx
答:數(shù)據(jù)集文件名中不要包含中文或日文等非西文字符。
報(bào)錯(cuò):頁(yè)面文件太小,無(wú)法完成操作。
答:調(diào)整一下虛擬內(nèi)存大小,具體的方法各種地方一搜就能搜到,不展開了。
報(bào)錯(cuò):UnboundLocalError: local variable 'audio' referenced before assignment
答:上傳的推理音頻需要是16位整數(shù)wav格式,用Au轉(zhuǎn)換一下就好?;蛘哐b個(gè)ffmpeg一勞永逸地解決問(wèn)題。
報(bào)錯(cuò):AssertionError: CPU training is not allowed.
答:非N卡跑不了的。
報(bào)錯(cuò):torch.cuda.OutOfMemoryError: CUDA out of?memory
答:爆顯存了,試著把batch_size改小,改到1還爆的話建議云端訓(xùn)練。
報(bào)錯(cuò):RuntimeError: DataLoader worker (pid(s) xxxx) exited unexpectedly
答:把虛擬內(nèi)存再調(diào)大一點(diǎn)。
報(bào)錯(cuò):NotImplementedError: Only 2D, 3D, 4D, 5D padding with non-constant padding are supported for no
答:數(shù)據(jù)集切片切太長(zhǎng)了,5-10秒差不多。
報(bào)錯(cuò):CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling 'cublasCreate(handle)'
答:爆顯存了,基本上跟CUDA有關(guān)的報(bào)錯(cuò)大都是爆顯存……
報(bào)錯(cuò):torch.multiprocessing.spawn.ProcessExitedException: process 0 terminated with exit code 3221225477
答:調(diào)大虛擬內(nèi)存,管理員運(yùn)行腳本
報(bào)錯(cuò):'HParams' object has no attribute 'xxx'
答:無(wú)法找到音色,一般是配置文件和模型沒(méi)對(duì)應(yīng),打開配置文件拉到最下面看看有沒(méi)有你訓(xùn)練的音色
報(bào)錯(cuò):The expand size of the tensor (768) must match the existing size (256) at non-singleton dimension 0.
答:把dataset/44k下的內(nèi)容全部刪了,重新走一遍預(yù)處理流程
報(bào)錯(cuò):Given groups=1, weight of size [xxx, 256,?xxx], expected input[xxx, 768, xxx] to have 256 channels, but got 768 channels instead
答:v1分支的模型用了vec768的配置文件,如果上面報(bào)錯(cuò)的256的768位置反過(guò)來(lái)了那就是vec768的模型用了v1的配置文件