emotion-vits环境配置的一些踩坑
本人只使用了使用样例音频作为情感输入的功能和@一只有梦想的咸鱼电台 训练的模型,懒得训练感情模型了,之后有时间再说。
资料参考:
可控制情感的绫地宁宁语音合成!基于VITS模型_哔哩哔哩_bilibili
【VITS】基于emotion-vits的LL全员语音模型_哔哩哔哩_bilibili
https://www.bilibili.com/read/cv20607867
首先用Anaconda3安装虚拟环境,本人显卡是笔记本3070,然后建议使用python3.7,不然后面自动安装的时候有些依赖包的版本会出问题你还得再改。
然后先去把pytorch安装了,选择CUDA的版本,因为懒得天天换,学习用的yolov8用的是11.3的,所以我就选了11.3的pytorch,当然不训练的话你用CPU的也可以。再pytorch官网的旧版本下载页面点击ctrl+f搜索。我要11.3版本的我就搜cu113。然后找到对应的pip命令安装。
如果你用不到情感词典,在第四段代码中把导入情感词典的注释掉。因为tts就是在这一段定义的。
# all_emotions = np.load("all_emotions.npy")
# 音频情感分类结果
# 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的函数,安装上。
chardet也安装上。
transformers也安装上。
Jupyter notebook遇到500的问题可以自己搜一下解决办法。
先把前几段代码都跑了该导入的导入了,用到情感词典的可以不管。
然后运行使用样例音频作为情感输入的一段。
另外运行的时候可能缺少一些转换词典之类的
# 使用音频文件作为感情输入
txt = "疲れた?甘ったれたこと言ってんじゃないわよ!"
txtr=get_roma(txt, hps)
tts(txtr, torch.LongTensor([1]), emotion="./short normal.wav", roma=True, length_scale = 1)
这个LongTensor[]里面的数字就是你载入的模型里的讲话者序号,后面的emotion就是从当前路径开始的音频文件,get_roma是把日文转换成罗马音的。
这一段代码我之前遇到过:
ImportError: cannot import name 'logging' from 'huggingface_hub' (D:\Anaconda3\envs\vits\lib\site-packages\huggingface_hub\__init__.py)
这个我没找到解决办法,当时是python3.8的环境,我干脆换3.7了,之后没有报错。
然后还有可能遇到:
TypeError: load() takes 1 positional argument but 2 were given
这个是librosa版本的问题,去google了一下,stackoverflow上有解决办法,就是换成librosa的0.9.2版本,因为之前安装可能给你安装了个0.10.0之后的。重装之后重新打开ipynb文件。
现在就可以根据样例音频作为情感输入合成音频了。

但是有个小提醒,样例音频最好是用原句,这样效果最好。不要用不同的语言,不同的语言表达情感的轻重音和升降调是有差别的,导出结果会非常怪异。如果对音调什么的细节不满意,可以自己先用get_roma函数输出罗马音音素,然后自己调整一下字符比如箭头啊什么的,然后输入到新的字符串,改为tts函数的第一个变量,然后输出。
总之如果懂一些python的话这些会方便许多。
总之感谢@一只有梦想的咸鱼电台 和@Rcell 大佬的努力,本人电脑还在跑其他模型,可能最近还是会鸽子一段时间。有时间了我自己想办法制作一个语音库填补一些空白。
之后可能会试试so-vits和AI画图,不得不说真的是在亲身经历一场科技革命,以后二创会方便不少了。