RVC 版本演进技术全解:从实时变声、RMVPE 音高提取到训练与索引链路的工程实践(2023-04 至 2023-10)
【免费下载链接】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
RVC(Retrieval-based-Voice-Conversion-WebUI)是一套基于 VITS 的少样本变声框架,其发展历程集中记录在官方更新日志中。本文以 docs/en/Changelog_EN.md(配合 docs/cn/Changelog_CN.md)为核心主线,系统复盘 2023 年 4 月至 10 月 RVC 在实时变声、RMVPE 音高提取、faiss 特征索引、训练效率与硬件适配等方向上的关键版本迭代,并结合仓库源码印证每项更新背后的实现原理。读完本文,你将掌握 RVC 训练/推理链路的核心参数含义、主流功能模块的代码位置,以及理解官方"实验—取舍—落地"的工程决策逻辑。
更新日志整体脉络与版本时间线
仓库内 docs/en/Changelog_EN.md 与 docs/cn/Changelog_CN.md 记录了同一份演进史:文件采用倒序排列(最新版本 2023-10-06 在最上方),并在中段用#注释行将"近期更新"与"历史 changelog"区隔。为了便于按时间线理解技术演进,下表以正序方式概括各版本主题:
| 版本日期 | 核心主题 |
|---|---|
| 2023-04-09 | 训练参数修正、显存利用率优化、batch/epoch 语义调整 |
| 2023-04-16 | 实时变声迷你 GUI 上线、50Hz 以下频段滤波、WebUI 多语言 |
| 2023-04-28 | faiss 索引升级、移除 total_npy 依赖、16 系显卡解锁 |
| 2023-05-13/05-14 | harvest 音高缓存、音量包络对齐、小模型周期保存、v2 预训练 |
| 2023-05-28 | UVR5 去混响/去回声、呼吸清辅音保护、32k 训练废弃 |
| 2023-06-18 | v2 的 32k/48k 预训练、超长训练集 MiniBatch-KMeans、ONNX 导出 |
| 2023-08-13 | RMVPE 全链路集成、A 卡/I 卡 DirectML 支持、大批 bug 修复 |
| 2023-10-06 | 实时变声 GUI 参数热更新/懒加载、推理性能与低音提升 |
下文按时间正序逐版本拆解,并在各小节中补充源码级佐证,保证"日志条目"都能对应到仓库里的真实实现。
2023-04-09:训练效率基线修复与显存利用优化
该版本是日志中最早期的一次"性能基建"更新,围绕训练速度与稳定性展开:
- GPU 利用率显著提升:官方日志描述 A100 从 25% 提升至约 90%、V100 从 50% 提升至约 90%、2060S 至 85% 左右、P40 至 95% 左右,训练速度显著提高。这类数字属于项目官方声明,可作为理解迭代动机的参考。
- batch_size 语义修正:总 batch_size 改为"每张 GPU 的 batch_size",避免多卡训练时按卡数累加导致语义混乱。
- total_epoch 上限解锁:最大 epoch 限制从 100 提升至 1000,默认值从 10 提升至 20。
- ckpt 提取与推理修复:修复 ckpt 处理时"是否带音高(f0)"识别错误导致的异常推理。
- 分布式训练保存修复:修复多 rank 分布式训练时每个 rank 各保存一次 ckpt 的问题。
- 特征与静音修复:特征提取阶段加入 nan 特征过滤;修复静音输入/输出产生随机辅音或噪声的问题(老模型需用新数据集重训)。
这些修复在源码中有清晰的延续痕迹。例如 configs/config.py 的device_config()会读取显卡名与显存,对包含 "16"(且非 V100)、"P40"、"P10"、"1060/1070/1080" 等型号强制切换 FP32 并改写训练配置;同时gpu_mem <= 4时还会下调preprocess_per。也就是说,日志中"针对不同显卡放宽/收紧精度限制"的策略,正是通过这段运行时显存探测逻辑落地的。
2023-04-16 与 2023-04-28:实时变声 GUI 诞生、语言支持与 faiss 索引升级
实时变声迷你 GUI
2023-04-16 起,仓库新增本地实时变声迷你 GUI,双击 go-realtime-gui.bat(或运行 gui_v1.py)即可启动。该模块使用 FreeSimpleGUI + sounddevice 实现低延迟音频采集/回放,其中Harvest进程在子进程中以fs=16000、f0_floor=50、f0_ceil=1100、frame_period=10调用pyworld.harvest计算实时音高,并通过跨进程队列传递结果,避免阻塞主流程。
训练与推理的低音友好改造
两个直接相关的音频处理改动:
- 50Hz 以下频段滤波:训练与推理均对 50Hz 以下频段进行过滤,去除无意义的次声能量。
- pyworld 最低音高下限 80 → 50:此前 pyworld 提取 f0 的默认下限为 80Hz,导致 50–80Hz 之间的男声低音"哑掉"。将下限调至 50Hz 后低音男声不再丢失。
源码中这一默认值被固化在多个 F0 预测器中:例如 HarvestF0Predictor.py 与 PMF0Predictor.py 的构造函数默认参数均为hop_length=512, f0_min=50, f0_max=1100。可见"低音保护"不是日志中的一次性补丁,而是贯穿训练与推理共用的 F0 提取基线的工程决策。
WebUI 多语言与显卡识别修正
WebUI 支持根据系统区域设置自动切换语言,当时支持 en_US、ja_JP、zh_CN、zh_HK、zh_SG、zh_TW,不支持的 locale 默认回退 en_US;这一套多语言机制如今已演化为仓库 i18n/ 目录下十余种语言的 JSON locale 体系。同时修复了部分显卡识别失败(如 V100-16G、P4 识别异常),与上一节所述 configs/config.py 中按torch.cuda.get_device_name()判断精度的逻辑直接相关。
faiss 索引升级与 total_npy 解绑
2023-04-28 版本将 faiss 索引设置升级为"速度更快、质量更高"的配置,并取消了 total_npy 依赖——后续分享模型不再需要额外填写 total_npy 文件。此外还解锁了 16 系显卡限制、为 4GB 显存 GPU 提供 4GB 推理配置;修复了部分音频格式下 UVR5 人声伴奏分离的 bug,并让实时变声迷你 GUI 支持非 40k 与非"不懈怠(lazy)"音高模型。这套索引方案的当前形态可参考 tools/infer/train-index-v2.py:它使用faiss.index_factory(768, "IVF%s,Flat")构建倒排索引、nprobe=1、按 8192 条批量 add,并用16 * sqrt(N)计算簇数——这正是"速度更快"诉求下的具体实现。
2023-05-13 与 2023-05-14:harvest 音高缓存、音量包络对齐与小模型周期保存
检索与推理体验的细节打磨
2023-05-13 的更新重点在"减少重复劳动":
- 清理一键包内旧版本 runtime 残留的
lib.infer_pack与uvr5_pack冗余代码; - 修复训练集预处理中的伪多进程 bug;
- 为 harvest 音高识别增加中值滤波半径调节选项,可削弱"哑音"现象;
- 导出音频支持后处理重采样;
- 训练相关
n_cpu进程数的适用范围从"仅 f0 提取"扩展为"数据预处理 + f0 提取"; - WebUI 自动检测
logs文件夹下的 index 文件并提供下拉列表; - tab 页新增"常见问题解答"(FAQ);
- 对相同路径的输入音频引入音高缓存。
音高缓存的引入动机很实际:使用 harvest 提取 f0 时,整条 pipeline 会经历漫长且重复的音高提取过程;若不缓存,用户实验不同音色、索引与中值滤波半径参数时,每次首次推理后的等待都非常痛苦。缓存命中后可显著改善"参数实验"这一典型 RVC 使用场景的响应速度。
音量包络对齐与"小模型按周期保存"
2023-05-14 引入的核心特性之一是音量包络对齐输入混合:用输入音频的音量包络去混合或替换输出的音量包络,可缓解"输入静音但输出出现小幅度噪声"的问题。日志同时给出明确的使用限制——输入音频背景底噪较大时不建议开启,且默认不开启(音量包络参数值为 1 可视为未开启),并在此版本支持了"按指定频率保存提取出的小模型":当你想对比不同 epoch 下的推理效果、又不愿保存全部大 checkpoint 并反复手工执行 ckpt 处理时,该功能非常实用。
其他变更包括:通过设置环境变量解决服务端开启全局代理导致的浏览器连接错误;开始支持 v2 预训练模型(当时仅公开 40k 版本测试,另两个采样率尚未训练完全);推理前限制超过 1 的过大音量;微调训练集预处理参数。
2023-05-28:UVR5 人声分离扩展、呼吸/清辅音保护与 v2 化过渡
- 新增 v2 的 Jupyter Notebook 训练教程、韩文 changelog,并补充部分环境依赖;
- 增加呼吸、清辅音、齿音保护模式,改善高音域/气息音的音色还原;
- 支持 crepe-full 音高识别模式(完整分辨率版本);
- UVR5 人声伴奏分离新增去延迟(de-echo)模型与 MDX-Net 去混响模型,并增加 HP3 人声提取模型(CN 日志细节);
- 索引文件名增加版本与实验名称,便于多实验管理;
- 人声伴奏分离与推理批量导出均增加音频导出格式选项(v1 32k 模型训练自此废弃)。
从仓库目录可看到该生态的落地痕迹:UVR5 相关的预训练权重清单存放于 assets/uvr5_weights/,对应的推理后端位于 infer/modules/uvr5/(含 mdxnet、vr 等实现),配置模板则在 infer/lib/uvr5_pack/lib_v5/modelparams/ 下以 JSON 形式提供数十种不同规格的声学参数。
2023-06-18:v2 预训练扩充、超长训练集自动 K-Means 与 ONNX 导出
该版本再次推进 v2 化并引入应对大规模数据的能力:
- v2 新增32k 与 48k两个采样率的预训练模型(对应的模型配置文件见 configs/v2/32k.json 与 configs/v2/48k.json,v1/v2 各采样率 JSON 统一由 configs/config.py 的
version_config_list管理并同步到configs/inuse/); - 修复非 f0 模型的推理报错;
- 超过一小时的训练集在建立索引阶段自动执行 MiniBatch-KMeans,先缩小特征规模,再执行索引训练/加入/查询,显著加速超大特征库的处理;
- 附送一个人声转吉他的玩具项目(Hugging Face Space 实验);
- 数据预处理阶段自动剔除异常的过短切片;
- WebUI 新增ONNX 导出选项卡(相关导出入口位于 infer/modules/onnx/ 与 tools/export_onnx.py)。
关于 K-Means 缩容,仓库中的 tools/infer/train-index-v2.py 给出了明确实现:当拼接后的特征数组行数超过2e5时,使用MiniBatchKMeans(n_clusters=10000, batch_size=256*n_cpu, compute_labels=False, init="random")将特征收敛为 1 万个聚类中心再做索引,这正是 changelog 中"索引训练、加入和查询更快"的工程含义。
值得关注的"失败实验"记录
官方日志难能可贵地记录了被否定的技术路线:
- 特征检索增加时序维度——无效;
- 特征检索增加 PCA 降维——数据量大时可用 K-Means 缩小数据量,数据量小时降维耗时反而超过省下的匹配耗时;
- 训练阶段在音高、gender、eq、噪声等维度做随机数据增强——无效;
- 接入小型声码器(如 Vocos-RVC)——效果变差。
同一批 todolist 中,多个条目被标记删除并由 RMVPE 取代(详见下一节)。这些记录属于官方的内部实验结论,可作为理解 RVC 检索/训练设计取舍的背景,而非普适性的方法论结论。
2023-08-13:RMVPE 音高提取全链路集成与 A 卡/I 卡加速
这是日志中分量最重的一次更新,拆分为"常规 bug 修复"与"重点更新"两部分。
常规 bug 修复
- 模型保存频率的最小总 epoch 数改为 1,最小总轮数下限调整为 2;
- 修复不使用预训练模型时的训练报错;
- 伴奏人声分离完成后及时清理显存;
- faiss 保存路径由绝对路径改为相对路径,便于目录迁移;
- 支持路径含空格(训练集路径与实验名称均不再报错);
- filelist 取消强制 UTF-8 编码,提升对非标准文件名/元数据的兼容性;
- 解决实时变声中开启 faiss 索引导致 CPU 占用极高的问题(实时链路对索引查询的 CPU 开销非常敏感)。
重点更新:RMVPE 与 DirectML
- 官方日志宣布训练出当时的开源人声音高提取模型RMVPE,并用于 RVC 的训练、离线/实时推理,同时支持PyTorch / ONNX / DirectML三种后端;相比 crepe-full,其"更快且资源占用更小、低音效果更好"(README 中称其根绝哑音问题);
- 通过pytorch-dml支持 AMD 显卡与 Intel 显卡的(1)实时变声、(2)推理、(3)人声伴奏分离;训练暂未支持 DML,会切换为 CPU 训练;并借助onnx_dml支持 RMVPE 在 GPU 上的推理。
RMVPE 在仓库中有多处落地证据:
- 推理权重路径
assets/rmvpe/rmvpe.pt与音频级推理入口定义于 infer/lib/rmvpe.py; - 训练数据侧分别有 CUDA 版 extract_f0_rmvpe.py 与 DirectML 版 extract_f0_rmvpe_dml.py,二者都加载
assets/rmvpe/rmvpe.pt并调用model_rmvpe.infer_from_audio(x, thred=0.03),只是推理设备不同; - 在实时 GUI gui_v1.py 中,f0method 的可选项已扩展为
pm / harvest / crepe / rmvpe / fcpe,说明实时链路同样受益于 RMVPE; - DirectML 的运行时切换逻辑位于 configs/config.py:当传入
--dml参数时,程序会检测onnxruntime的 CUDA/DirectML DLL 存在情况,在onnxruntime-cuda与onnxruntime-dml之间做目录重命名以切换推理后端,并把 torch 设备指向torch_directml.device(...)、强制 FP32。
2023-10-06:实时变声 GUI 体验跃迁与低音进一步强化
此版本围绕"实时变声"做了体验与性能的双重升级(CN 日志信息更细):
- 参数热更新:调整参数无需中止并重启会话,界面参数即时生效;
- 懒加载模型:已加载过的模型无需重复加载;
- 新增响度因子(音量包络)参数,使输出响度向输入音频靠近;
- 优化自带降噪效果与处理速度,并大幅优化推理速度;
- 继续提升 RMVPE 音高提取算法效果,对男低音的提升更为明显;
- 优化推理界面布局。
注意日志特别强调:输入输出设备应选择同种类型(例如都选 MME 类型),否则实时变声可能出现设备格式不匹配的问题。仓库 README.md 也披露了实时链路整体延迟目标:已实现端到端约 170ms,若使用 ASIO 输入输出设备可低至约 90ms,但高度依赖声卡驱动支持。若要运行该界面,直接双击仓库根目录的 go-realtime-gui.bat 或运行 gui_v1.py 即可。
工程方法论启示:被否决的路线与后续计划
纵观整份 changelog,最值得借鉴的是它保留了完整的"取舍"过程:crepe、半精度 crepe、多进程 harvest 等 todo 条目最终都被 RMVPE 标记取代;时序检索、PCA 降维、训练期随机增强等实验被明确标记无效并给出原因。这说明 RVC 的架构演进(hubert 特征 + top1 faiss 检索 + VITS 解码 + 多种 f0 前端)是经过大量对比实验筛选出的稳定组合,而非功能堆叠。
日志末尾的"Future Plans"也基本可以在后续版本与仓库中对应到实现:按 epoch 保存小模型(2023-05-14 已实现)、推理时向指定路径额外导出 mp3(导出格式选项在 2023-05-28 落地)、多人训练选项卡(至多 4 人)、收集呼吸 wav 修正呼吸电音问题、以及"以更大歌声训练集扩充底模"等长期规划。
总结:如何把 changelog 变成上手路径
如果你希望通过本仓库亲自复现这套能力,推荐的阅读/使用顺序为:
- 先读 README.md 了解环境配置(N 卡、A 卡/I 卡 DML、ROCm、IPEX 对应不同的依赖文件)与预模型清单;
- 用官方演示 Notebook(Retrieval_based_Voice_Conversion_WebUI.ipynb 与 v2 版本)走通训练-推理全流程;
- 按需查阅 docs/en/faq_en.md、docs/cn/faq.md 及各语言 FAQ 排查典型问题;
- 对照本文提到的源码路径深入理解细节:训练配置见 configs/v2/48k.json 等 JSON,f0 前端见 infer/lib/infer_pack/modules/F0Predictor/,索引构建见 tools/infer/train-index-v2.py,实时 GUI 见 gui_v1.py。
本文所依据的原始更新日志位于 docs/en/Changelog_EN.md(中文对照见 docs/cn/Changelog_CN.md),仓库其余语言版本的 Changelog 亦可在 docs/ 下找到。理解版本演进之后,你会发现 RVC 的每一项"好用"特性背后,几乎都能在上述文件中找到对应的实现与取舍理由。
【免费下载链接】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),仅供参考