emotion-vits環(huán)境配置的一些踩坑
本人只使用了使用樣例音頻作為情感輸入的功能和@一只有夢(mèng)想的咸魚電臺(tái)?訓(xùn)練的模型,懶得訓(xùn)練感情模型了,之后有時(shí)間再說。
資料參考:
可控制情感的綾地寧寧語音合成!基于VITS模型_嗶哩嗶哩_bilibili
【VITS】基于emotion-vits的LL全員語音模型_嗶哩嗶哩_bilibili
https://www.bilibili.com/read/cv20607867
首先用Anaconda3安裝虛擬環(huán)境,本人顯卡是筆記本3070,然后建議使用python3.7,不然后面自動(dòng)安裝的時(shí)候有些依賴包的版本會(huì)出問題你還得再改。
然后先去把pytorch安裝了,選擇CUDA的版本,因?yàn)閼械锰焯鞊Q,學(xué)習(xí)用的yolov8用的是11.3的,所以我就選了11.3的pytorch,當(dāng)然不訓(xùn)練的話你用CPU的也可以。再pytorch官網(wǎng)的舊版本下載頁(yè)面點(diǎn)擊ctrl+f搜索。我要11.3版本的我就搜cu113。然后找到對(duì)應(yīng)的pip命令安裝。
如果你用不到情感詞典,在第四段代碼中把導(dǎo)入情感詞典的注釋掉。因?yàn)閠ts就是在這一段定義的。
# all_emotions = np.load("all_emotions.npy")
# 音頻情感分類結(jié)果
# emotion_dict = json.load(open("sample_wav.json", "r"))
import random
def tts(txt, sid, emotion, roma=False, length_scale = 1):
? ? if roma:
? ? ? ? stn_tst = get_text_byroma(txt, hps)
? ? else:
? ? ? ? stn_tst = get_text(txt, hps)
? ? with torch.no_grad():
? ? ? ? x_tst = stn_tst.unsqueeze(0)
? ? ? ? x_tst_lengths = torch.LongTensor([stn_tst.size(0)])
? ? ? ? import emotion_extract
? ? ? ? emo = torch.FloatTensor(emotion_extract.extract_wav(emotion))
? ? ? ? # sid = torch.LongTensor([0])
? ? ? ? # if type(emotion) ==int:
? ? ? ? #? ? ?emo = torch.FloatTensor(all_emotions[emotion]).unsqueeze(0)
? ? ? ? # elif emotion == "random":
? ? ? ? #? ? ?emo = torch.randn([1,1024])
? ? ? ? # elif emotion == "random_sample":
? ? ? ? #? ? ?randint = random.randint(0, all_emotions.shape[0])
? ? ? ? #? ? ?emo = torch.FloatTensor(all_emotions[randint]).unsqueeze(0)
? ? ? ? #? ? ?print(randint)
? ? ? ? # elif emotion.endswith("wav"):
? ? ? ? #? ? ?import emotion_extract
? ? ? ? #? ? ?emo = torch.FloatTensor(emotion_extract.extract_wav(emotion))
? ? ? ? # else:
? ? ? ? #? ? ?emo = torch.FloatTensor(all_emotions[emotion_dict[emotion]]).unsqueeze(0)
? ? ? ? audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=0.667, noise_scale_w=0.8, length_scale=length_scale, emo=emo)[0][0,0].data.float().numpy()
? ? ipd.display(ipd.Audio(audio, rate=hps.data.sampling_rate, normalize=False))
get_roma是pyopenjtalk的函數(shù),安裝上。
chardet也安裝上。
transformers也安裝上。
Jupyter notebook遇到500的問題可以自己搜一下解決辦法。
先把前幾段代碼都跑了該導(dǎo)入的導(dǎo)入了,用到情感詞典的可以不管。
然后運(yùn)行使用樣例音頻作為情感輸入的一段。
另外運(yùn)行的時(shí)候可能缺少一些轉(zhuǎn)換詞典之類的
# 使用音頻文件作為感情輸入
txt = "疲れた?甘ったれたこと言ってんじゃないわよ!"
txtr=get_roma(txt, hps)
tts(txtr, torch.LongTensor([1]), emotion="./short normal.wav", roma=True, length_scale = 1)
這個(gè)LongTensor[]里面的數(shù)字就是你載入的模型里的講話者序號(hào),后面的emotion就是從當(dāng)前路徑開始的音頻文件,get_roma是把日文轉(zhuǎn)換成羅馬音的。
這一段代碼我之前遇到過:
ImportError: cannot import name 'logging' from 'huggingface_hub' (D:\Anaconda3\envs\vits\lib\site-packages\huggingface_hub\__init__.py)
這個(gè)我沒找到解決辦法,當(dāng)時(shí)是python3.8的環(huán)境,我干脆換3.7了,之后沒有報(bào)錯(cuò)。
然后還有可能遇到:
TypeError: load() takes 1 positional argument but 2 were given
這個(gè)是librosa版本的問題,去google了一下,stackoverflow上有解決辦法,就是換成librosa的0.9.2版本,因?yàn)橹鞍惭b可能給你安裝了個(gè)0.10.0之后的。重裝之后重新打開ipynb文件。
現(xiàn)在就可以根據(jù)樣例音頻作為情感輸入合成音頻了。

但是有個(gè)小提醒,樣例音頻最好是用原句,這樣效果最好。不要用不同的語言,不同的語言表達(dá)情感的輕重音和升降調(diào)是有差別的,導(dǎo)出結(jié)果會(huì)非常怪異。如果對(duì)音調(diào)什么的細(xì)節(jié)不滿意,可以自己先用get_roma函數(shù)輸出羅馬音音素,然后自己調(diào)整一下字符比如箭頭啊什么的,然后輸入到新的字符串,改為tts函數(shù)的第一個(gè)變量,然后輸出。
總之如果懂一些python的話這些會(huì)方便許多。
總之感謝@一只有夢(mèng)想的咸魚電臺(tái)?和@Rcell?大佬的努力,本人電腦還在跑其他模型,可能最近還是會(huì)鴿子一段時(shí)間。有時(shí)間了我自己想辦法制作一個(gè)語音庫(kù)填補(bǔ)一些空白。
之后可能會(huì)試試so-vits和AI畫圖,不得不說真的是在親身經(jīng)歷一場(chǎng)科技革命,以后二創(chuàng)會(huì)方便不少了。