DiffSinger全流程教程(四)
聲庫(kù)制作
這一部分主要為從訓(xùn)練到推理的全部流程,不打算自己訓(xùn)練的同學(xué)無(wú)須此部分
最新的語(yǔ)雀更新:https://www.yuque.com/sunsa-i3ayc/sivu7h

推理與訓(xùn)練
以windows為例
一、安裝PyTorch
打開(kāi)命令行
activate diff
回車(chē),切換到剛剛創(chuàng)建的虛擬環(huán)境
*這里因?yàn)槲冶镜丨h(huán)境不同用的與之前不同,實(shí)際使用的為你之前制作數(shù)據(jù)集所創(chuàng)建的虛擬環(huán)境,如diff
每次重新打開(kāi)conda終端都要切換到項(xiàng)目對(duì)應(yīng)的虛擬環(huán)境,看到開(kāi)頭由base變?yōu)閐iffsinger就說(shuō)明切換到虛擬環(huán)境了。

輸入:
*這條代碼并不適用所有人,需要根據(jù)顯卡自行更改?。?!
下方有查看方法
conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia
按下回車(chē)鍵,安裝pytorch

(這里推薦根據(jù)你的顯卡到官網(wǎng)https://pytorch.org/get-started/locally/?下載)
(無(wú)獨(dú)立顯卡或者A卡用戶(hù)可以選擇CPU版本,推理可能較慢)

(查看顯卡最高支持版本可以在命令行輸入 nvidia-smi 查詢(xún)CUDA Version)

等待conda查找完成輸入:
y
按回車(chē)鍵開(kāi)始安裝

等待下載和安裝完成

P.S.
Q:我的顯卡顯示CUDA Version低于11.6(可是顯卡型號(hào)很新)怎么辦?
A:如果更新到最新NVIDIA顯卡驅(qū)動(dòng)后仍無(wú)法在官網(wǎng)找到對(duì)應(yīng)版本下載,可以輸入
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3
下載11.3版本的Pytorch(再低就不建議本地推理了,可能不一定有CPU快)
P.P.S.
Q:conda安裝torch時(shí)候太慢了怎么辦?
A:更換pip安裝
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
P.P.P.S.
40系顯卡請(qǐng)安裝cuda11.8以上版本
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118

為了確保安裝版本的正確,可以逐條輸入并回車(chē)以下代碼
python
回車(chē)
import torch
回車(chē)
print(torch.__version__)
回車(chē)
print(torch.cuda.is_available()) ?
回車(chē)
進(jìn)行檢驗(yàn)

如圖返回True說(shuō)明正確安裝GPU版本torch
然后可以輸入
exit()
退出Python
二、安裝requirements
cd 你解壓的DiffSinger倉(cāng)庫(kù)的地址
切換到DiffSinger倉(cāng)庫(kù)

這里如果你解壓在非C盤(pán)路徑,可能會(huì)出現(xiàn)cd后無(wú)變化的情況

這時(shí)你可以輸入對(duì)應(yīng)盤(pán)符,例如
f:
回車(chē)
*請(qǐng)根據(jù)自己情況操作

然后
pip install -r requirements.txt -i https://pypi.doubanio.com/simple
安裝剩余依賴(lài)(如果你是海外用戶(hù),通常你不需要使用-i和其后面內(nèi)容)

等待下載安裝完成

請(qǐng)確認(rèn)安裝依賴(lài)過(guò)程中無(wú)任何報(bào)錯(cuò)(大部分報(bào)錯(cuò)可以通過(guò)百度、谷歌或者必應(yīng)解決。當(dāng)然,你也可以嘗試咨詢(xún)ChatGPT3)

打開(kāi)一個(gè)新的終端,切換到之前為diffsinger準(zhǔn)備的環(huán)境
Conda輸入:
activate diff
cd diffsinger倉(cāng)庫(kù)目錄
切換到diffsinger倉(cāng)庫(kù)
*以下內(nèi)容請(qǐng)根據(jù)你在制作數(shù)據(jù)集時(shí)最后一步提示的代碼運(yùn)行
*以下內(nèi)容請(qǐng)根據(jù)你在制作數(shù)據(jù)集時(shí)最后一步提示的代碼運(yùn)行
*以下內(nèi)容請(qǐng)根據(jù)你在制作數(shù)據(jù)集時(shí)最后一步提示的代碼運(yùn)行
Conda逐行輸入:
set PYTHONPATH=.
回車(chē)
set CUDA_VISIBLE_DEVICES=0
回車(chē)
python data_gen/binarize.py --config data/expname/config.yaml
回車(chē)
開(kāi)始預(yù)處理
等待預(yù)處理完成
然后輸入:
python run.py --config data/expname/config.yaml --exp_name ***_expname_ds1000 --reset
回車(chē)

打開(kāi)命令窗口,
輸入
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
回車(chē)并等待安裝完成
如果輸入后出現(xiàn)failed to create process
那需要在前面加python -m
即使用
python -m pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
安裝完成后,輸入
python
然后輸入
import tensorflow
測(cè)試是否成功安裝
輸入
exit()
回車(chē),退出Python
輸入
tensorboard --logdir=F:\DiffSinger-refactor\checkpoints\XXX\lightning_logs\lastest
前面路徑對(duì)應(yīng)你使用的分支文件夾,XXX是你訓(xùn)練時(shí)使用的exp_name
然后在瀏覽器中
輸入
http://localhost:6006/
即可查看tensorboard,可以試聽(tīng)與查看loss

這里以實(shí)驗(yàn)權(quán)重為例
自制權(quán)重流程相同
下載交流群(907879266)里的權(quán)重
1215_opencpop_ds1000_nomidi.zip(聲學(xué)模型,使用你自制的,本地訓(xùn)練無(wú)需下載,云端訓(xùn)練下載下來(lái)即可)
nsf_hifigan_20221211.zip(前面放置過(guò)聲碼器的話無(wú)需重復(fù)下載)

解壓到你解壓的DiffSinger倉(cāng)庫(kù)的地址的checkpoints文件夾下
*如無(wú)相應(yīng)能力請(qǐng)勿修改名稱(chēng)等
下載群文件里的ds文件(你也可以使用自制ds),出于方便可以放在你解壓的DiffSinger倉(cāng)庫(kù)的地址根目錄

打開(kāi)終端,激活虛擬環(huán)境
activate diff
切換到diffsinger目錄
然后輸入
python main.py 我多想說(shuō)再見(jiàn)啊_with_ph_dur.ds --exp 1215_opencpop_ds1000_nomidi
*這里--exp用來(lái)指定模型權(quán)重,后面填你所使用的權(quán)重的文件夾名(以下圖片暫未更新)

進(jìn)度條走完后會(huì)提示音頻保存地址

main.py可以指定以下參數(shù)

-h ? ? ? ? ? ? ? 展示幫助信息并退出
--exp ? ? ? ? ?指定權(quán)重文件夾
--out ? ? ? ? ?指定輸出文件夾
--title ? ? ? ? ?輸出文件名
--num ? ? ? ?一次運(yùn)行渲染次數(shù)
--key ? ? ? ? ?變調(diào)(半音)
--seed ? ? ? ?指定隨機(jī)種子
--speedup ?PNDM加速倍速(默認(rèn)10倍,不建議過(guò)高)
--mel ? ? ? ? ?保存梅爾譜而不是WAV文件
--spk ? ? ? ? ? 指定組合模型的說(shuō)話人(--spk 制作時(shí)設(shè)定的speaker)
組合模型的推理
1.指定說(shuō)話人
python main.py 我多想說(shuō)再見(jiàn)啊_with_ph_dur.ds --exp expname --spk speakername
expname是模型訓(xùn)練時(shí)的expname,speakername是制作數(shù)據(jù)集時(shí)指定的
2.按比例混合
python main.py 我多想說(shuō)再見(jiàn)啊_with_ph_dur.ds --exp expname --spk "speakerid:0.2|speakerid:0.5|speakerid:0.3"
expname是模型訓(xùn)練時(shí)的expname,speakername
例如你的模型由 opencpop qixuan xiayezi三人構(gòu)成
1. "opencpop|qixuan|xiayezi" ?這種情況三人均分
2. "opencpop:0.5|qixuan"
3. "opencpop:0.4|qixuan:0.6"
4. "opencpop:0.1|qixuan:0.2" ?這種情況會(huì)進(jìn)行歸一化
5. "opencpop:0.5|qixuan|xiayezi" ?這種情況opencpop占一半剩下倆均分 ?
Gen參數(shù)的推理
python main.py xxx.ds --exp expname --gender GEN
expname是你訓(xùn)練時(shí)的expname,GEN是介于 -1 和 1 之間的浮點(diǎn)值(負(fù)趨向于男性,正趨向于女性)
控制 *.ds 文件中的性別曲線:
{ ? "gender_timestep": "0.005", // timestep in seconds, like f0_timestep ? "gender": "-1.0 -0.9 -0.8 ... 0.8 0.9 1.0", // sequence of float values, like f0_seq ? ... // other attributes }
因?yàn)榇a迭代很快,請(qǐng)以最新倉(cāng)庫(kù)信息為準(zhǔn)

ds文件的獲得
推理是需要ds文件,相關(guān)解決方案如下,如果你有擁有對(duì)應(yīng)ds工程,可以跳過(guò)此步
Q:ds文件應(yīng)當(dāng)怎么獲得呢?
A:下載OpenSVIP
地址:https://openvpi.github.io
可以將其他工程文件轉(zhuǎn)換為ds文件

下載主程序和對(duì)應(yīng)插件

根據(jù)原始工程自行選擇下載

下載后的主程序解壓到任意目錄

雙擊打開(kāi)OpenSvip.GUI.exe
打開(kāi)后,【轉(zhuǎn)換-安裝插件】

選擇下載好的插件,確定并安裝

安裝后選擇對(duì)應(yīng)輸入輸出格式,在左側(cè)選擇導(dǎo)入文件,下方可以選擇輸出路徑
根據(jù)需求選擇參數(shù)

*小重點(diǎn)來(lái)咯

這三個(gè)參數(shù)需要根據(jù)模型選擇
詞典預(yù)設(shè):嚴(yán)氏詞典或者原版opencpop詞典,目前教程所用基本均為嚴(yán)氏詞典
音素參數(shù)模式:注意,音素參數(shù)目前只支持使用X Studio Pro1.9.2凍結(jié),使用教程訓(xùn)練的自制聲庫(kù)目前均需要凍結(jié)音素才能正常使用(這部分優(yōu)化中)
音高參數(shù)模式:目前除原版模型外均需要調(diào)參文件才能獲得最佳體驗(yàn)
需要注意的是,插件暫不支持漢語(yǔ)拼音以外的發(fā)音,如果有【ki】之類(lèi)的需求,可以手動(dòng)在ds文件中修改
Q:上面沒(méi)有支持我的工程文件的插件怎么辦?
A:使用svp中轉(zhuǎn)
如果上面沒(méi)有你需要的插件,如vsqx工程文件
你可以使用utaformatix(http://atonystyle.gitee.io/utaformatix3/)轉(zhuǎn)換為svp工程文件


*請(qǐng)確保你的工程原作者允許此操作
選擇轉(zhuǎn)換音高參數(shù)并下一步

點(diǎn)擊導(dǎo)出即可下載

然后下載上方的svp插件用作轉(zhuǎn)換

Q:怎么為ds文件凍結(jié)參數(shù)呢?
A:首先下載X Studio Pro
可在【群文件-實(shí)用工具】下載

解壓后將“XStudioPro”文件夾存放至你覺(jué)得合適的目錄
雙擊運(yùn)行其中的 XStudioSinger.exe。

點(diǎn)擊【打開(kāi)工程】打開(kāi)你喜歡的工程
或者使用OpenSVIP轉(zhuǎn)換為svip工程
或者你也可以【新建工程】(教程:B站號(hào)BV1nk4y117AC)

打開(kāi)后點(diǎn)擊【參數(shù)】切換到參數(shù)模式

等待從云端獲取參數(shù)

調(diào)整參數(shù)后,在樂(lè)譜區(qū)空白處

右鍵
【凍結(jié)Ai參數(shù)】
點(diǎn)擊【確定】即可凍結(jié)音高參數(shù)
點(diǎn)擊參數(shù)切換按鈕
點(diǎn)擊【音素】切換到音素參數(shù)界面
可能加載較慢
調(diào)整參數(shù)后,在樂(lè)譜區(qū)空白處
右鍵
【凍結(jié)全部音素】
點(diǎn)擊【確定】即可凍結(jié)音素
最后快捷鍵【Ctrl+S】保存工程
將保存的工程使用OpenSVIP轉(zhuǎn)換為ds工程
*需要將音高和音素均設(shè)為有參
Q:OpenSVIP轉(zhuǎn)換SVIP時(shí),動(dòng)態(tài)庫(kù)怎么設(shè)置?
A:可參考下面設(shè)置
如果你安裝有X Studio,正常情況下無(wú)須配置
如果報(bào)錯(cuò)
1.更新最新版插件,無(wú)需設(shè)置
2.可參閱插件信息設(shè)置

打包成OpenUtau可用模型
1.將DiffSinger聲庫(kù)模型轉(zhuǎn)換為ONNX模型
打開(kāi)conda終端
創(chuàng)建一個(gè)虛擬環(huán)境
conda create -n onnx python=3.8 -y
這里的onnx可以是任何你喜歡的單詞
激活虛擬環(huán)境
activate onnx
每次重新打開(kāi)conda終端都要切換到項(xiàng)目對(duì)應(yīng)的虛擬環(huán)境,看到開(kāi)頭由base變?yōu)閛nnx 就說(shuō)明切換到虛擬環(huán)境了
cd 你解壓的DiffSinger-refactor倉(cāng)庫(kù)的地址
切換到DiffSinger-refactor倉(cāng)庫(kù)

這里如果你解壓在非C盤(pán)路徑,可能會(huì)出現(xiàn)cd后無(wú)變化的情況

這時(shí)你可以輸入對(duì)應(yīng)盤(pán)符,例如
f:
回車(chē)

安裝依賴(lài)
pip install pytorch==1.8 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install onnx==1.12.0 onnxsim==0.4.10 protobuf==3.13.0 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

導(dǎo)出onnx模型
python onnx/export/export_acoustic.py --exp EXP --out TARGET
EXP是你訓(xùn)練的權(quán)重名稱(chēng),TARGET是目標(biāo) onnx 文件的路徑
如果你不了解請(qǐng)使用
python onnx/export/export_acoustic.py --exp EXP
組合模型需要使用
導(dǎo)出某一人
python onnx/export/export_acoustic.py --exp EXP --freeze_spk Speakername
其中Speakername是你自制時(shí)設(shè)定的
按比例混合
python onnx/export/export_acoustic.py --exp EXP ?--freeze_spk "MySpeaker=spk1|spk2"
MySpeaker是你要給混合模型起的名字
例如你的模型由 opencpop qixuan xiayezi三人構(gòu)成
1. "MySpeaker=opencpop|qixuan|xiayezi" ?這種情況三人均分
2. "MySpeaker=opencpop:0.5|qixuan"
3. "MySpeaker=opencpop:0.4|qixuan:0.6"
4. "MySpeaker=opencpop:0.1|qixuan:0.2" ?這種情況會(huì)進(jìn)行歸一化
5. "MySpeaker=opencpop:0.5|qixuan|xiayezi" ?這種情況opencpop占一半剩下倆均分 ?
導(dǎo)出支持Gen參數(shù)的模型
*注意:導(dǎo)出支持Gen參數(shù)的模型需要在dsconfig.yaml加入對(duì)應(yīng)的參數(shù),詳見(jiàn)最后【使用說(shuō)明】
python onnx/export/export_acoustic.py --exp expname --expose_gender
或者凍結(jié)性別
python onnx/export/export_acoustic.py --exp expname --freeze_gender GEN
舉個(gè)例子
例如你有一個(gè)組合模型由 opencpop qixuan xiayezi三人構(gòu)成,訓(xùn)練時(shí)候opencpop的speakerID設(shè)定的niufuren,expname是hunhe,你想導(dǎo)出opencpop可調(diào)Gen的模型,你需要
python onnx/export/export_acoustic.py --exp hunhe --freeze_spk niufuren --expose_gender
又例如你有一個(gè)組合模型由 opencpop qixuan xiayezi三人構(gòu)成,訓(xùn)練時(shí)候設(shè)定的expname是niufuren,你想導(dǎo)出opencpop和qixuan混合其名為nvsheng可調(diào)Gen的模型,你需要
python onnx/export/export_acoustic.py --exp niufuren --freeze_spk "nvsheng=opencpop:0.5|qixuan:0.5" --expose_gender
*注意事項(xiàng):目前暫不支持之前安裝的torch版本,需要重新安裝1.8及以下版本的torch,如果你不了解如何卸載重裝可以考慮百度一下、必應(yīng)一下,或者重新創(chuàng)建一個(gè)虛擬環(huán)境
torch版本不支持的報(bào)錯(cuò)如下圖所示(這里僅需要CPU版本的torch即可)

運(yùn)行完成后會(huì)提示你去哪里找到你的模型

2.打包聲庫(kù)模型
新建一個(gè)文件夾,模型復(fù)制進(jìn)來(lái)
除此之外,文件夾里還需要有
character.txt ? ? ? ? ? #音源基本信息文件
character.yaml ? ? ? #OpenUTAU音源信息文件
dsconfig.yaml ? ? ? #Diffsinger音源信息文件
phonemes.txt ? ? ? #音素列表
dsdict.txt ? ? ? ? ? ? ?#拼音轉(zhuǎn)音素字典
這些文件你通常可以通過(guò)下載其他音源獲得并參考
具體設(shè)置為
character.txt
注:只有第一行name是必需的,其他均為可選項(xiàng)
name=音源名
image=圖標(biāo)文件(如果使用了這一行,就需要把圖標(biāo)png或bmp文件打包到音源中)
author=作者
voice=聲音提供者
web=音源官網(wǎng)
例如:
name=Zhibin Diffsinger
image=zhibin.png
author=Chisong
voice=Chisong
web=http://zhibin.club/
character.yaml
請(qǐng)勿手動(dòng)修改此文件
text_file_encoding: utf-8
portrait_opacity: 0.67
default_phonemizer: OpenUtau.Core.DiffSinger.DiffsingerMandarinPhonemizer
dsconfig.yaml
(注意:不是訓(xùn)練音源時(shí)的配置文件?。〔皇怯?xùn)練音源時(shí)的配置文件?。≌?qǐng)參照下面的格式):
phonemes: phonemes.txt ? ?#音素列表
acoustic: acoustic.onnx ? #聲學(xué)模型
vocoder: nsf_hifigan ? ? ?#所使用的聲碼器包名
# 以下是性別參數(shù)相關(guān)設(shè)置,參見(jiàn)?https://github.com/openvpi/DiffSinger/releases/tag/v1.6.0
# 只有當(dāng)你的音源導(dǎo)出時(shí)使用了--expose_gender時(shí),才需要此部分
# 這一部分可以直接從訓(xùn)練使用的配置文件中復(fù)制過(guò)來(lái)
augmentation_args:
?random_pitch_shifting:
? ?range: [-5., 5.]
? ?scale: 1.0
use_key_shift_embed: true
phonemes.txt
每行一個(gè)音素,開(kāi)頭的reserved_tokens要空出對(duì)應(yīng)數(shù)量的行數(shù)
dsdict.txt
每行一個(gè)拼音,參閱
https://github.com/openvpi/DiffSingerMiniEngine/blob/main/assets/dictionaries/opencpop-strict.txt
設(shè)置完成后壓縮整個(gè)文件夾

