ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Retrieval-based-Voice-Conversion-WebUI(RVC)模型训练实战指南:从数据预处理、音高/特征提取到训练参数详解

Retrieval-based-Voice-Conversion-WebUI(RVC)模型训练实战指南:从数据预处理、音高/特征提取到训练参数详解 Retrieval-based-Voice-Conversion-WebUIRVC模型训练实战指南从数据预处理、音高/特征提取到训练参数详解【免费下载链接】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本文以官方文档 docs/en/training_tips_en.md 为主体结合当前仓库中 GUIinfer-web.py、预处理与特征提取脚本、训练脚本等源码逐环节展开。读完本文你将完整掌握 RVC 训练 Tab 中 step1/step2a/step2b/step3 每一步的底层原理、目录产物与参数含义能依据自己的机器配置显存、CPU 核数、是否唱歌场景自主设定训练参数并理解预训练模型、Faiss 特征索引与一键训练的工作机制。一、RVC 训练流程总览一次训练的完整链路RVCRetrieval-based Voice Conversion用不超过 10 分钟甚至更短的干净人声即可训练一个可用的音色转换模型。其训练 Tab 把整条流水线拆成几个可独立点击的步骤官方文档按 GUI 顺序依次讲解。将文档步骤与仓库源码对应可以得到如下链路步骤GUI 上的作用核心脚本产物目录logs/实验名/下step1填写实验配置GUI 直接处理实验文件夹本身step2a数据处理infer/modules/train/preprocess.py0_gt_wavs、1_16k_wavsstep2b提取音高 HuBERT 特征infer/modules/train/extract/extract_f0_print.py、infer/modules/train/extract_feature_print.py2a_f0、2b-f0nsf、3_feature256/3_feature768step3a训练生成器 G 与判别器 Dinfer/modules/train/train.pyG_*.pth、D_*.pth、train.log等step3b训练 Faiss 特征索引GUI 内train_index函数added_IVF*.index等GUI 中三行 Markdown 注释对这三个阶段做了精炼概括见 infer-web.py#L1206-L1291step2a自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化在实验目录下生成 2 个 wav 文件夹暂时只支持单人训练step2b使用 CPU 提取音高如果模型带音高使用 GPU 提取特征选择卡号step3填写训练设置开始训练模型和索引。二、step1实验命名、采样率与是否带音高pitch指导step1 只做两件事设置实验名exp_name。每次实验的数据、日志与模型都存放在logs/你的实验名/下GUI 默认值为mi-testinfer-web.py#L1178。因此实验名既是文件夹名也是模型的身份标识。决定模型是否考虑音高。GUI 的说明非常直接模型是否带音高指导唱歌一定要语音可以不要infer-web.py#L1185-L1189。关于是否带音高官方文档给出的取舍是不考虑音高时模型更轻量但不适合唱歌。原因是带音高的模型把基频 f0 作为额外输入源码对应SynthesizerTrnMs256NSFsid/SynthesizerTrnMs768NSFsid转换时能保留源音频的旋律线不带音高的模型SynthesizerTrnMs256NSFsid_nono/SynthesizerTrnMs768NSFsid_nono见 infer/modules/train/train.py#L57-L68更适合偏说话风格的配音转换模型更小、更省资源。除上述两个文档明确提到的选项外GUI 在 step1 还提供两个与模型架构强相关的开关infer-web.py#L1179-L1197目标采样率40k/48kv1 仅这两档切到 v2 后还多出32k档相关联动逻辑见 infer-web.py#L433-L452。它决定实验音频被切到多少采样率保存以及最终加载哪份 json 配置版本 v1 / v2默认 v2。两者的核心差异之一是 HuBERT 特征维度不同——v1 使用 256 维特征3_feature256v2 使用 768 维特征3_feature768。源码补充GUI 的是/否考虑音高在底层会同时决定两件事训练命令中的-f0 1/0参数以及加载哪一套预训练模型带 f0 前缀 vs 不带见下文 step3 预训练小节。三、step2a数据预处理加载 → 去噪 → 切片 → 归一化step2a 的输入是一个训练音频文件夹GUI 中还可指定说话人 id见 infer-web.py#L1212-L1232。核心实现在 infer/modules/train/preprocess.py其命令行参数依次为输入目录、采样率、CPU 进程数、实验目录、是否并行、单段秒数。3.1 加载音频load audio文档要点只需指定文件夹其中的音频文件会被自动读取不会递归读取子目录。例如指定C:\Users\hoge\voices时C:\Users\hoge\voices\voice.mp3会被读入但C:\Users\hoge\voices\dir\voice.mp3不会。源码中确实是os.listdir平铺扫描顶层文件preprocess.py#L111-L116所以请把所有素材直接平铺放在同一层目录内部用 ffmpeg 解码凡是 ffmpeg 支持的扩展名都能读mp3/wav/m4a/flac 等。需要留意一个与文档描述的差异官方文档写道先用 ffmpeg 转成 int16再转 float32 并归一化到 -1~1而当前仓库的实现是让 ffmpeg 直接输出 32 位浮点 PCM、单声道、重采样到目标采样率见 infer/lib/audio.py#L32-L51float32 采样值天然落在 [-1,1]不再有 int16 中间步骤。这一实现与 Whisper 的音频读取思路一致源码注释中亦有引用。3.2 去噪denoising文档称音频会经过 scipy 的 filtfilt 平滑。结合源码看这里的去噪实为高通滤波使用 scipysignal.butter构造 5 阶、截止频率 48 Hz 的高通滤波器滤除 48 Hz 以下的低频隆隆声/直流分量preprocess.py#L46。另一个与文档的细节差异当前代码中实际调用的是signal.lfilter而非filtfilt。源码注释解释了原因零相位滤波filtfilt会引入前振铃pre-ringing噪声因此改用普通因果滤波preprocess.py#L84-L86。如果你在旧版本文档或讨论中看到 filtfilt 的描述需要注意当前实现已调整。3.3 音频切片与响度归一化文档对切片的描述是先按超过一定时长的静音段文档猜测max_sil_kept5 秒切分音频然后再按每 4 秒一段、0.3 秒重叠继续切4 秒内的音频做响度归一化后写入两个目录。源码中的真实参数preprocess.py#L36-L52为静音检测切片器Slicerthreshold-42 dB低于 -42 dB 视为静音、min_length1500、min_interval400、hop_size15、max_sil_kept500单位毫秒即约 0.5 秒——这是对文档中5 秒猜测的修正单段长度per默认取配置项config.preprocess_per即3.7 秒GUI 完整命令行见 infer-web.py#L218-L232。在低显存≤4 GB或无法使用 fp16 的机器上会被下调到 3.0 秒见 configs/config.py#L128-L177重叠overlap0.3秒切分循环以per - overlap为步长滑动避免断句被生硬切断preprocess.py#L88-L102。响度归一化并非简单的峰值归一而是一个带软限制的混合公式norm_writepreprocess.py#L59-L79tmp_audio (tmp_audio / tmp_max * (max * alpha)) (1 - alpha) * tmp_audio其中max0.9、alpha0.75本质是75% 的峰值归一化结果 25% 原始信号把响度拉齐的同时保留原始动态若单段信号峰值异常|tmp|2.5通常意味着爆音/破音该段会被直接过滤丢弃。最终每个切片生成两份文件原始采样率如 40k/48k的 wav →logs/实验名/0_gt_wavs/Ground Truth供训练比对真实波形重采样到16 kHz的 wav →logs/实验名/1_16k_wavs/供后续 HuBERT 提取特征因为 HuBERT 的输入采样率就是 16k。预处理全程日志实时写入实验目录下的preprocess.logGUI 的处理数据按钮会边跑边回传这些日志infer-web.py#L245-L254。四、step2b音高提取与 HuBERT 特征提取step2b 的 GUI 说明是使用 CPU 提取音高如果模型带音高使用 GPU 提取特征选择卡号infer-web.py#L1233-L1237。GUI 提供 CPU 进程数滑杆范围 0 到机器 CPU 核数、GPU 卡号输入形如0-1-2以及 f0 算法选择infer-web.py#L1198-L1268。4.1 提取音高 f0官方文档从 wav 中提取音高信息使用 parselmouthpm 算法或 pyworldharvest/dio内置方法完成原始 f0 与量化后的 f0 分别保存随后将音高做对数/梅尔化映射并量化为 1~255 的整数。源码实现见 infer/modules/train/extract/extract_f0_print.py统一从1_16k_wavs读取音频hop 长度 160即 16k 下每 10 ms 一个音高帧可选算法GUI 的f0methodpmparselmouth 的to_pitch_ac自相关法f0 范围 50~1100 Hzharvest/diopyworld 算法其中 harvest 精度更高但更慢dio 更快后续还用stonemask精修extract_f0_print.py#L66-L83rmvpe基于 infer/lib/rmvpe.py 的深度学习音高估计加载assets/rmvpe/rmvpe.pt效果最好rmvpe_gpu把 rmvpe 放到 GPU 上多进程跑对应 infer/modules/train/extract/extract_f0_rmvpe.py。量化不是对数而是梅尔尺度。源码coarse_f0用1127 * ln(1 f/700)把频率转到 mel 域再线性映射到 1~255 的整数 binf0_bin256extract_f0_print.py#L95-L109。目录对应关系需要按当前源码厘清量化后的整数 f0 写入2a_f0连续值 f0 写入2b-f0nsfextract_f0_print.py#L149-L160。官方文档中2a_f0 存原始 f0、2b-f0nsf 存量化值的描述与当前实现相反阅读旧资料时需注意。训练时两者都会被用到前者是模型 token 化的 coarse pitch后者作为 nsf 细粒度 f0 输入。4.2 HuBERT 特征提取feature_print文档用 HuBERT 把1_16k_wavs里的 wav 预计算为 embeddingv1 为 256 维特征以 npy 存入3_feature256。脚本为 infer/modules/train/extract_feature_print.py加载assets/hubert/hubert_base.ptHuBERT Base脚本第 55 行在 GPU/MPS/DirectML/CPU 上逐段推理输出目录随版本切换v1 →3_feature256256 维v2 →3_feature768768 维对应官方说明和 infer-web.py#L485-L531 中的fea_dim逻辑每条切片保存为一个.npy文件名与 wav 同名供训练与建索引使用。这一步之所以要预先算好是因为训练时每步都要取特征若实时过 HuBERT 会非常慢预计算后训练只做查表。GUI 会把 f0 与特征任务按多个 GPU 卡拆成多进程并行多卡编号用-分隔如0-1-2。4.3 特征提取期间的自检逻辑无论是否带 f0真正启动训练前GUI 会取0_gt_wavs、特征目录以及带 f0 时的2a_f0、2b-f0nsf四个集合的文件名交集只有三个/四个环节都成功产出的切片才会进入训练名单并逐行写入filelist.txtinfer-web.py#L481-L546。此外还会向名单追加 2 条静音样本mute用于稳定训练。五、step3训练模型5.1 新手词表step / batch / epoch 与训练时间估算官方文档在 step3 开头专门为新手解释基本概念其要点值得保留并扩展一次模型更新称为一个 step步每个 step 取batch_size条数据做前向预测与误差回传修正把整个数据集完整过一遍称为一个 epoch因此总训练时间 ≈单步耗时 ×数据集条数 ÷ batch_size× epoch 数。由此可以推出文档的核心调参建议batch_size 越大每个 epoch 内的 step 数越少分摊到每条样本的耗时越小训练更稳定但单步显存占用更高。显存可通过nvidia-smi观察应结合自己机器的显存尽量调大 batch_size 以缩短总时长。GUI 中 batch_size 是每张显卡的批大小滑杆范围 1~40infer-web.py#L1309-L1315多卡时总 batch 每卡值 × 卡数源码见 train.py#L140-L148 中batch_size * n_gpus的 BucketSampler 设置。训练时长之外的另一个常见经验是少样本足够RVC 之所以能用极小数据量训练除了下文预训练权重外还因为特征被 HuBERT 预计算好了每个 epoch 内的正向/反向都在做特征层面的微调而非从零学语言表征。5.2 预训练模型与断点续训文档说明 RVC不是从零开始训练而是从预训练权重起步所以小数据也能训出可用模型。文档所述默认加载路径为pretrained/f0G40k.pth与f0D40k.pth。结合当前源码规则更完整命名规则为{f0}{G|D}{采样率}.pth带音高时前缀f0如f0G40k.pth不带音高时无前缀如G40k.pth版本 v1 放在 assets/pretrainedv2 放在 assets/pretrained_v2自动回填逻辑见 infer-web.py#L398-L461GUI 默认值为assets/pretrained_v2/f0G40k.pth与assets/pretrained_v2/f0D40k.pthinfer-web.py#L1340-L1348切换版本/采样率/是否带 f0 时路径会自动联动刷新模型训练中按save_every_epoch定期把参数存成G_step.pth与D_step.pthtrain.py#L564-L594通过把任意一份这样的 pth 填进预训练 G/D 路径输入框即可从该断点继续训练甚至可加载另一个实验训出的权重做迁移/续训。这正是官方文档所说可从中断处重启或从不同实验的权重继续训练的机制。启动训练时 GUI 会拼出形如下面的命令交给 infer/modules/train/train.pyinfer-web.py#L570-L610python infer/modules/train/train.py -e mi-test -sr 40k -f0 1 -bs 8 -g 0 \ -te 200 -se 10 -pg assets/pretrained_v2/f0G40k.pth \ -pd assets/pretrained_v2/f0D40k.pth -l 0 -c 0 -sw 0 -v v2命令行参数与含义参数解析见 infer/lib/train/utils.py#L291-L391参数含义-e / --experiment_dir实验名对应logs/名-sr / --sample_rate32k / 40k / 48k决定加载哪份 json 配置-f0 / --if_f01 带音高0 不带-bs / --batch_size每卡批大小-g / --gpus用-分隔的卡号如0-1多卡自动 DDP-te / --total_epoch总训练轮数-se / --save_every_epoch每 N 轮保存一次 checkpoint-pg / -pd预训练生成器/判别器路径也用于续训-l / --if_latest是否只保留最新 ckpt为省硬盘固定覆盖*_2333333.pth-c / --if_cache_data_in_gpu是否把整个数据集缓存进显存-sw / --save_every_weights保存节点是否把可推理的小模型导出到 weights 目录-v / --versionv1 / v2训练时模型的架构与超参来自实验目录中的config.json从 configs/v2/48k.json 或 configs/v1/40k.json 等模板复制而来模板清单见 configs/config.py#L24-L30。以 v2/48k 为例关键字段包括train.learning_rate1e-4、betas[0.8,0.99]、lr_decay0.999875每轮指数衰减train.fp16_runtrue混合精度低端 GPU 或非 CUDA 环境会自动切 fp32见 configs/config.py#L139-L177train.c_mel45、c_kl1.0——mel 重建损失与 KL 损失的权重data.sampling_rate48000、hop_length480、filter_length2048、n_mel_channels128model.spk_embed_dim109说话人嵌入维度与 GUI 说话人 id 滑杆配套。训练目标由五部分构成train.py#L474-L499判别器损失discriminator_loss、生成器对抗损失generator_loss、特征匹配损失feature_loss、mel 频谱 L1 损失权重 c_mel与 KL 损失权重 c_kl。训练进程会通过 TensorBoard 把各损失、学习率、梯度范数与真实/生成 mel 频谱写进实验目录SummaryWriter控制台与train.log中每个log_interval默认 200 步输出一次损失摘要。5.3 GUI 训练参数速查文档 源码默认值参数范围默认说明保存频率 save_every_epoch1~505每隔多少 epoch 存一次G/D_*.pth总轮数 total_epoch2~100020官方建议语音类先跑 200 轮上下唱歌可酌情增加batch_size1~40随显卡越大越省总时长、越吃显存是否仅保存最新 ckpt是/否否选是大幅省硬盘是否缓存数据到显存是/否否≤10 min 小数据建议是以加速大数据会爆显存GUI 注释原文如此保存节点导出小模型是/否否选是则每个保存节点把可推理模型放进 assets/weights对应源码见 infer-web.py#L1293-L1338。六、step3b训练 Faiss 特征索引learning index官方文档解释了 RVC 名称中Retrieval-based基于检索的由来训练期间 RVC 保存所用到的 HuBERT 特征值推理时需要在特征库里检索与输入最相似的特征用于转换。为了让这个检索足够快需要预先对特征集合建立索引。RVC 使用近似最近邻库faiss读取3_feature256v2 为3_feature768中的特征来学习索引并保存。GUI 中点击训练特征索引调用的是 infer-web.py#L616-L711 的train_index其实现细节是理解检索的关键把所有.npy特征纵向拼接并打乱若特征行数超过 20 万2e5先用MiniBatchKMeans聚类到10000 个簇中心再做索引控制索引体积infer-web.py#L639-L658使用faiss.index_factory(256 或 768, IVF{n},Flat)构造倒排文件索引其中聚类数n_ivf min(int(16 * sqrt(特征数)), 特征数 // 39)并把检索探针数nprobe设为 1infer-web.py#L661-L669先把索引在特征上train保存trained_IVF*_Flat_nprobe_*.index再以 8192 条为一批add入库保存added_IVF*_Flat_nprobe_*.index并尝试软链到推理侧索引目录供后续转换环节直接检索使用。关于官方文档末尾的历史注记——自 20230428 版本起推理时自动从实验目录中的索引读取不再需要手动保存/指定索引路径——在 GUI 上体现为训练侧不再要求用户为索引命名索引文件名由代码按IVF{n}_Flat_nprobe_1_实验名_v1|v2自动生成训练/推理两侧都能据此约定自动找到它。七、三个按钮的职责与一键训练step3 区域共有三个主按钮infer-web.py#L1372-L1410训练模型Train model要求先完成 step2b然后按当前参数训练 G/D 网络训练特征索引Train feature index训练完模型后再执行 Faiss 索引学习一键训练One-click training把 step2b 数据处理、音高/特征提取、模型训练与索引训练全部串起来一次跑完。一键训练对应的后端编排函数train1keyinfer-web.py#L714-L778严格按preprocess_dataset → extract_f0_feature → click_train → train_index的顺序执行每完成一段就向界面回传一次进度信息全程串行、无人工干预适合素材与超参都已确定后的批量跑实验。若想分步排查问题例如先看预处理切片质量、再看 f0 是否提取成功则建议手动分步执行。八、实验目录产物总览一次完整训练结束后logs/实验名/下的结构与用途如下可与文档 step1~step3 对照核查目录/文件内容0_gt_wavs/归一化后的原始采样率切片训练的真实波形目标1_16k_wavs/同一批切片的 16 kHz 重采样版本特征提取输入2a_f0/量化到 1~255 的梅尔域整数 f02b-f0nsf/连续值 f0nsf 用细粒度音高3_feature256/或3_feature768/HuBERT 预计算特征v1 256 维 / v2 768 维filelist.txt四类产物的逐条配对清单带说话人 id 与 mute 样本config.json该实验冻结的模型/训练超参训练开始时从 configs 模板拷贝G_*.pth/D_*.pth生成器与判别器 checkpoint按 save_every_epoch 保存trained_IVF*.index/added_IVF*.indexFaiss 索引训练与入库两阶段产物train.log/preprocess.log/extract_f0_feature.log各阶段日志TensorBoard event 文件损失/学习率/频谱可视化九、调参与避坑要点综合文档与源码显存是 first-class 约束优先观察nvidia-smi在显存允许范围内调大 batch_size显存小≤4 GB或无独立显卡时项目会自动降级为 fp32、缩短切片长度3.0 s并调低检索相关窗口无需手动干预configs/config.py。唱歌必须带 f0纯语音可去掉 f0去掉 f0 后模型更轻但会丢失旋律跟随能力。素材尽量平铺、干净step2a 不递归子目录切片前 48 Hz 高通只滤低频底噪明显的口水声、喷麦与混响最好在进入训练前人工清理因为切出来的每段 3.7 s 都会被当作 ground truth。f0 算法按需选择CPU 差选pm/dio提速追求质量选harvestrmvpe/rmvpe_gpu在噪声鲁棒性上最稳。断点续训 填旧 ckpt 路径中途中断无需重来把最新的G_*.pth/D_*.pth填进预训练路径输入框再点训练即可。小数据可缓存进显存≤10 min 的素材建议打开缓存训练集至显存提速大数据量时该选项反而会爆显存且收益有限GUI 提示与 train.py#L315-L394 的 cache 逻辑一致。产物命名以当前仓库为准文档中add_XXX.index、f0 目录的存法在历史版本间有变动本文已按当前源码逐一标注遇到老教程请交叉核对。如果你希望在完全不动 GUI 的前提下复现流水线可参考 tools/infer_batch_rvc.py 等批处理入口了解推理侧约定训练侧的最终权威入口始终是 infer-web.py 中的 Training Tab 与 infer/modules/train/ 下的各脚本。【免费下载链接】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),仅供参考
返回列表