尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RVC 训练数据全流程指南:Retrieval-based-Voice-Conversion-WebUI 从数据集预处理到模型训练的完整解析

RVC 训练数据全流程指南:Retrieval-based-Voice-Conversion-WebUI 从数据集预处理到模型训练的完整解析 RVC 训练数据全流程指南Retrieval-based-Voice-Conversion-WebUI 从数据集预处理到模型训练的完整解析【免费下载链接】Retrieval-based-Voice-Conversion-WebUIEasily train a good VC model with voice data 10 mins!项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI本指南以仓库内的多语言文档《Instruções e dicas para treinamento RVC》docs/pt/training_tips_pt.md英文对应 docs/en/training_tips_en.md为主体骨架完整还原 RVC 模型的数据训练流程从训练界面 Step1 实验配置、Step2 音频预处理与音高/特征提取到 Step3 模型训练与特征索引faiss index生成。文中所有细节均对照当前仓库的源码实现逐一核实读者读完不仅能按 WebUI 一步步完成一次训练还能理解每个按钮、每个参数背后的数据管道与网络机制。一、训练整体流程与实验目录约定RVC 的训练全部围绕一个「实验experiment」展开。在 WebUI 的训练Treinamento / Training标签页中整个流程被划分为几个连续步骤本文按官方文档的顺序逐一展开步骤作用对应产物写入logs/实验名/Step 1设置实验名、决定是否启用音高pitch建模定义实验目录logs/nome-do-seu-modelo/Step 2a载入并预处理音频去噪、切片、归一化、重采样0_gt_wavs/、1_16k_wavs/Step 2b提取音高 f0 与 HuBERT 语音特征2a_f0/、2b-f0nsf/、3_feature256/v2 为3_feature768/Step 3训练生成器/判别器模型、训练 faiss 特征索引G_*.pth、D_*.pth、add_*.index、train.log一个最基本的约定是每次实验的所有中间数据都集中存放在logs/实验名/目录该目录在预处理阶段被自动创建。保留这些中间文件的意义在于——后续如果你只是微调超参数或想接着中断的进度继续训练这些缓存可以直接复用无需重新跑昂贵的特征提取。二、Step 1实验命名与「是否考虑音高」开关进入训练界面后第一步是为本次实验命名。此外还有一个对最终模型形态影响巨大的开关模型是否考虑音高pitch。若选择考虑音高f0模型会把逐帧的音高信息作为额外条件输入训练得到的模型擅长表达旋律起伏适合歌声转换若选择不考虑音高模型的输入通道更少、结构更轻量但不适合歌唱场景一般仅用于保留原曲音调不变的「说话/朗读」类转换。在代码层面这一开关对应训练入口脚本 infer/modules/train/train.py 中的if_f0参数。train.py会依据该参数选择不同的数据集加载器与模型构造分支if hps.if_f0 1: train_dataset TextAudioLoaderMultiNSFsid(hps.data.training_files, hps.data) else: train_dataset TextAudioLoader(hps.data.training_files, hps.data)模型类的选择也有两套考虑音高时使用SynthesizerTrnMs256NSFsid/SynthesizerTrnMs768NSFsidv2带NSF神经源滤波器结构不考虑音高时则使用同名_nono变体两者的判别器也分别对应MultiPeriodDiscriminatorv1与MultiPeriodDiscriminatorV2v2。是否带音高还会直接决定后续提取音高步骤是否必要见 Step 2b。三、Step 2a音频载入、去噪与切片Step 2a 负责把原始音频可以是一个文件夹里的多个文件处理成干净、长度统一的训练切片。整个过程可以在 infer/modules/train/preprocess.py 中完整看到共包含三个阶段。3.1 载入音频只扫描一层目录 ffmpeg 解码在界面中指定一个音频文件夹后程序会读取该文件夹下仅顶层、不递归子目录的所有音频文件。文档中给出的例子是若指定C:\Users\hoge\voices则C:\Users\hoge\voices\voice.mp3会被载入而C:\Users\hoge\voices\dir\voice.mp3不会。这是因为 preprocess.py 内部使用os.listdir(inp_root)直接列举顶层文件infos [ (%s/%s % (inp_root, name), idx) for idx, name in enumerate(sorted(list(os.listdir(inp_root)))) ]音频解码工作由load_audio完成实现在 infer/lib/audio.py底层依赖ffmpeg因此凡是 ffmpeg 支持的格式mp3、wav、flac、m4a、ogg 等都会被自动读取。解码流程是先由 ffmpeg 把原始数据转为int16再转为float32并归一化到[-1, 1]区间。3.2 去噪高通滤波预处理会做一次去噪/平滑处理。文档描述为使用 scipy 的filtfilt平滑音频。在 preprocess.py 中可见其真实实现self.bh, self.ah signal.butter(N5, Wn48, btypehigh, fsself.sr)代码构造了一个 5 阶、截止频率 48 Hz 的 butterworth高通滤波器用于削除直流偏置与低频底噪源码中同样写有一行audio signal.filtfilt(...)但已被注释掉并备注zero phased digital filter cause pre-ringing noise...零相位滤波会产生预振铃噪声因此实际生效的是signal.lfilter。这一处细节也说明仓库代码经过演进部分与文档文字存在出入一切以源码为最终依据。3.3 音频切片静音切分 定长滑窗切分由Slicer完成实现于 infer/lib/slicer2.py。文档描述的流程是先依据超过一定时长的静音段文档写作max_sil_kept5 seconds?带问号表示不确切切分音频再以每段约 4 秒、前后重叠 0.3 秒的方式进一步切成训练用短句。对照 preprocess.py 中 Slicer 的实际构造参数参数代码取值含义threshold-42静音判定门限dBFSmin_length1500最短有效片段msmin_interval400两个静音间隔之间最短时长mshop_size15静音检测帧移msmax_sil_kept500每段切分后最大保留的静音尾长毫秒注意这里max_sil_kept500的单位是毫秒0.5 秒文档中推测的「5 seconds」并不精确训练时建议以源码为准。切完静音后PreProcess按定长窗口 重叠滑窗再切一次preprocess.py窗口长度取self.per代码默认3.7秒步进为per - overlap其中overlap 0.3秒从而形成文档所说的「约 4 秒为一段、每段与前段重叠 0.3 秒」的短句流窗口滑到不足一段时尾部剩余音频作为最后一段写出。对每一段 4 秒切片norm_writepreprocess.py会执行音量归一化并写出两路产物若切片峰值|x| 2.5则判定为异常爆音直接丢弃对应日志中的-filtered标记否则按(x / max * (max * alpha)) (1 - alpha) * x归一化max0.9、alpha0.75以原始目标采样率如 40k/48k写入logs/实验名/0_gt_wavs/——这是后续用于训练重建的「干净目标波形」再用librosa.resample重采样到16000 Hz写入logs/实验名/1_16k_wavs/——这是后续提取音高与 HuBERT 特征所统一使用的低采样率输入。预处理阶段支持多进程并行n_p个进程按文件均分并会实时把每个文件成功/失败的原因追加写入logs/实验名/preprocess.log。四、Step 2b提取音高 f0 与 HuBERT 语音特征4.1 提取音高f0音高提取读取1_16k_wavs/下的 16k 音频逐帧估计基频fundamental frequency, f0。仓库提供了多套算法实现分布在 infer/modules/train/extract/extract_f0_print.py 与 infer/modules/train/extract/extract_f0_rmvpe.pyf0method实现库说明pmparselmouthPraat 的 autocorrelation 算法time_step10ms、voicing_threshold0.6harvestpyworldWORLD 的 harvest 提取 stonemask精修diopyworldWORLD 的 dio 提取 stonemask精修rmvpe内置神经网络使用assets/rmvpe/rmvpe.pt模型RMVPE 为歌唱场景优化CPU 推理脚本见extract_f0_print.pyGPU 推理见extract_f0_rmvpe.py提取器内部固定fs16000、hop160即每 10ms 一帧f0 搜索范围为50–1100 Hz见 extract_f0_print.py。按文档描述原始 f0 信息保存到2a_f0/随后通过对数刻度量化映射为 1–255 的整数并保存到2b-f0nsf/。量化过程在coarse_f0()中实现先把频率按「mel 刻度」换算1127 * ln(1 f/700)再线性映射到 1~255 的整数区间并断言结果恒在[1, 255]内extract_f0_print.py。需要指出一个文档与当前代码的版本差异在 extract_f0_print.py 的实际写入逻辑中2a_f0/保存的才是量化后的整数编码变量名coarse_pit注释为ori而2b-f0nsf/保存的是神经网络 NSF 模块所需的原始连续帧 f0变量名featur_pit注释为nsf。也就是说教程文字与代码注释的命名正好相反二者以源码实际落盘内容为准。这套流程可用 GPU 按卡分片并行extract_f0_rmvpe.py支持n_part/i_part切分多卡环境会把不同分片分配到不同CUDA_VISIBLE_DEVICES也可用n_p个 CPU 进程并行extract_f0_print.py。4.2 提取 HuBERT 语音特征featureRVC 的另一路关键输入是HuBERT 自监督语音表示在训练前先把所有 16k 音频一次性前向推理成「语音内容嵌入」训练与推理阶段都不再重复跑 HuBERT从而大幅压缩训练开销。实现位于 infer/modules/train/extract_feature_print.py读取logs/实验名/1_16k_wavs/下的 16k wav代码中assert sr 16000加载assets/hubert/hubert_base.ptfairseq 格式推理依据模型版本不同输出层与保存目录也不同extract_feature_print.pyoutPath ( %s/3_feature256 % exp_dir if version v1 else %s/3_feature768 % exp_dir ) ... output_layer: 9 if version v1 else 12, # layer 9即v1提取 HuBERT 第9层特征并经过final_proj投影为256 维保存为3_feature256/下的.npyv2提取第12层原始隐藏状态维度为768保存为3_feature768/。这一步同样支持多 GPU 分片且is_halfTrue时会在 GPU 上用 fp16 推理以节约显存。若某段特征在推理后出现NaN对应文件会被跳过并写入日志避免脏数据进入训练集。五、Step 3训练模型5.1 先弄清几个深度学习术语文档专门为新手准备了一份迷你术语表是理解训练参数的前提step步骤一次模型参数更新。每次从数据集中抽取一个batch_size的数据做一次前向预测 反向纠错epoch轮次把整个数据集完整过一遍训练的过程batch_size批大小一个 step 内同时送入 GPU 的样本数。因此一个朴素的总训练时长估算公式为总时长 ≈ 单步训练时间 × (数据集样本数 / batch_size) × epoch 数文档强调batch_size 越大训练越稳定同时「单步时间 ÷ batch_size」得到的单位样本开销越小吞吐更高但它占用更多显存。查看显存占用可用nvidia-smi命令进阶做法是尽量依据本机显存把 batch_size 提到最大来缩短训练时间。此外从 train.py 可以看到数据采样采用DistributedBucketSampler按音频长度分桶桶边界从 100 到 900 帧不等把长度相近的样本放进同一 batch避免长短混批造成浪费这也是影响训练效率的隐藏机制。5.2 从预训练权重开始而不是从零训练RVC 之所以能用不超过 10 分钟级别的小数据量训出可用模型核心原因是模型不是从随机初始化开始训练而是加载大规模预训练底模权重后做迁移/微调。按照 WebUI 默认配置训练时程序会加载以下预训练权重示例为 40k 采样率目标考虑音高f0时加载pretrained/f0G40k.pth与pretrained/f0D40k.pth不考虑音高时加载对应的无音高权重对。需要说明文档中对两行给出的文件名完全相同属教程表述疏漏从仓库实际情况看预训练权重按采样率与是否带 f0 分为多种命名例如G40k.pth/D40k.pth不带音高与f0G40k.pth/f0D40k.pth带音高并同时提供 32k / 40k / 48k 版本。仓库中的 v1 权重位于 assets/pretrainedv2 权重位于 assets/pretrained_v2可参考 Dockerfile 的下载清单目标采样率决定选择哪个数字后缀。训练时还应当选择与pretrained/模型匹配的模型版本与采样率否则会因结构不匹配而加载失败。在代码层面加载逻辑位于 train.py启动时会优先尝试自动续训——若logs/实验名/下已存在最新的G_*.pth/D_*.pthcheckpoint则加载其权重、优化器与 epoch 进度继续训练只有没有任何 checkpoint 时才会去加载pretrainG/pretrainD指定的底模并从头记录 epoch。5.3 模型与保存机制训练采用对抗式架构生成器net_gSynthesizerTrnMs{256,768}NSFsid负责从 HuBERT 特征f0合成波形多周期判别器net_d负责区分真实/合成音频二者交替更新损失由对抗损失generator/discriminator、特征匹配损失feature_loss、mel 谱 L1 损失与 KL 损失加权组合而成train.py。训练支持 fp16 混合精度torch.cuda.amp、多卡 DDP、指数衰减学习率调度并把 loss 曲线与频谱图写入 TensorBoardSummaryWriter日志落在logs/实验名/events.*。每经过save_every_epoch个 epoch程序会把当前参数保存为logs/实验名/G_global_step.pth logs/实验名/D_global_step.pth文档特别说明只要在界面上把路径指定到这类 checkpoint 文件就可以从中断点恢复训练也可以把别的实验训出的权重拿过来作为起点继续训练——这正是 RVC 支持「中途加数据再训练」的机制基础。若勾选仅保存最新if_latest1则统一覆盖保存为G_2333333.pth以减少磁盘占用若开启「保存小模型」save_every_weights1还会在每个保存节点额外调用savee()见 infer/lib/train/process_ckpt.py把生成器单独抽取为可直接用于推理的 60MB 小模型并写入weights/。训练结束后日志会输出Training is done. The program is closed.。命令行训练的真实入口参数由 infer/lib/train/utils.py 的get_hparams()解析罗列如下供脱离 WebUI 直接调用 train.py 时参考参数含义-se / --save_every_epochcheckpoint 保存间隔epoch 数-te / --total_epoch总训练 epoch 数-pg / --pretrainG预训练生成器路径-pd / --pretrainD预训练判别器路径-g / --gpusGPU 编号多卡用-连接如0-1-bs / --batch_size批大小-e / --experiment_dir实验目录名映射到logs/下-sr / --sample_rate采样率 32k/40k/48k-sw / --save_every_weights保存节点是否同步抽取推理小模型到weights/-v / --version模型版本 v1/v2-f0 / --if_f0是否把 f0 作为模型输入1/0-l / --if_latest是否只保留最新一份 G/D1/0-c / --if_cache_data_in_gpu是否把整个数据集缓存进显存以提速1/0其中-c缓存模式会显著减少每轮的数据搬运但对显存要求高需与-bs一起权衡。模型超参total_epoch以外的网络配置来自各采样率下的 configs/v1/40k.json 等模板文件会在实验目录内复制成logs/实验名/config.json。5.4 训练 faiss 特征索引Index推理阶段RVC 并非只靠生成器「自由发挥」而是让生成器以训练数据中相似语音的 HuBERT 特征为参考进行还原以压制音色漂移。要做到这一步就需要预先对 Step 2b 提取的全部 HuBERT 特征建一个可高速检索的索引。训练时模型会把训练用到的 HuBERT 特征值保存下来推理时逐帧在索引中近似最近邻检索approximate nearest neighbor找到与输入特征最接近的历史特征参与生成为了让检索足够快索引需要在训练后用 faiss 预先构建。索引训练脚本见 tools/infer/train-index.py读取logs/实验名/3_feature256/的全部.npy并拼接为一个大矩阵然后index faiss.index_factory(256, IVF512,Flat) index_ivf faiss.extract_index_ivf(index) index_ivf.nprobe 9 index.train(big_npy) index.add(big_npy)即采用IVF512,Flat倒排索引结构检索时探测nprobe9个聚类单元训练完成后再把全部特征add进去产物保存为logs/实验名/add_XXX.index文件名中的XXX随参数组合变化例如added_IVF512_Flat_nprobe_7.index。文档同时给出一个重要版本说明自 20230428update 版本起推理端改为直接从该索引读取用户不再需要手动保存/指定索引路径。需要强调Index 学习的是「训练集音色的检索参考」它只是加速推理时的特征检索并不参与生成器的参数训练因此文档把「Train model」与「Train feature index」区分为两个独立动作。5.5 三个按钮与一键训练Step 3 界面上三个按钮的含义在 training_tips_pt.md 中有明确说明Treinar modelo训练模型确保 Step 2b 完成后按下启动生成器/判别器训练Treinar índice de recursos训练特征索引模型训练结束后执行对3_feature256/768建 faiss 索引Treinamento com um clique一键训练把 Step 2b音高特征提取、模型训练、索引训练三件事串行自动完成。六、训练调参与常见问题提示训练档位没有绝对标准但仓库 FAQ葡萄牙语版见 docs/pt/faq_pt.md中文版见 docs/cn/faq.md给出的经验对新手极具参考价值总 epoch 建议训练集音质较差、底噪大时 20~30 轮已足够——底模本身带不动劣质数据训练集音质高、底噪低且时长远超底限时可以调到 200 轮左右训练速度很快好显卡完全负担得起训练集时长建议官方推荐10 至 50 分钟音质高、底噪低、音色统一的情况下多多益善音色极具特色且高度精简的 5~10 分钟也能出好效果显存不足CUDA out of memory训练侧优先调小 batch_size若小到 1 仍不够则只能更换更大显存的显卡。此外还能借助训练界面的 GPU 显存监控观察实际占用并可用nvidia-smi随时核查合理使用 CPU 并行音高/特征提取阶段的 CPU 进程数不宜盲目拉高进程过多会导致内存峰值过高尤其切分后文件很多时不要中途更换采样率续训若必须变更采样率应更换实验名从头训练或把上次已产出的音高与特征目录0/1/2/2b拷贝到新实验名下加速流程模型分享的正确姿势logs/实验名/下的G_*.pth体积可达数百 MB它是「实验状态快照」用于复现与续训不能直接拿去推理会因缺少 f0/tgt_sr 等键值而报错。用于分享的是weights/下经 ckpt 小模型抽取得到的 60MB 推理模型另见 docs/cn/faq.md Q4。七、小结RVC 的整个训练链路可以浓缩成一条可复现的数据管道Step 1 定实验与音高开关 → Step 2a ffmpeg 解码 高通去噪 静音/定长切分 双路输出原始采样率0_gt_wavs与 16k1_16k_wavs→ Step 2b pyworld/parselmouth/RMVPE 提取 f0 HuBERT 提取内容特征 → Step 3 从 40k 底模微调生成器/判别器并保存 checkpoint再用 faiss 对特征建索引用于推理检索。理解每个目录编号0_gt_wavs、1_16k_wavs、2a_f0、2b-f0nsf、3_feature256/768与每个界面参数在源码中的落点preprocess.py、extract_feature_print.py、train.py就能脱离「照着界面点」的盲盒状态真正掌握小数据量训练一个可用的歌声转换模型所需的全部关键变量。【免费下载链接】Retrieval-based-Voice-Conversion-WebUIEasily train a good VC model with voice data 10 mins!项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表