- 本项目的目标群体是:深度学习初学者,具备Python和PyTorch的基本操作是使用本项目的前置条件;
- 本项目旨在帮助深度学习初学者,摆脱枯燥的纯理论学习,通过与实践结合,熟练掌握深度学习基本知识;
- 本项目不支持实时变声;(支持需要换掉whisper)
- 本项目不会开发用于其他用途的一键包
- 1-整体框架 https://www.bilibili.com/video/BV1Tj411e7pQ
- 2-数据准备和预处理 https://www.bilibili.com/video/BV1uj411v7zW
- 3-先验后验编码器 https://www.bilibili.com/video/BV1Be411Q7r5
- 4-decoder部分 https://www.bilibili.com/video/BV19u4y1b73U
- 5-蛇形激活函数 https://www.bilibili.com/video/BV1HN4y1D7AR
- 6-Flow部分 https://www.bilibili.com/video/BV1ju411F7Fs
- 7-训练及损失函数部分 https://www.bilibili.com/video/BV1qw411W73B
- 8-训练推理以及基频矫正 https://www.bilibili.com/video/BV1eb4y1u7ER
-
【无 泄漏】支持多发音人
-
【捏 音色】创造独有发音人
-
【带 伴奏】也能进行转换,轻度伴奏
-
【用 Excel】进行原始调教,纯手工
AI_Elysia_Mix.mp4
Powered by @ShadowVap
Feature | From | Status | Function |
---|---|---|---|
whisper | OpenAI | ✅ | 强大的抗噪能力 |
bigvgan | NVIDA | ✅ | 抗锯齿与蛇形激活,共振峰更清晰,提升音质明显 |
natural speech | Microsoft | ✅ | 减少发音错误 |
neural source-filter | NII | ✅ | 解决断音问题 |
speaker encoder | ✅ | 音色编码与聚类 | |
GRL for speaker | Ubisoft | ✅ | 对抗去音色 |
SNAC | Samsung | ✅ | VITS 一句话克隆 |
SCLN | Microsoft | ✅ | 改善克隆 |
PPG perturbation | 本项目 | ✅ | 提升抗噪性和去音色 |
HuBERT perturbation | 本项目 | ✅ | 提升抗噪性和去音色 |
VAE perturbation | 本项目 | ✅ | 提升音质 |
Mix encoder | 本项目 | ✅ | 提升转换稳定性 |
USP 推理 | 本项目 | ✅ | 提升转换稳定性 |
USP : 即使unvoice和silence在推理的时候,也有Pitch,这个Pitch平滑链接voice段
-
安装PyTorch
-
安装项目依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
注意:不能额外安装whisper,否则会和代码内置whisper冲突
-
下载音色编码器, 把
best_model.pth.tar
放到speaker_pretrain/
里面 (不要解压) -
下载whisper-large-v2模型,把
large-v2.pt
放到whisper_pretrain/
里面 -
下载hubert_soft模型,把
hubert-soft-0d54a1f4.pt
放到hubert_pretrain/
里面 -
下载音高提取模型crepe full,把
full.pth
放到crepe/assets
里面注意:full.pth为84.9M,请确认文件大小无误
-
下载sovits5.0.pretrain.pth, 把它放到
vits_pretrain/
里面,推理测试python svc_inference.py --config configs/base.yaml --model ./vits_pretrain/sovits5.0.pretrain.pth --spk ./configs/singers/singer0001.npy --wave test.wav
- 人声分离,如果数据集没有BGM直接跳过此步骤(推荐使用UVR中的3_HP-Vocal-UVR模型或者htdemucs_ft模型抠出数据集中的人声)
- 用slicer剪切音频,whisper要求为小于30秒(建议丢弃不足2秒的音频,短音频大多没有音素,有可能会影响训练效果)
- 手动筛选经过第1步和第2步处理过的音频,裁剪或者丢弃杂音明显的音频,如果数据集没有BGM直接跳过此步骤
- 用Adobe Audition进行响度平衡处理
- 按下面文件结构,将数据集放入dataset_raw目录
dataset_raw
├───speaker0
│ ├───000001.wav
│ ├───...
│ └───000xxx.wav
└───speaker1
├───000001.wav
├───...
└───000xxx.wav
python svc_preprocessing.py -t 2
-t:指定线程数,必须是正整数且不得超过CPU总核心数,一般写2就可以了
预处理完成后文件夹结构如下面所示
data_svc/
└── waves-16k
│ └── speaker0
│ │ ├── 000001.wav
│ │ └── 000xxx.wav
│ └── speaker1
│ ├── 000001.wav
│ └── 000xxx.wav
└── waves-32k
│ └── speaker0
│ │ ├── 000001.wav
│ │ └── 000xxx.wav
│ └── speaker1
│ ├── 000001.wav
│ └── 000xxx.wav
└── pitch
│ └── speaker0
│ │ ├── 000001.pit.npy
│ │ └── 000xxx.pit.npy
│ └── speaker1
│ ├── 000001.pit.npy
│ └── 000xxx.pit.npy
└── hubert
│ └── speaker0
│ │ ├── 000001.vec.npy
│ │ └── 000xxx.vec.npy
│ └── speaker1
│ ├── 000001.vec.npy
│ └── 000xxx.vec.npy
└── whisper
│ └── speaker0
│ │ ├── 000001.ppg.npy
│ │ └── 000xxx.ppg.npy
│ └── speaker1
│ ├── 000001.ppg.npy
│ └── 000xxx.ppg.npy
└── speaker
│ └── speaker0
│ │ ├── 000001.spk.npy
│ │ └── 000xxx.spk.npy
│ └── speaker1
│ ├── 000001.spk.npy
│ └── 000xxx.spk.npy
└── singer
├── speaker0.spk.npy
└── speaker1.spk.npy
如果您有编程基础,推荐,逐步完成数据处理,也利于学习内部工作原理
-
1, 重采样
生成采样率16000Hz音频, 存储路径为:./data_svc/waves-16k
python prepare/preprocess_a.py -w ./dataset_raw -o ./data_svc/waves-16k -s 16000
生成采样率32000Hz音频, 存储路径为:./data_svc/waves-32k
python prepare/preprocess_a.py -w ./dataset_raw -o ./data_svc/waves-32k -s 32000
-
2, 使用16K音频,提取音高
python prepare/preprocess_crepe.py -w data_svc/waves-16k/ -p data_svc/pitch
-
3, 使用16k音频,提取内容编码
python prepare/preprocess_ppg.py -w data_svc/waves-16k/ -p data_svc/whisper
-
4, 使用16k音频,提取内容编码
python prepare/preprocess_hubert.py -w data_svc/waves-16k/ -v data_svc/hubert
-
5, 使用16k音频,提取音色编码
python prepare/preprocess_speaker.py data_svc/waves-16k/ data_svc/speaker
-
6, 提取音色编码均值;用于推理,也可作为发音人统一音色用于生成训练索引(数据音色变化不大的情况下)
python prepare/preprocess_speaker_ave.py data_svc/speaker/ data_svc/singer
-
7, 使用32k音频,提取线性谱
python prepare/preprocess_spec.py -w data_svc/waves-32k/ -s data_svc/specs
-
8, 使用32k音频,生成训练索引
python prepare/preprocess_train.py
-
9, 训练文件调试
python prepare/preprocess_zzz.py
-
参数调整
如果基于预训练模型微调,需要下载预训练模型sovits5.0.pretrain.pth并且放在项目根目录下面
并且修改configs/base.yaml
的参数pretrain: "./vits_pretrain/sovits5.0.pretrain.pth"
,并适当调小学习率(建议从5e-5开始尝试)
learning_rate & batch_size & accum_step 为三个紧密相关的参数,需要仔细调节
batch_size 乘以 accum_step 通常等于 16 或 32,对于低显存GPU,可以尝试 batch_size = 4,accum_step = 4 -
开始训练
python svc_trainer.py -c configs/base.yaml -n sovits5.0
-
恢复训练
python svc_trainer.py -c configs/base.yaml -n sovits5.0 -p chkpt/sovits5.0/sovits5.0_***.pt
-
训练日志可视化
tensorboard --logdir logs/
- 导出推理模型:文本编码器,Flow网络,Decoder网络;判别器和后验编码器等只在训练中使用
python svc_export.py --config configs/base.yaml --checkpoint_path chkpt/sovits5.0/***.pt
- 推理
-
如果不想手动调整f0,只需要最终的推理结果,运行下面的命令即可
python svc_inference.py --config configs/base.yaml --model sovits5.0.pth --spk ./data_svc/singer/修改成对应的名称.npy --wave test.wav --shift 0
-
如果需要手动调整f0,依据下面的流程操作
-
使用whisper提取内容编码,生成test.ppg.npy
python whisper/inference.py -w test.wav -p test.ppg.npy
-
使用hubert提取内容编码,生成test.vec.npy
python hubert/inference.py -w test.wav -v test.vec.npy
-
提取csv文本格式F0参数,用Excel打开csv文件,对照Audition或者SonicVisualiser手动修改错误的F0
python pitch/inference.py -w test.wav -p test.csv
-
最终推理
python svc_inference.py --config configs/base.yaml --model sovits5.0.pth --spk ./data_svc/singer/修改成对应的名称.npy --wave test.wav --ppg test.ppg.npy --vec test.vec.npy --pit test.csv --shift 0
-
-
一些注意点
当指定--ppg后,多次推理同一个音频时,可以避免重复提取音频内容编码;没有指定,也会自动提取当指定--vec后,多次推理同一个音频时,可以避免重复提取音频内容编码;没有指定,也会自动提取
当指定--pit后,可以加载手工调教的F0参数;没有指定,也会自动提取
生成文件在当前目录svc_out.wav
args --config --model --spk --wave --ppg --vec --pit --shift name 配置文件 模型文件 音色文件 音频文件 ppg内容 hubert内容 音高内容 升降调 -
去噪后处理
python svc_inference_post.py --ref test.wav --svc svc_out.wav --out svc_out_post.wav
- 分散模式:训练索引中,音色文件使用音频音色
- 统一模式:训练索引中,音色文件使用发音人音色
问题:哪种情况下,哪个模式更好
python svc_merge.py --model1 模型1.pt --model1 模型2.pt --rate 模型1占比(0~1)
对不同epoch的模型进行融合,可以获得比较平均的性能、削弱过拟合
例如:python svc_merge.py --model1 chkpt\sovits5.0\sovits5.0_1045.pt --model2 chkpt\sovits5.0\sovits5.0_1050.pt --rate 0.4
纯属巧合的取名:average -> ave -> eva,夏娃代表者孕育和繁衍
python svc_eva.py
eva_conf = {
'./configs/singers/singer0022.npy': 0,
'./configs/singers/singer0030.npy': 0,
'./configs/singers/singer0047.npy': 0.5,
'./configs/singers/singer0051.npy': 0.5,
}
生成的音色文件为:eva.spk.npy
https://github.com/facebookresearch/speech-resynthesis paper
https://github.com/jaywalnut310/vits paper
https://github.com/openai/whisper/ paper
https://github.com/NVIDIA/BigVGAN paper
https://github.com/mindslab-ai/univnet paper
https://github.com/nii-yamagishilab/project-NN-Pytorch-scripts/tree/master/project/01-nsf
https://github.com/huawei-noah/Speech-Backbones/tree/main/Grad-TTS
https://github.com/brentspell/hifi-gan-bwe
https://github.com/bshall/soft-vc
https://github.com/maxrmorrison/torchcrepe
https://github.com/MoonInTheRiver/DiffSinger
https://github.com/OlaWod/FreeVC paper
https://github.com/yl4579/HiFTNet paper
Adapter-Based Extension of Multi-Speaker Text-to-Speech Model for New Speakers
AdaSpeech: Adaptive Text to Speech for Custom Voice
AdaVITS: Tiny VITS for Low Computing Resource Speaker Adaptation
Cross-Speaker Prosody Transfer on Any Text for Expressive Speech Synthesis
Multilingual Speech Synthesis and Cross-Language Voice Cloning: GRL
RoFormer: Enhanced Transformer with rotary position embedding)https://github.com/facebookresearch/speech-resynthesis paper
https://github.com/auspicious3000/contentvec/blob/main/contentvec/data/audio/audio_utils_1.py
https://github.com/revsic/torch-nansy/blob/main/utils/augment/praat.py
https://github.com/revsic/torch-nansy/blob/main/utils/augment/peq.py
https://github.com/biggytruck/SpeechSplit2/blob/main/utils.py
https://github.com/OlaWod/FreeVC/blob/main/preprocess_sr.py
https://github.com/Francis-Komizu/Sovits
2022.04.12 https://mp.weixin.qq.com/s/autNBYCsG4_SvWt2-Ll_zA
2022.04.22 https://github.com/PlayVoice/VI-SVS
2022.07.26 https://mp.weixin.qq.com/s/qC4TJy-4EVdbpvK2cQb1TA
2022.09.08 https://github.com/PlayVoice/VI-SVC