高效实时语音转换系统
Diffusion-SVC是一个基于扩散模型的语音转换项目,专注于实现高质量的实时语音转换。该系统以低显存占用、快速训练和推理为特点,并针对浅扩散和实时应用进行了优化。Diffusion-SVC支持多种预训练模型和编码器,适用于不同规模的GPU,可灵活搭配使用。通过与其他声学模型级联,系统能进一步提升音频质量并降低性能消耗,为语音转换技术带来新的可能性。
语言: 英文 简体中文
此仓库是DDSP-SVC仓库的扩散部分的单独存放。可单独训练和推理。
Diffusion SVC 2.0 即将到来,可在v2.0_dev
分支提前体验:前往分支
最近更新:使用本仓库的naive模型和浅扩散模型搭配可以用极低训练成本达到比单纯扩散模型更好的效果,强力推荐。但是小网络的naive模型泛化能力较弱,在小数据集上可能会有音域问题,这个时候naive模型微调不能训练太多步数(这会让底模退化),前级也可以考虑更换为无限音域的ddsp模型。
<br>效果和介绍见[介绍视频(暂未完成)]
欢迎加群交流讨论:882426004
Diffusion-SVC 是DDSP-SVC仓库的 扩散部分的单独存放。可单独训练和推理。
相比于比较著名的 Diff-SVC, 本项目的显存占用少得多,训练和推理速度更快,并针对浅扩散和实时用途有专门优化。可以在较强的GPU上实时推理。配合本项目的naive模型进行浅扩散,即使是较弱的GPU也可以实时生成质量优秀的音频。
如果训练数据和输入源的质量都非常高,Diffusion-SVC可能拥有最好的转换效果。
本项目可以很容易的级联在别的声学模型之后进行浅扩散,以改善最终的输出效果或降低性能占用。例如在DDSP-SVC和本项目的naive模型后级联Diffusion-SVC,可进一步减少需要的扩散步数并得到高质量的输出。
除此之外,本项目还可以单独训练浅扩散所需的降噪步数而不训练完整的从高斯噪声开始的降噪过程,这可以提高训练速度并改善质量,更多信息见下文。
免责声明:请确保仅使用合法获得的授权数据训练 Diffusion-SVC 模型,不要将这些模型及其合成的任何音频用于非法目的。 本库作者不对因使用这些模型检查点和音频而造成的任何侵权,诈骗等违法行为负责。
安装PyTorch:我们推荐从 PyTorch 官方网站 下载 PyTorch.
安装依赖
pip install -r requirements.txt
pretrain
文件夹。经过裁剪的ContentVec镜像有完全一样的效果,但大小只有190MB。
tools/tools.py
中的Units_Encoder
类。pretrain/
文件夹。
nsf_hifigan
的压缩文件,而非nsf_hifigan_finetune
。use_speaker_encoder
设置为true
, 并从这里下载预训练声纹模型,该模型来自mozilla/TTS。将所有的训练集数据 (.wav 格式音频切片) 放到 data/train/audio
,也可以是配置文件中指定的文件夹如xxxx/yyyy/audio
。
将所有验证集数据(.wav 格式音频切片)放到 data/val/audio
目录下,也可以是配置文件中指定的文件夹,如 aaaa/bbbb/audio
。
运行 python draw.py
,程序将帮助你挑选验证集数据(可以调整 draw.py
中的参数修改抽取文件的数量等参数)。
注意:说话人 ID 必须从 1 开始,不能从 0 开始;如果只有一个说话人,则该说话人 ID 必须为 1
data
├─ train
│ ├─ audio
│ │ ├─ 1
│ │ │ ├─ aaa.wav
│ │ │ ├─ bbb.wav
│ │ │ └─ ....wav
│ │ ├─ 2
│ │ │ ├─ ccc.wav
│ │ │ ├─ ddd.wav
│ │ │ └─ ....wav
│ │ └─ ...
|
├─ val
| ├─ audio
│ │ ├─ 1
│ │ │ ├─ eee.wav
│ │ │ ├─ fff.wav
│ │ │ └─ ....wav
│ │ ├─ 2
│ │ │ ├─ ggg.wav
│ │ │ ├─ hhh.wav
│ │ │ └─ ....wav
│ │ └─ ...
python preprocess.py -c configs/config.yaml
您可以在预处理之前修改配置文件 configs/config.yaml
请保持所有音频切片的采样率与 yaml 配置文件中的采样率一致!(推荐使用 fap 进行重采样等前处理)
将长音频切成小段可以加快训练速度,但所有音频切片的时长不应少于 2 秒。如果音频切片太多,则需要较大的内存,可以在配置文件中将 cache_all_data
选项设置为 false 来解决此问题。
验证集的音频切片总数建议为 10 个左右,不要放太多,否则验证过程会很慢。
如果您的数据集质量不是很高,请在配置文件中将 'f0_extractor' 设为 'crepe'。crepe 算法的抗噪性最好,但代价是会极大增加数据预处理所需的时间。
配置文件中的 'n_spk' 参数将控制是否训练多说话人模型。如果您要训练多说话人模型,为了对说话人进行编号,所有音频文件夹的名称必须是不大于 'n_spk' 的正整数
python train.py -c configs/config.yaml
我们强烈建议使用预训练模型进行微调,这将比直接训练容易和节省得多,并能达到比小数据集更高的上限。
注意,在底模上微调需要使用和底模一样的编码器,如同为 ContentVec,对别的编码器(如声纹)也是同理,还要注意模型的网络大小等参数相同。
只训练 k_step_max 深度的浅扩散模型与 naive 模型的组合比单纯完全扩散的质量可能还要更高,同时训练速度更快。但是 naive 模型可能存在音域问题。
(注意:whisper-ppg 对应 whisper 的 medium 权重,whisper-ppg-large 对应 whisper 的 large-v2 权重)
Units 编码器 | 网络大小 | 数据集 | 下载 |
---|---|---|---|
contentvec768l12(推荐) | 512*20 | VCTK<br/>m4singer | HuggingFace |
hubertsoft | 512*20 | VCTK<br/>m4singer | HuggingFace |
whisper-ppg(仅支持 sovits) | 512*20 | VCTK<br/>m4singer<br/>opencpop<br/>kiritan | HuggingFace |
补充一个用 contentvec768l12 编码的整活底模,数据集为 m4singer
/opencpop
/vctk
,不推荐使用,不保证没问题:下载。
(注意:whisper-ppg对应whisper的medium权重,whisper-ppg-large对应whisper的large-v2权重)
使用的编码器 | 网络大小 | k_step_max | 数据集 | 浅扩散模型下载 |
---|---|---|---|---|
contentvec768l12 | 512*30 | 100 | VCTK<br/>m4singer | HuggingFace |
contentvec768l12 | 512*20 | 200 | VCTK<br/>m4singer | HuggingFace |
contentvec256l9 | 512*20 | 200 | VCTK<br/>m4singer | HuggingFace |
contentvec256l9 | 768*30 | 200 | VCTK<br/>m4singer | HuggingFace |
whisper-ppg(仅支持sovits) | 768*30 | 200 | PTDB<br/>m4singer | HuggingFace |
使用的编码器 | 网络大小 | 数据集 | 类型 | Naive模型下载 |
---|---|---|---|---|
contentvec768l12 | 3*256 | VCTK<br/>m4singer | Naive | HuggingFace |
decay_step
改小(如10000)。model_0.pt
的预训练模型放到config.yaml
中"expdir: exp/*****"参数指定的模型导出文件夹内,如果没有就新建一个,程序会自动加载该文件夹下的预训练模型。Naive模型是一个轻量级的svc模型,可以作为浅扩散的前级,训练方式与扩散模型一致,示例配置文件在configs/config_naive.yaml
。其所需的预处理和扩散模型是一样的。
python train.py -c configs/config_naive.yaml