实战指南:RVC 语音转换框架

一、RVC 介绍

Retrieval-based-Voice-Conversion-WebUI 是一个基于深度学习的声音转换框架,它通过检索技术实现源声音特征到训练集特征的转换,从而减少音调泄露问题,该项目提供了一个易于使用的Web界面,用户可以方便地进行声音模型的训练和实时声音转换。

二、安装指南

本文操作系统 Ubuntu 24.04

bash 复制代码
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git

N卡驱动:575.64.03

创建一个 python3.8 环境(环境要求:3.7-3.11):

bash 复制代码
conda create -n rvc python=3.8

安装 torch 依赖:

bash 复制代码
pip install torch torchvision torchaudio

安装 N 卡依赖:

bash 复制代码
# N卡依赖
pip install -r requirements.txt

遇到报错:

复制代码
ERROR: Cannot install -r requirements.txt (line 8) and fairseq because these package versions have conflicting dependencies.

The conflict is caused by:
    fairseq 0.12.2 depends on omegaconf<2.1
    hydra-core 1.0.7 depends on omegaconf<2.1 and >=2.0.5

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip to attempt to solve the dependency conflict

依赖冲突,只需要去掉一个依赖的版本号即可(或降级pip工具亦可:pip install --upgrade pip==24.0):

安装 ffmpeg

bash 复制代码
sudo apt install ffmpeg

三、下载模型

仓库根目录下执行脚本(需要魔法):

bash 复制代码
# 下载 assets
./tools/dlmodels.sh

如果下载超时,请注意脚本是从 https://huggingface.co/ 下载的文件,可以修改为 https://hf-mirror.com

修改效果:

下载加速效果:

下载完成:

下载优化模型(可选):rmvpe.pt

bash 复制代码
# (可选)下载 rmvpe.pt,放到 rvc 根目录
# wget https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/rmvpe.pt
wget https://hf-mirror.com/lj1995/VoiceConversionWebUI/blob/main/rmvpe.pt

四、启动 UI

bash 复制代码
# 启动
python infer-web.py

打开 URL 访问 UI :

复制代码
http://localhost:7865/

五、使用教程

1、推理音色训练

通过优质干声素材进行训练,我们可以提取特定音色特征并加以模拟,最终生成对应的音色包,在此过程中,适当调整参数可优化音色特征的提取效果。

举例:提取游戏角色或者动漫人物角色的说话音频,就可以进行该角色的音色训练,例如当前火爆的懒羊羊、猴哥、麦克阿瑟音色。

建议准备3-7分钟的优质干声素材,这个时长范围效果最佳,录制时长需控制在3-50分钟之间。从上往下按界面引导的step进行操作,注意点击"训练模型 "和"训练特征索引"!


界面参数说明:

  • 实验名称:最终生成的音色包名称
  • 目标采样率:干声素材采样率设置,默认40k效果良好,可根据性能需求调整
  • 启用音高指导:歌唱类素材必须开启(true),其他类型可自由选择
  • 模型版本:推荐使用稳定版V1,V2版本尚存部分问题
  • CPU进程数:音高提取与数据处理使用的核心数,默认16,最低要求2个
  • 训练素材路径:包含干声素材的文件夹路径(注意:单文件夹仅限单人音色素材)
  • 显卡配置:自动检测本机显卡,多显卡可指定卡号
  • 音高提取算法:
    • pm:适合歌声,处理速度快
    • dio:适合高质量语音,CPU占用低
    • harvest:质量最优但速度较慢
  • 保存频率:每n轮保存一次模型(推荐20轮)
  • 训练总轮数:
    • 基础设置:200轮(推荐)
    • 优质素材:可降至50轮
    • 上限:1000轮(注意可能过拟合)
  • batch_size:默认自动适配显卡,可手动调整
  • 模型保存选项:
    • 仅保存最终模型:节省存储空间
    • 按频率保存:保留中间结果
  • 显存缓存:
    • 小数据集(<10min):建议开启加速
    • 大数据集:可能引发显存溢出
  • 模型导出:建议开启"保存至weights文件夹"选项

训练结果(音色)文件夹:assets/weights 文件夹

利用这个音色包文件 pth 就可以进行音色推理了。

训练音色特征结果:logs 文件夹

训练报错:matplotlib 版本问题

复制代码
File ".../infer/lib/train/utils.py", line 238, in plot_spectrogram_to_numpy
    data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="")
AttributeError: 'FigureCanvasAgg' object has no attribute 'tostring_rgb'

解决:matplotlib 降版本

bash 复制代码
pip install matplotlib==3.5.3

训练效果:

2、音色融合

音色融合是通过将已训练的音色包进行组合来实现的,同性别音色的融合效果通常更理想,这项技术不仅能创造出全新的音色包,还能有效降低爆音风险,例如,当A音色音质出色但易爆音,B音色虽普通但稳定性好时,可以采取高权重A模型与低权重B模型融合的方式,合理调整权重比例后,融合后的音色将兼具两者的优势,为音源素材创作提供更多可能性。

3、干声分离

人声分离(即从音频中提取干声)属于预处理步骤,主要用于获得更纯净的音频素材。虽然可以使用本模型的一键训练包完成,但并非必需,市面上也有其他更简单易用的专业工具可供选择。


