README_zh_CN.md
本轮限时更新即将结束,仓库将进入Archieve状态,望周知
</div>本项目与 Vits 有着根本上的不同。Vits 是 TTS,本项目是 SVC。本项目无法实现 TTS,Vits 也无法实现 SVC,这两个项目的模型是完全不通用的。
这个项目是为了让开发者最喜欢的动画角色唱歌而开发的,任何涉及真人的东西都与开发者的意图背道而驰。
本项目为开源、离线的项目,SvcDevelopTeam 的所有成员与本项目的所有开发者以及维护者(以下简称贡献者)对本项目没有控制力。本项目的贡献者从未向任何组织或个人提供包括但不限于数据集提取、数据集加工、算力支持、训练支持、推理等一切形式的帮助;本项目的贡献者不知晓也无法知晓使用者使用该项目的用途。故一切基于本项目训练的 AI 模型和合成的音频都与本项目贡献者无关。一切由此造成的问题由使用者自行承担。
此项目完全离线运行,不能收集任何用户信息或获取用户输入数据。因此,这个项目的贡献者不知道所有的用户输入和模型,因此不负责任何用户输入。
本项目只是一个框架项目,本身并没有语音合成的功能,所有的功能都需要用户自己训练模型。同时,这个项目没有任何模型,任何二次分发的项目都与这个项目的贡献者无关。
歌声音色转换模型,通过 SoftVC 内容编码器提取源音频语音特征,与 F0 同时输入 VITS 替换原本的文本输入达到歌声转换的效果。同时,更换声码器为 NSF HiFiGAN 解决断音问题。
"model": {
.........
"ssl_dim": 256,
"n_speakers": 200,
"speech_encoder":"vec256l9"
}
在进行测试后,我们认为Python 3.8.9能够稳定地运行该项目
以下编码器需要选择一个使用
vec768l12与vec256l9 需要该编码器
pretrain目录下或者下载下面的 ContentVec,大小只有 199MB,但效果相同:
checkpoint_best_legacy_500.pt后,放在pretrain目录下# contentvec
wget -P pretrain/ https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -O checkpoint_best_legacy_500.pt
# 也可手动下载放在 pretrain 目录
pretrain目录下whisper-ppgwhisper-ppg-large
pretrain目录下pretrain目录下pretrain目录下wavlmbase+
pretrain目录下pretrain目录下预训练底模文件: G_0.pth D_0.pth
logs/44k目录下扩散模型预训练底模文件: model_0.pt
logs/44k/diffusion目录下从 svc-develop-team(待定)或任何其他地方获取 Sovits 底模
扩散模型引用了 Diffusion-SVC 的 Diffusion Model,底模与 Diffusion-SVC 的扩散模型底模通用,可以去 Diffusion-SVC 获取扩散模型的底模
虽然底模一般不会引起什么版权问题,但还是请注意一下,比如事先询问作者,又或者作者在模型描述中明确写明了可行的用途
如果使用NSF-HIFIGAN 增强器或浅层扩散的话,需要下载预训练的 NSF-HIFIGAN 模型,如果不需要可以不下载
pretrain/nsf_hifigan目录下# nsf_hifigan
wget -P pretrain/ https://github.com/openvpi/vocoders/releases/download/nsf-hifigan-v1/nsf_hifigan_20221211.zip
unzip -od pretrain/nsf_hifigan pretrain/nsf_hifigan_20221211.zip
# 也可手动下载放在 pretrain/nsf_hifigan 目录
# 地址:https://github.com/openvpi/vocoders/releases/tag/nsf-hifigan-v1
如果使用rmvpeF0预测器的话,需要下载预训练的 RMVPE 模型
下载模型rmvpe.zip,目前首推该权重。
rmvpe.zip,并将其中的model.pt文件改名为rmvpe.pt并放在pretrain目录下下载模型 rmvpe.pt
pretrain目录下你说的对,但是FCPE是由svc-develop-team自主研发的一款全新的F0预测器,后面忘了
FCPE(Fast Context-base Pitch Estimator)是一个为实时语音转换所设计的专用F0预测器,他将在未来成为Sovits实时语音转换的首选F0预测器.(论文未来会有的)
如果使用 fcpe F0预测器的话,需要下载预训练的 FCPE 模型
pretrain目录下仅需要以以下文件结构将数据集放入 dataset_raw 目录即可。
dataset_raw
├───speaker0
│ ├───xxx1-xxx1.wav
│ ├───...
│ └───Lxx-0xx8.wav
└───speaker1
├───xx2-0xxx2.wav
├───...
└───xxx7-xxx007.wav
对于每一个音频文件的名称并没有格式的限制(000001.wav~999999.wav之类的命名方式也是合法的),不过文件类型必须是wav。
可以自定义说话人名称
dataset_raw
└───suijiSUI
├───1.wav
├───...
└───25788785-20221210-200143-856_01_(Vocals)_0_0.wav
将音频切片至5s - 15s, 稍微长点也无伤大雅,实在太长可能会导致训练中途甚至预处理就爆显存
可以使用 audio-slicer-GUI、audio-slicer-CLI
一般情况下只需调整其中的Minimum Interval,普通陈述素材通常保持默认即可,歌唱素材可以调整至100甚至50
切完之后手动删除过长过短的音频
如果你使用 Whisper-ppg 声音编码器进行训练,所有的切片长度必须小于 30s
python resample.py
虽然本项目拥有重采样、转换单声道与响度匹配的脚本 resample.py,但是默认的响度匹配是匹配到 0db。这可能会造成音质的受损。而 python 的响度匹配包 pyloudnorm 无法对电平进行压限,这会导致爆音。所以建议可以考虑使用专业声音处理软件如adobe audition等软件做响度匹配处理。若已经使用其他软件做响度匹配,可以在运行上述命令时添加--skip_loudnorm跳过响度匹配步骤。如:
python resample.py --skip_loudnorm
python preprocess_flist_config.py --speech_encoder vec768l12
speech_encoder 拥有以下选择
vec768l12
vec256l9
hubertsoft
whisper-ppg
whisper-ppg-large
cnhubertlarge
dphubert
wavlmbase+
如果省略 speech_encoder 参数,默认值为 vec768l12
使用响度嵌入
若使用响度嵌入,需要增加--vol_aug参数,比如:
python preprocess_flist_config.py --speech_encoder vec768l12 --vol_aug
使用后训练出的模型将匹配到输入源响度,否则为训练集响度。
keep_ckpts:训练时保留最后几个模型,0为保留所有,默认只保留最后3个
all_in_mem:加载所有数据集到内存中,某些平台的硬盘 IO 过于低下、同时内存容量 远大于 数据集体积时可以启用
batch_size:单次训练加载到 GPU 的数据量,调整到低于显存容量的大小即可
vocoder_name : 选择一种声码器,默认为nsf-hifigan.
cache_all_data:加载所有数据集到内存中,某些平台的硬盘 IO 过于低下、同时内存容量 远大于 数据集体积时可以启用
duration:训练时音频切片时长,可根据显存大小调整,注意,该值必须小于训练集内音频的最短时间!
batch_size:单次训练加载到 GPU 的数据量,调整到低于显存容量的大小即可
timesteps : 扩散模型总步数,默认为 1000.
k_step_max : 训练时可仅训练k_step_max步扩散以节约训练时间,注意,该值必须小于timesteps,0 为训练整个扩散模型,注意,如果不训练整个扩散模型将无法使用仅扩散模型推理!
nsf-hifigan
nsf-snake-hifigan
python preprocess_hubert_f0.py --f0_predictor dio
f0_predictor 拥有以下选择
crepe
dio
pm
harvest
rmvpe
fcpe
如果训练集过于嘈杂,请使用 crepe 处理 f0
如果省略 f0_predictor 参数,默认值为 rmvpe
尚若需要浅扩散功能(可选),需要增加--use_diff 参数,比如
python preprocess_hubert_f0.py --f0_predictor dio --use_diff
加速预处理
如若您的数据集比较大,可以尝试添加--num_processes参数:
python preprocess_hubert_f0.py --f0_predictor dio --use_diff --num_processes 8
所有的Workers会被自动分配到多个线程上
执行完以上步骤后 dataset 目录便是预处理完成的数据,可以删除 dataset_raw 文件夹了
python train.py -c configs/config.json -m 44k
尚若需要浅扩散功能,需要训练扩散模型,扩散模型训练方法为:
python train_diff.py -c configs/diffusion.yaml
模型训练结束后,模型文件保存在logs/44k目录下,扩散模型在logs/44k/diffusion下
# 例
python inference_main.py -m "logs/44k/G_30400.pth" -c "configs/config.json" -n "君の知らない物語-src.wav" -t 0 -s "nen"
必填项部分:
-m | --model_path:模型路径-c | --config_path:配置文件路径-n | --clean_names:wav 文件名列表,放在 raw 文件夹下-t | --trans:音高调整,支持正负(半音)-s | --spk_list:合成目标说话人名称-cl | --clip:音频强制切片,默认 0 为自动切片,单位为秒/s可选项部分:部分具体见下一节
-lg | --linear_gradient:两段音频切片的交叉淡入长度,如果强制切片后出现人声不连贯可调整该数值,如果连贯建议采用默认值 0,单位为秒-f0p | --f0_predictor:选择 F0 预测器,可选择 crepe,pm,dio,harvest,rmvpe,fcpe, 默认为 pm(注意:crepe 为原 F0 使用均值滤波器)-a | --auto_predict_f0:语音转换自动预测音高,转换歌声时不要打开这个会严重跑调-cm | --cluster_model_path:聚类模型或特征检索索引路径,留空则自动设为各方案模型的默认路径,如果没有训练聚类或特征检索则随便填-cr | --cluster_infer_ratio:聚类方案或特征检索占比,范围 0-1,若没有训练聚类模型或特征检索则默认 0 即可-eh | --enhance:是否使用 NSF_HIFIGAN 增强器,该选项对部分训练集少的模型有一定的音质增强效果,但是对训练好的模型有反面效果,默认关闭-shd | --shallow_diffusion:是否使用浅层扩散,使用后可解决一部分电音问题,默认关闭,该选项打开时,NSF_HIFIGAN 增强器将会被禁止-usm | --use_spk_mix:是否使用角色融合/动态声线融合-lea | --loudness_envelope_adjustment:输入源响度包络替换输出响度包络融合比例,越靠近 1 越使用输出响度包络-fr | --feature_retrieval:是否使用特征检索,如果使用聚类模型将被禁用,且 cm 与 cr 参数将会变成特征检索的索引路径与混合比例浅扩散设置:
-dm | --diffusion_model_path:扩散模型路径-dc | --diffusion_config_path:扩散模型配置文件路径-ks | --k_step:扩散步数,越大越接近扩散模型的结果,默认 100-od | --only_diffusion:纯扩散模式,该模式不会加载 sovits 模型,以扩散模型推理-se | --second_encoding:二次编码,浅扩散前会对原始音频进行二次编码,玄学选项,有时候效果好,有时候效果差如果使用whisper-ppg 声音编码器进行推理,需要将--clip设置为 25,-lg设置为 1。否则将无法正常推理。
如果前面的效果已经满意,或者没看明白下面在讲啥,那后面的内容都可以忽略,不影响模型使用(这些可选项影响比较小,可能在某些特定数据上有点效果,但大部分情况似乎都感知不太明显)
4.0 模型训练过程会训练一个 f0 预测器,对于语音转换可以开启自动音高预测,如果效果不好也可以使用手动的,但转换歌声时请不要启用此功能!!!会严重跑调!!
介绍:聚类方案可以减小音色泄漏,使得模型训练出来更像目标的音色(但其实不是特别明显),但是单纯的聚类方案会降低模型的咬字(会口齿不清)(这个很明显),本模型采用了融合的方式,可以线性控制聚类方案与非聚类方案的占比,也就是可以手动在"像目标音色" 和 "咬字清晰" 之间调整比例,找到合适的折中点
使用聚类前面的已有步骤不用进行任何的变动,只需要额外训练一个聚类模型,虽然效果比较有限,但训练成本也比较低
python cluster/train_cluster.py,模型的输出会在logs/44k/kmeans_10000.ptpython cluster/train_cluster.py --gpuinference_main.py中指定cluster_model_path 为模型输出文件,留空则默认为logs/44k/kmeans_10000.ptinference_main.py中指定cluster_infer_ratio,0为完全不使用聚类,1为只使用聚类,通常设置0.5即可介绍:跟聚类方案一样可以减小音色泄漏,咬字比聚类稍好,但会降低推理速度,采用了融合的方式,可以线性控制特征检索与非特征检索的占比,
python train_index.py -c configs/config.json
模型的输出会在logs/44k/feature_and_index.pkl
--feature_retrieval,此时聚类方案会自动切换到特征检索方案inference_main.py中指定cluster_model_path 为模型输出文件,留空则默认为logs/44k/feature_and_index.pklinference_main.py中指定cluster_infer_ratio,0为完全不使用特征检索,1为只使用特征检索,通常设置0.5即可生成的模型含有继续训练所需的信息。如果确认不再训练,可以移除模型中此部分信息,得到约 1/3 大小的最终模型。
# 例
python compress_model.py -c="configs/config.json" -i="logs/44k/G_30400.pth" -o="logs/44k/release.pth"
参考webUI.py文件中,小工具/实验室特性的静态声线融合。
介绍:该功能可以将多个声音模型合成为一个声音模型(多个模型参数的凸组合或线性组合),从而制造出现实中不存在的声线 注意:
参考spkmix.py文件中关于动态声线混合的介绍
角色混合轨道 编写规则:
角色 ID : [[起始时间 1, 终止时间 1, 起始数值 1, 起始数值 1], [起始时间 2, 终止时间 2, 起始数值 2, 起始数值 2]]
起始时间和前一个的终止时间必须相同,第一个起始时间必须为 0,最后一个终止时间必须为 1 (时间的范围为 0-1)
全部角色必须填写,不使用的角色填、[[0., 1., 0., 0.]] 即可
融合数值可以随便填,在指定的时间段内从起始数值线性变化为终止数值,内部会自动确保线性组合为 1(凸组合条件),可以放心使用
推理的时候使用--use_spk_mix参数即可启用动态声线混合
checkpoints 并打开checkpoints文件夹中新建一个文件夹作为项目文件夹,文件夹名为你的项目名称,比如aziplayermodel.pth,配置文件更名为config.json,并放置到刚才创建的aziplayer文件夹下path = "NyaruTaffy" 的 "NyaruTaffy" 修改为你的项目名称,path = "aziplayer" (onnx_export_speaker_mix,为支持角色混合的 onnx 导出)model.onnx,即为导出的模型注意:Hubert Onnx 模型请使用 MoeSS 提供的模型,目前无法自行导出(fairseq 中 Hubert 有不少 onnx 不支持的算子和涉及到常量的东西,在导出时会报错或者导出的模型输入输出 shape 和结果都有问题)
| URL | 名称 | 标题 | 源码 |
|---|---|---|---|
| 2106.06103 | VITS (Synthesizer) | Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech | jaywalnut310/vits |
| 2111.02392 | SoftVC (Speech Encoder) | A Comparison of Discrete and Soft Speech Units for Improved Voice Conversion | bshall/hubert |
| 2204.09224 | ContentVec (Speech Encoder) | ContentVec: An Improved Self-Supervised Speech Representation by Disentangling Speakers | auspicious3000/contentvec |
| 2212.04356 | Whisper (Speech Encoder) | Robust Speech Recognition via Large-Scale Weak Supervision | openai/whisper |
| 2110.13900 | WavLM (Speech Encoder) | WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing | microsoft/unilm/wavlm |
| 2305.17651 | DPHubert (Speech Encoder) | DPHuBERT: Joint Distillation and Pruning of Self-Supervised Speech Models | pyf98/DPHuBERT |
| DOI:10.21437/Interspeech.2017-68 | Harvest (F0 Predictor) | Harvest: A high-performance fundamental frequency estimator from speech signals | mmorise/World/harvest |
| aes35-000039 | Dio (F0 Predictor) | Fast and reliable F0 estimation method based on the period extraction of vocal fold vibration of singing voice and speech | mmorise/World/dio |
| 8461329 | Crepe (F0 Predictor) | Crepe: A Convolutional Representation for Pitch Estimation | maxrmorrison/torchcrepe |
| DOI:10.1016/j.wocn.2018.07.001 | Parselmouth (F0 Predictor) | Introducing Parselmouth: A Python interface to Praat | YannickJadoul/Parselmouth |
| 2306.15412v2 | RMVPE (F0 Predictor) | RMVPE: A Robust Model for Vocal Pitch Estimation in Polyphonic Music | Dream-High/RMVPE |
| 2010.05646 | HIFIGAN (Vocoder) | HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis | jik876/hifi-gan |
| 1810.11946 | NSF (Vocoder) | Neural source-filter-based waveform model for statistical parametric speech synthesis | openvpi/DiffSinger/modules/nsf_hifigan |
| 2006.08195 | Snake (Vocoder) | Neural Networks Fail to Learn Periodic Functions and How to Fix It | EdwardDixon/snake |
| 2105.02446v3 | Shallow Diffusion (PostProcessing) | DiffSinger: Singing Voice Synthesis via Shallow Diffusion Mechanism | CNChTu/Diffusion-SVC |
| K-means | Feature K-means Clustering (PreProcessing) | Some methods for classification and analysis of multivariate observations | 本代码库 |
| Feature TopK Retrieval (PreProcessing) | Retrieval based Voice Conversion | RVC-Project/Retrieval-based-Voice-Conversion-WebUI |
因为某些原因原作者进行了删库处理,本仓库重建之初由于组织成员疏忽直接重新上传了所有文件导致以前的 contributors 全部木大,现在在 README 里重新添加一个旧贡献者列表
某些成员已根据其个人意愿不将其列出
<table> <tr> <td align="center"><a href="https://github.com/MistEO"> <sub><b>MistEO</b></sub></a> </td> <td align="center"><a href="https://github.com/XiaoMiku01"> <sub><b>XiaoMiku01</b></sub></a> </td> <td align="center"><a href="https://github.com/ForsakenRei"> <sub><b>しぐれ</b></sub></a> </td> <td align="center"><a href="https://github.com/TomoGaSukunai"> <sub><b>TomoGaSukunai</b></sub></a> </td> <td align="center"><a href="https://github.com/Plachtaa"> <sub><b>Plachtaa</b></sub></a> </td> <td align="center"><a href="https://github.com/zdxiaoda"> <sub><b>zd 小达</b></sub></a> </td> <td align="center"><a href="https://github.com/Archivoice"> <sub><b>凍聲響世</b></sub></a> </td> </tr> </table>任何组织或者个人不得以丑化、污损,或者利用信息技术手段伪造等方式侵害他人的肖像权。未经肖像权人同意,不得制作、使用、公开肖像权人的肖像,但是法律另有规定的除外。未经肖像权人同意,肖像作品权利人不得以发表、复制、发行、出租、展览等方式使用或者公开肖像权人的肖像。对自然人声音的保护,参照适用肖像权保护的有关规定。
【名誉权】民事主体享有名誉权。任何组织或者个人不得以侮辱、诽谤等方式侵害他人的名誉权。
【作品侵害名誉权】行为人发表的文学、艺术作品以真人真事或者特定人为描述对象,含有侮辱、诽谤内容,侵害他人名誉权的,受害人有权依法请求该行为人承担民事责任。行为人发表的文学、艺术作品不以特定人为描述对象,仅其中的情节与该特定人的情况相似的,不承担民事责任。