去年体验了一遍so-vits-svc 4.1
,做了一个AI杰伦的模型。按照当时的条件来说,结果我是比较满意的。最近有个需求,想做AI配音,大致就是先将文字转成语音,然后通过修改音色实现类似真人说话的效果。
遇到问题
起初就是按部就班之前的经验去训练,但是结果就有些不尽人意。最大的问题就是咬字,比如”cheng“的发音会读成”che“。
即使又训练了几万步也还是没有改善,起初是怀疑数据集毕竟少,因为只有十分钟左右的干声。后面觉得不对,这是提取源音频语音特征,是音色转换。数据少最多就是转换后声音不像。
后面查阅了一些资料,发现是特征编码器的关系。默认使用的是vec768l12
。
- 优点,最还原音色、有大型底模、支持响度嵌入。
- 缺点,咬字能力较弱。
当然这个咬字也和你的输入源有关,我当时换了一个TTS的音色,对应这个字的咬字就好了一些。但是这总归不是一个办法,治标不治本。谁知道这个音色的那个读音又不行了。
所以如果你对咬字比较看重,那就建议使用hubertsoft
或whisper-ppg
。
- 优点,咬字能力强。
- 缺点,音色泄露。
音色泄露指的是输出的音色向底模/推理输入源的原始音色接近,模型说话人越多,音色泄露越严重。考虑到大多数人都希望尽可能还原目标说话人的音色,因此音色泄露被认为是一种不受欢迎的结果。
使用方法,在自动划分训练集、验证集,以及自动生成配置文件这步指定speech_encoder
:
python preprocess_flist_config.py --speech_encoder hubertsoft
然后下载hubert-soft-0d54a1f4.pt
文件放在pretrain
目录下。下载链接见文档。
然后是f0预测器的选择,默认rmvpe
效果不错,如果想在低音部分有更好表现,可以选择harvest
。我训练的是男声,所以选择了它,但我实际对比rmvpe
没有听出来区别。
python preprocess_hubert_f0.py --f0_predictor harvest
另外还有一个小细节,可以看看是否需要跳过响度匹配。
脚本 resample.py,默认的响度匹配是匹配到 0db。这可能会造成音质的受损。而 python 的响度匹配包 pyloudnorm 无法对电平进行压限,这会导致爆音。
导致的结果就是准备的音频问题不大,但是推理出的效果音频会有杂音。所以如果自己的音频声音大小基本一致,可以跳过响度匹配,避免负优化。
python resample.py --skip_loudnorm
推理
语音转换时推荐开启自动f0预测,开启后相似度有明显提升。也可以改善音色泄露的问题。
我对比了两次不同方案的推理结果,音色上差别不大,但是后者咬字明显加强。所以对于转换语音的场景,建议使用这套方案。歌曲的话,还是之前的方案。