前言

​ 本文简单记录介绍一下vc-lm。

​ vc-lm是一个音色转换器,可以将任何人的声音转换成成千上万种不同的声音。


正文

一、什么是vc-lm

该项目是一个音色转换器,可以将任何人的声音转换成成千上万种不同的声音。它使用encodec将音频离散化成tokens,并在tokens上构建transformer语言模型。该项目包含两个阶段的模型:AR模型和NAR模型。可以使用自监督的方式进行训练,生成大量one-to-any的平行数据,这些平行数据可以被用来训练Any-to-One的变声模型。训练目标人数据仅需10分钟即可达到很好的效果。

二、vc-lm算法架构

参考论文Vall-E,使用encodec算法,将音频离散化成tokens,在tokens上构建transformer语言模型。该项目包含两阶段模型AR模型和NAR模型。

三、vc-lm使用与训练

vc-lm的训练分为两步,先训练one2any的生成数据,再利用这些数据训练的模型训练any2one的转换模型。

预训练

参考tools/construct_wavs_file.py将wav源文件处理成长度10~24s的文件;

参考tools/construct_dataset.py构造数据集;

将whisper中的encoder模块提取出来使用python tools/extract_whisper_encoder_model.py --input_model=../whisper/medium.pt --output_model=../whisper-encoder/medium-encoder.pt

在配置文件里需要调整好相关存储路径,再分别训练AR、NAR模型:

1
2
python run.py fit --config configs/ar_model.yaml
python run.py fit --config configs/nar_model.yaml

训练好后推理测试:

1
2
3
4
5
6
from vc_lm.vc_engine import VCEngine
engine = VCEngine('/pathto/vc-models/ar.ckpt',
'/pathto/vc-models/nar.ckpt',
'../configs/ar_model.json',
'../configs/nar_model.json')
output_wav = engine.process_audio(content_wav,style_wav, max_style_len=3, use_ar=True)

any2one训练

构造目标数据集,与上面的方式一样;

构造Any-to-one平行数据:python tools.construct_parallel_dataset.py

加载预训练模型,在目标数据集上训练:

1
2
python run.py fit --config configs/finetune_ar_model.yaml
python run.py fit --config configs/finetune_nar_model.yaml

推理测试:

1
2
3
4
5
6
from vc_lm.vc_engine import VCEngine
engine = VCEngine('/pathto/jr-ar.ckpt',
'/pathto/jr-nar.ckpt',
'../configs/ar_model.json',
'../configs/nar_model.json')
output_wav = engine.process_audio(content_wav,style_wav, max_style_len=3, use_ar=True)

四、总结

官方项目上有预训练好的模型可以下载下来直接试试。

需要注意的是这项目跟TTS是有区别的,vc-lm是音频的音色转换,可以使用少量目标数据微调得到较好的转换效果。


最后

参考文章:

官方项目

VALL-E

encodec


声明

本文仅作为个人学习记录。

本文永久记录于区块链博客xlog