一、下載適用于DiffSinger的OpenUtau
https://github.com/xunmengshe/OpenUtau/releases
推薦帶有DiffsingerPack的整合包
如果加載過(guò)慢可以右鍵復(fù)制鏈接使用https://d.serctl.com/搭配idm等多線程下載程序進(jìn)行加速下載
二、下載音源,拖入OpenUTAU窗口安裝
安裝時(shí)右上角選擇能正常顯示的編碼,如utf-8
三、選擇歌手
在音軌左側(cè)的歌手菜單的“DiffSinger”分類(lèi)中找到你安裝的歌手,選擇
注:歌詞支持漢字或拼音輸入,連音符為加號(hào)+,呼吸音為AP,停頓為SP
說(shuō)明
OpenUTAU默認(rèn)開(kāi)啟自動(dòng)預(yù)渲染,即你每進(jìn)行一筆編輯,都會(huì)立即渲染音頻并緩存。如果OpenUTAU卡頓,可在“工具→使用偏好→渲染”中關(guān)閉自動(dòng)預(yù)渲染
DiffSinger相關(guān)設(shè)置可在“工具→使用偏好→渲染”中編輯:
渲染加速倍數(shù):默認(rèn)為50倍。降低加速倍數(shù)可提高音質(zhì),但會(huì)使合成速度變慢
默認(rèn)使用CPU渲染,使用DirectML渲染速度更快。請(qǐng)將“機(jī)器學(xué)習(xí)運(yùn)行器”設(shè)置為directml,GPU選擇你的獨(dú)顯(NVIDIA和AMD顯卡均支持),然后重新啟動(dòng)OpenUTAU
參數(shù)
DiffSinger支持以下參數(shù)
音高曲線
音素長(zhǎng)度
DYN(音量曲線)
GENC(性別,需音源支持,默認(rèn)可調(diào)范圍±100相當(dāng)于?12半音,正方向?yàn)槟新暎ü舱穹褰档停?/span>
參數(shù)的可調(diào)范圍可在鋼琴窗左下角的齒輪圖標(biāo)設(shè)置
音素器
目前OpenUTAU for Diffsinger包含4個(gè)用于Diffsinger的音素器:
DIFFS ZH 位于ZH分類(lèi),基于OpenUTAU內(nèi)置的vogen音素模型,無(wú)需配置,支持漢語(yǔ)普通話
DIFFS RHY 位于ZH分類(lèi),基于 Diffsinger rhythmizer音素模型,效果更好
ENUNU X 位于General分類(lèi),基于NNSVS音素模型,需要音源開(kāi)發(fā)者適配。適用于ENUNU支持的各種自定義語(yǔ)言。使用方法
ENUNU X EN 位于EN分類(lèi),基于NNSVS音素模型,需要音源開(kāi)發(fā)者適配。適用于使用CMUDict的英文音源。使用方法
目前限制
暫不支持多說(shuō)話人混合
