【免费下载链接】skills
开源了Codex Skills等集合,大部分是自己实际需要搞得,需要的自取。欢迎star
voice-changer 是 skills 开源项目中基于 RVC 的 AI 变声工具,它的核心原理是「HuBERT 特征提取 + RVC 模型推理」:先用 HuBERT 把语音编码成神经网络特征,再由 RVC 模型完成真实音色转换;而面对长音频,它通过「30 秒分块 + 2 秒重叠」的自动分块策略逐段推理再合并,从根本上避免了内存溢出(OOM)问题。本文面向新手,用尽量少的代码把整条变声流水线讲清楚。
一键变声:整体流程长什么样?
一条命令就能触发完整流水线:
python3 voice-changer/scripts/voice_change.py input.mp3 -v rvc_female入口脚本 voice_change.py 会先读取 voice_config.json 里的声音预设,再按音频时长选择处理路径,整体流程如下:
输入音频 → 判断时长 → (长音频自动分块) → HuBERT 特征提取 → F0 基频提取 → RVC 模型推理 → 分段合并 → MP3 输出关键点在于:超过 60 秒的音频会自动切换到分块模式,短音频则直接走单次推理。这个 60 秒的判断位于 voice_change.py#L314-L327。
HuBERT 特征提取:模型如何"听懂"你的声音
RVC 变声的第一步不是处理声波,而是处理"语义特征"。具体做法在 rvc_infer_real.py 中:
- 音频先被重采样到16000 Hz(HuBERT 的标准输入采样率),见 rvc_infer_real.py#L197-L207;
- 加载
hubert_base.pt(约 600MB 的预训练模型),通过 RVC 官方的get_hubert_model函数完成加载; - HuBERT 把一段语音转换成一序列特征向量——这些向量描述的是"这段话说了什么、怎么说的",而不是单纯的音高。
💡 这正是 RVC 变声和普通变声器的本质区别:普通变声只做音高偏移(pitch shift),HuBERT + RVC 是真正的音色转换,能改变嗓音质感甚至跨语言合成。
HuBERT 模型文件的获取方式写在 RVC_MODEL_GUIDE.md 中。
RVC 模型推理:从特征到目标音色的最后一步
拿到特征后,进入真正的 RVC Pipeline(rvc_infer_real.py#L229-L251):
| 步骤 | 作用 | 关键参数 |
|---|---|---|
| ① HuBERT 特征提取 | 提取语音表示 | hubert_base.pt |
| ② F0 基频提取 | 得到每一帧的音高曲线 | f0_method: harvest |
| ③ 音高偏移 | 按半音数整体升降调 | f0up_key(如 +4 变女声) |
| ④ RVC 模型推理 | 用目标音色模型重构语音 | kohane.pth等 .pth 模型 |
推理时脚本会根据模型版本和是否带 F0 自动选择对应的合成器类(如SynthesizerTrnMs768NSFsid,见 rvc_infer_real.py#L117-L126),最终输出 40000 Hz 的目标采样率音频。
几个对新手有用的参数(均可在 voice_config.json 中配置):
f0up_key:音高偏移半音数。正值变女声(如rvc_female为 +4),负值变男声(如rvc_male为 -12);index_path/index_rate:可选的索引文件用于提升音质,但会占用更多内存,默认策略是暂时禁用以节省内存;rms_mix_rate(默认 0.25):混入原始音量包络,让响度更贴近原声。
长音频分块:避免 OOM 的核心设计
为什么长音频必须分块?因为 HuBERT 和 RVC 推理都是把整段音频一次性载入内存做矩阵运算——一段 15 分钟的音频如果整段推理,内存占用会随时长线性甚至超线性增长,极易触发 OOM(内存不足被系统杀进程)。
分块方案实现在 rvc_process_long.py,思路很朴素也很有效:
1️⃣ 切分(30 秒一段 + 2 秒重叠)
split_audio函数(rvc_process_long.py#L21-L53)以 30 秒为步长切片,相邻两段故意保留 2 秒重叠。重叠的作用是保证跨边界的音节不会被从中间"硬切断",听起来更连贯。
2️⃣ 逐段推理(每段独立子进程)
每一段都会先写入临时 WAV,再以独立子进程方式调用rvc_infer_real.py推理(超时 300 秒)。子进程隔离带来两个好处:
- 每段推理结束内存立即释放,峰值内存只与"30 秒"有关,与总时长无关;
- 任何一段失败都不会污染主进程,且失败时不降级为假变声,直接报错并清理所有临时文件。
3️⃣ 智能合并(去掉重叠部分)
merge_audio_segments(rvc_process_long.py#L55-L109)把各段按序拼接,从第二段开始裁掉前 2 秒重叠区,避免同一句话被播放两遍;最后若输出为 MP3,会用 ffmpeg 重采样到 48000 Hz 并以 192k 比特率编码。
⚠️ 历史版本曾在这里出过"音频重复"的 bug(合并时没有裁掉重叠区),已在 v1.5.0 修复,详见 CHANGELOG.md。
性能参考与配置建议
官方 README.md 给出了 Apple Silicon M1 纯 CPU 环境下的实测数据:
| 音频时长 | 处理方式 | 耗时 |
|---|---|---|
| < 60 秒 | 直接 RVC 推理 | ~10–30 秒 |
| > 60 秒 | 自动分块 RVC | 15 分钟音频约 3–5 分钟 |
| 875 秒(约 15 分钟) | 分块为 32 段 | ~15 分钟 |
给新手的三点配置建议:
- Python 环境:RVC 对 Python 版本敏感,项目内置了 Python 3.10 虚拟环境(
models/rvc_env_310/),脚本会优先自动使用它;依赖可通过 install_dependencies.sh 一键安装; - 声音预设:内置了
rvc_female、rvc_male及多款中文女声预设(御姐、七妹、苏苏等),在 voice_config.json 中按method: rvc配置即可; - 内存吃紧时:减小分块时长(修改
chunk_duration)、禁用index_path,是最直接的两个手段。
总结
voice-changer 的技术栈可以浓缩成一句话:HuBERT 负责"听懂",harvest 负责"量音高",RVC 模型负责"换嗓子",分块策略负责"别爆内存"。
- 短音频:单次 RVC 推理,快速出结果;
- 长音频:30 秒分块 + 2 秒重叠 + 逐段子进程推理 + 去重叠合并,峰值内存恒定,彻底规避 OOM。
更多细节可阅读 SKILL.md 与 RVC_MODEL_GUIDE.md;如需体验完整 skills 集合,可克隆仓库git clone https://gitcode.com/gh_mirrors/skills24/skills后按需自取。
【免费下载链接】skills
开源了Codex Skills等集合,大部分是自己实际需要搞得,需要的自取。欢迎star
相关推荐
音频特征提取:kbd-audio如何从声波中提取关键信息
音频特征提取:kbd audio如何从声波中提取关键信息 你是否想过,敲击键盘的声音也能泄露信息?kbd audio项目通过声学分析技术,实现了从键盘敲击声中提
网络安全音频应用安全PaddleSpeech 音频 Delta 特征提取:add_deltas 模块原理与实战指南
PaddleSpeech 音频 Delta 特征提取:add_deltas 模块原理与实战指南 PaddleSpeech 在 paddlespeech/audi
语音音频人工智能深度学习RVC(Retrieval-based-Voice-Conversion-WebUI)模型训练全流程指南:从音频预处理、f0/HuBERT 特征提取到正式训练
RVC(Retrieval based Voice Conversion WebUI)模型训练全流程指南:从音频预处理、f0/HuBERT 特征提取到正式训练
人工智能深度学习语音音频AI 应用微调
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考