界面参数说明:

  • 待处理音频路径:请指定包含待处理音频的文件夹路径(需确保每个音频文件单独存放于一个文件夹中,以防止文件过多导致训练时间过长)。
  • 分离模型选择
    • HP2 人声:适用于仅含背景音和人声的音频
    • HP5 人声:适用于含背景音与人声叠加等复杂效果的音频
  • 人声输出目录 :默认输出路径为 ./opt
  • 乐器文件夹 :背景音存储路径,默认为 ./opt

4、音色推理

步骤1中得到了推理音色,例如懒羊羊,这就是主体的音色,步骤3得到了干声,此时就可以指定用懒羊羊的音色进行干声推理。

界面参数说明:

  • 推理音色:最终生成的合成音色效果
  • 待处理音频:需要合成的原始音频(支持主流音频格式)
  • index路径:与推理音色匹配的特征索引文件(以.index结尾)
  • 变调设置 (半音单位,整数调节):
    • 男声转女声建议:+12key
    • 女声转男声建议:-12key
    • 若出现音域失真,可手动调整至合适范围
  • 音色管理
    • 刷新列表:加载新增音色及索引文件(训练新音色后需重新加载)
    • 卸载音色:释放已加载音色,优化显存占用
  • 音高提取算法
    • PM:适合歌声处理(速度较快)
    • Harvest:低音表现优异(处理速度较慢)

补充:50系列N卡推理

需要:Python 3.10,Pytorch 版本 2.8。

推理过程遇到报错:PyTorch 版本默认值问题

复制代码
2025-09-21 14:51:55 | WARNING | infer.modules.vc.modules | Traceback (most recent call last):
  File "/home/sam/Retrieval-based-Voice-Conversion-WebUI/infer/modules/vc/modules.py", line 172, in vc_single
    self.hubert_model = load_hubert(self.config)
  File "/home/sam/Retrieval-based-Voice-Conversion-WebUI/infer/modules/vc/utils.py", line 23, in load_hubert
    models, _, _ = checkpoint_utils.load_model_ensemble_and_task(
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/fairseq/checkpoint_utils.py", line 425, in load_model_ensemble_and_task
    state = load_checkpoint_to_cpu(filename, arg_overrides)
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/fairseq/checkpoint_utils.py", line 315, in load_checkpoint_to_cpu
    state = torch.load(f, map_location=torch.device("cpu"))
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/torch/serialization.py", line 1529, in load
    raise pickle.UnpicklingError(_get_wo_message(str(e))) from None
_pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint. 
	(1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source.
	(2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message.
	WeightsUnpickler error: Unsupported global: GLOBAL fairseq.data.dictionary.Dictionary was not an allowed global by default. Please use `torch.serialization.add_safe_globals([fairseq.data.dictionary.Dictionary])` or the `torch.serialization.safe_globals([fairseq.data.dictionary.Dictionary])` context manager to allowlist this global if you trust this class/function.

Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html.

Traceback (most recent call last):
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/gradio/routes.py", line 437, in run_predict
    output = await app.get_blocks().process_api(
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/gradio/blocks.py", line 1349, in process_api
    data = self.postprocess_data(fn_index, result["prediction"], state)
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/gradio/blocks.py", line 1283, in postprocess_data
    prediction_value = block.postprocess(prediction_value)
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/gradio/components.py", line 2586, in postprocess
    file_path = self.audio_to_temp_file(
  File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/gradio/components.py", line 360, in audio_to_temp_file
    temp_dir = Path(dir) / self.hash_bytes(data.tobytes())
AttributeError: 'NoneType' object has no attribute 'tobytes'

解决:手动设置 weights_only=False,修改报错路径源码即可:

复制代码
File "/home/sam/anaconda3/envs/rvc/lib/python3.10/site-packages/fairseq/checkpoint_utils.py", line 315, in load_checkpoint_to_cpu
    state = torch.load(f, map_location=torch.device("cpu"))

修改如下:

python 复制代码
state = torch.load(f, map_location=torch.device("cpu"), weights_only=False)

免责声明

请负责任地使用!技术无罪,请勿滥用,请对自己的行为负责。

相关推荐
艾莉丝努力练剑2 小时前
【Linux指令 (一)】Linux 命令行入门:从零开始理解Linux系统理论核心概念与基础指令
linux·c++·经验分享·ubuntu·centos
说私域2 小时前
社交媒体与兴趣电商环境下品类创新机会研究——以“开源AI智能名片链动2+1模式S2B2C商城小程序”为例
人工智能·开源·媒体
代码79722 小时前
【无标题】使用 Playwright 实现跨 Chromium、Firefox、WebKit 浏览器自动化操作
运维·前端·深度学习·华为·自动化
top_designer2 小时前
还在手动“磨皮”:用AI降噪+智能蒙版,构建商业摄影的自动化后期管线
图像处理·人工智能·自动化·aigc·photoshop·摄影·lightroom
SelectDB技术团队2 小时前
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
数据库·人工智能·apache·olap·mcp
aneasystone本尊3 小时前
梳理 Dify 应用的会话接口
人工智能
Web3&Basketball3 小时前
大语言模型LLM解决AI幻觉方法的深度分析
人工智能·语言模型·自然语言处理
.银河系.3 小时前
9.28 深度学习10
人工智能·深度学习
jie*3 小时前
小杰深度学习(two)——全连接与链式求导
图像处理·人工智能·pytorch·python·深度学习·分类·回归