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

资讯详情

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

拆解 RVC 变声引擎:10 分钟语音如何被换成另一个声音

拆解 RVC 变声引擎:10 分钟语音如何被换成另一个声音 拆解 RVC 变声引擎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-WebUIRVCRetrieval-based Voice Conversion是一个基于 VITS 的开源变声框架10 分钟以内的干净人声就能训练出可用模型再把任意歌曲的声线替换成目标音色。它名字里的Retrieval-based不是营销词——用检索来对抗小数据训练下的音色泄漏是整套架构的起点。鸟瞰一个音频文件走完的十步数据流想理解这个项目最快的方式不是看模块图而是追一条真实的调用链你在 Web 界面点转换之后数据流是这样的。入口 infer-web.py 用 Gradio 搭界面启动时只做两件重事Config()探测硬件L53VC(config)建一个空壳推理容器L54。此时任何模型都没加载。真正干活的是 infer/modules/vc/modules.py 的vc_single()L146-L160它把一次转换切成十步音频重采样到 16kHz、峰值归一化L165-L16848Hz 高通滤波去掉低频噪声两端做反射填充pipeline.py L318-L319长音频按静音锚点切成若干段L321-L333每段过 HuBERT 提取内容特征L218-L220v1 取第 9 层、v2 取第 12 层用 faiss 索引把源特征拽回训练集L235-L245get_f0()提取音高并量化成 1-255 的整数值L177-L183按protect参数把无声帧的特征换回原始特征L260-L266net_g.infer()过合成器生成目标采样率的波形L268-L272v1 输出 32/40/48kv2 输出 32/48k见 configs/config.py L24-L30各段拼接、按rms_mix_rate混合响度曲线L443-L444重采样到输出采样率、归一化到 int16L445-L453。训练侧是另一条平行的链数据先经 infer/lib/slicer2.py 的 RMS 静音切片切成短句再提取特征与音高最后由 infer/modules/train/train.py 以每 GPU 一进程的 DDP 方式跑 VITS 对抗训练L95-L117。两条链共享同一套特征空间这是后面检索去泄漏机制成立的前提。各模块的位置一张表速览文件职责触发时机configs/config.py探测设备/显存决定精度与切段参数启动时一次infer/modules/vc/modules.py模型加载切换、单文件/批量转换入口UI 选择模型、点击转换infer/modules/vc/pipeline.py切段、特征、检索、音高、合成的数据流主体每次转换infer/lib/rmvpe.pyRMVPE 音高提取f0_methodrmvpe首次调用infer/lib/slicer2.py训练数据的静音切片训练预处理tools/infer/train-index.pyfaiss 索引训练与导出构建音色索引infer/modules/train/train.py多卡 DDP 训练训练选项卡i18n/多语言界面启动时关键机制深潜三个真正体现取舍的设计点长音频为什么必须切切点又为什么挑在最安静的地方它做了什么。Pipeline的构造参数全部来自硬件探测x_max是不切段的长度上限fp16 卡 65 秒、fp32 卡 41 秒、4GB 显存 32 秒configs/config.py L182-L199。超过上限时代码每隔x_center秒规划一个切点再在切点前后x_query秒范围内找最安静的位置作为实际切点pipeline.py L321-L333。为什么这么设计。VITS 类合成器的显存占用随序列长度增长整段喂入 5 分钟的音频必然 OOM。但固定步长切分会把字切到两段——前半段带 pad 拼回来时跨段的相位和能量不连续听感就是爆音和气息断裂。在静音点切每段的边界天然接近能量零点拼接伪影最小。边界与反例。若音频短于t_max则完全不切L321每段推理前后还会各加x_pad秒 padding 再裁掉L388进一步消除边界效应。这套参数不是魔法数字换到小显存卡时config.py 会整组缩小它们——切点策略与显存预算是联动的。top-1 检索如何杜绝音色泄漏它做了什么。每段 HuBERT 特征取出后代码并不直接喂给合成器而是拿去查 faiss 索引index.search(npy, k8)找 8 个最近邻用距离倒平方做权重加权还原出训练集里的一段特征再按index_rate与源特征线性混合pipeline.py L235-L245。索引本身由 tools/infer/train-index.py 构建对全部训练特征建 IVF512,Flat 结构、nprobe9L26-L34。为什么这么设计。训练数据只有 10 分钟时合成器见到的音色特征分布很窄而任意输入音频的 HuBERT 特征会漂到这个分布之外——合成器只能硬套结果就是原唱音色渗进输出即音色泄漏。检索的作用是把输入特征强行拉回训练集里真实存在过的特征相当于给特征空间做了最近邻投影。README 称其为 top-1 检索实际实现是 k8 加权混合——单点最近邻会把特征拉成锯齿状的离散步进多点加权更平滑这是文档与代码之间值得注意的一处差异。边界与反例。index_rate0或索引文件不存在时整条检索路径优雅降级为index big_npy None直接用原始特征推理L302-L317——检索是增强项而非依赖项。代价也要说清faiss.read_index在每次转换时重新加载L309-L312大索引会明显拖慢首段这是它把索引加载放在切段循环之外的原因。protect 参数辅音为什么不会被唱出声音它做了什么。get_f0()支持 pm/harvest/crepe/rmvpe 四种音高提取器L100-L154提取后统一量化到 1-255L177-L1830 表示无声。合成前protect逻辑对特征做一次混合有声帧用检索后的特征近无声帧保留未检索的原始特征protect决定对 f0 置信度不足帧的保留强度L260-L266。为什么这么设计。s、h、气声这类无清声帧没有基频f0≈0。若照常用合成器给它们配上假音高辅音就会被唱化听感是嘶嘶声变哼鸣。protect 本质是一个信任旋钮0.5 以下启用帧级混合调高它对弱清声帧越保守。默认 0.33modules.py L49是经验折中。边界与反例。protect ≥ 0.5时整个混合分支被跳过L260输出完全由检索特征驱动——辅音细节可能丢失但音色一致性最强。无音高模型if_f00则整条链路旁路音高参数net_g也换成_nono变体modules.py L109-L118。工程韧性让它长期不崩的四个细节预算先行。Config.device_config() 按 GPU 型号字符串判断老卡P40/1080 等并强制 fp32同时把所有训练 JSON 里的fp16_run改写为 falseL128-L156。不这么做老卡在混合精度下要么直接算错要么挂死。显存 ≤4GB 时连切段参数都整体缩小L195-L199——精度、切段、预算三者在同一个函数里联动而不是散在各处各调各的。缓存分层。HuBERT 首次转换才加载、之后常驻modules.py L171-L172RMVPE 模型按属性复用pipeline.py L143harvest 音高用lru_cache避免同一文件重复提取L29-L40。UI 切换模型时get_vc()先删旧模型再empty_cache()modules.py L54-L84防止两份 VITS 权重同时占着显存。异常隔离。单文件转换失败时vc_single捕获异常并把 traceback 格式化后当作结果返回给界面L222-L225——用户看到错误信息而不是整个 WebUI 崩掉。批量转换对每个文件单独 tryL298-L300一个坏文件不拖垮整批。索引加载失败自动降级为无检索推理pipeline.py L309-L317。可观测性。vc_single返回的分段耗时npy / f0 / infer三段计时L217-L219计时点在 pipeline.py L277-L278让用户能直接判断瓶颈在特征提取还是音高提取训练侧用 TensorBoard 记录曲线train.py L46。上手路径先跑通推理再往训练侧钻本地跑起来三步git clone https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI装依赖N 卡pip install -r requirements.txtA/I 卡用requirements-dml.txt装 ffmpeg并按 README.md 清单把 assets/ 里的 hubert、pretrained 等预训练文件下齐tools/ 目录里有现成的下载脚本python infer-web.py启动浏览器里选模型、上传音频。阅读顺序建议infer-web.py 只看前 120 行了解启动流程即可 → infer/modules/vc/modules.py 的vc_single()是一次点击的全貌 → infer/modules/vc/pipeline.py 是数据流核心本文三个深潜点全在这一个文件里 → configs/config.py 看硬件如何反向决定算法参数。想往深处走训练侧从 infer/modules/train/train.py 进数据切片看 infer/lib/slicer2.py实时变声端到端约 170ms在 tools/rvc_for_realtime.py对外 API 在 api_240604.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),仅供参考
返回列表