什么是基于检索的语音转换 WebUI?
基于检索的语音转换 WebUI 是一个开源框架,旨在使语音转换变得简单高效。它基于 VITS 模型构建,提供了易于使用的推理和训练界面,即使是机器学习或音频处理经验有限的用户也能轻松上手。WebUI 支持多种功能,包括语音转换、实时语音变声,以及使用小数据集训练模型的能力。
UI 预览
训练和推理 WebUI | 实时语音变声 GUI |
go-web.bat - infer-web.py | go-realtime-gui.bat |
特点:
- 通过使用 top1 检索,将源特征替换为训练集特征,从而减少音高泄漏;
- 简单快速的训练,即使在性能较差的显卡上也能进行;
- 使用少量数据进行训练(建议使用 10 分钟以上的低噪声语音);
- 模型融合以改变音色(使用 ckpt 处理选项卡 -> ckpt 合并);
- 易于使用的 WebUI;
- UVR5 模型可快速分离人声和乐器;
- 高音提取算法 InterSpeech2023-RMVPE 可防止声音闷哑的问题。提供(显著)最佳结果,且比 Crepe_full 更快,资源消耗更低;
- 支持 AMD/Intel 显卡加速;
- 支持 Intel ARC 显卡与 IPEX 加速。
推理和训练入门
1. 设置环境
要开始使用基于检索的语音转换 WebUI,您需要首先准备您的环境。该框架要求 Python 3.8 或更高版本。
安装核心依赖项
对于 NVIDIA GPU
pip install torch torchvision torchaudio
对于 Linux 上的 AMD GPU
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2
安装其他依赖项
使用 poetry
安装
curl -sSL https://install.python-poetry.org | python3 -
poetry install
或使用 pip
安装
pip install -r requirements.txt
2. 下载预训练模型
WebUI 需要几个预训练模型才能正常运行。您可以使用提供的脚本自动下载这些模型。
python tools/download_models.py
或者,也可以从 Hugging Face 手动下载模型。
3. 安装 FFmpeg
FFmpeg 对于处理音频文件是必需的。安装步骤因您的操作系统而异。
- Ubuntu/Debian:
sudo apt install ffmpeg
- macOS:
brew install ffmpeg
- Windows:从 Hugging Face 下载
ffmpeg.exe
和ffprobe.exe
并将其放在根文件夹中。
4. 启动 WebUI
环境设置完毕并下载了必要的模型后,即可启动 WebUI。
通用用法
python infer-web.py
对于 Windows 用户,也可以通过双击 go-web.bat
启动 WebUI。
训练新模型
使用基于检索的语音转换 WebUI 训练您自己的语音转换模型非常简单,只需 10 分钟的低噪声语音数据即可完成。
- 准备数据集:收集并预处理您的音频数据。
- 启动训练界面:如上所述启动 WebUI 并导航到训练部分。
- 设置训练参数:根据您的数据集配置模型参数和训练选项。
- 开始训练:开始训练过程。WebUI 将引导您完成每个步骤,并提供模型进度的反馈。
链接与资源
- Colab 笔记本:在 Colab 环境中运行 WebUI。
或在此处使用 Colab 模组 - GitHub 仓库:访问源代码和文档。
- Hugging Face 模型:下载预训练模型及其他必要文件。
RVC 训练说明和技巧
====================================== 本技巧解释了数据训练是如何完成的。
训练流程
我将沿着 GUI 训练选项卡中的步骤进行解释。
步骤1
在此处设置实验名称。
您还可以在此处设置模型是否应考虑音高。如果模型不考虑音高,模型会更轻量,但不适合唱歌。
每个实验的数据都放置在 /logs/您的实验名称/
中。
步骤2a
加载并预处理音频。
加载音频
如果您指定一个包含音频的文件夹,该文件夹中的音频文件将自动读取。例如,如果您指定 C:Users\hoge\voices
,则会加载 C:Users\hoge\voices\voice.mp3
,但不会加载 C:Users\hoge\voices\dir\voice.mp3
。
由于内部使用 ffmpeg 读取音频,如果扩展名受 ffmpeg 支持,它将自动读取。转换为 int16 后,再转换为 float32 并归一化到 -1 到 1 之间。
降噪
音频通过 scipy 的 filtfilt 进行平滑处理。
音频分割
首先,通过检测持续时间超过一定时期(max_sil_kept=5 秒?)的静音部分来分割输入音频。分割音频后,每 4 秒分割一次,重叠 0.3 秒。对于 4 秒内分割的音频,在音量归一化后,将 wav 文件转换为 /logs/您的实验名称/0_gt_wavs
,然后将其转换为 16k 采样率的 wav 文件到 /logs/您的实验名称/1_16k_wavs
。
步骤2b
提取音高
从 wav 文件中提取音高信息。使用 parselmouth 或 pyworld 内置的方法提取音高信息 (=f0) 并将其保存在 /logs/您的实验名称/2a_f0
中。然后将音高信息对数转换为 1 到 255 之间的整数并将其保存在 /logs/您的实验名称/2b-f0nsf
中。
提取特征指纹
提前使用 HuBERT 将 wav 文件转换为嵌入。读取保存在 /logs/您的实验名称/1_16k_wavs
中的 wav 文件,使用 HuBERT 将 wav 文件转换为 256 维特征,并以 npy 格式保存在 /logs/您的实验名称/3_feature256
中。
步骤3
训练模型。
初学者词汇表
在深度学习中,数据集被分割并逐渐进行学习。在一次模型更新(步骤)中,检索 batch_size 数据并执行预测和错误更正。对数据集执行一次此操作算作一个 epoch。
因此,学习时间为每步学习时间 x(数据集中的数据量 / batch_size)x epoch 数量。一般来说,batch_size 越大,学习越稳定(每步学习时间 ÷ batch_size 变得越小),但它会使用更多的 GPU 内存。GPU RAM 可以通过 nvidia-smi 命令查看。通过根据执行环境的机器尽可能增加 batch_size,可以在短时间内完成学习。
指定预训练模型
RVC 从预训练权重而不是从 0 开始训练模型,因此可以使用小型数据集进行训练。
默认情况下
- 如果考虑音高,它将加载
rvc-location/pretrained/f0G40k.pth
和rvc-location/pretrained/f0D40k.pth
。 - 如果不考虑音高,它将加载
rvc-location/pretrained/f0G40k.pth
和rvc-location/pretrained/f0D40k.pth
。
在学习时,模型参数会为每个 save_every_epoch 保存到 logs/您的实验名称/G_{}.pth
和 logs/您的实验名称/D_{}.pth
中,但通过指定此路径,您可以重新开始学习或从不同实验中学习到的模型权重开始训练。
学习索引
RVC 保存训练期间使用的 HuBERT 特征值,并在推理期间搜索与学习期间使用的特征值相似的特征值以进行推理。为了高速执行此搜索,需要提前学习索引。对于索引学习,我们使用近似 RVC 训练说明和技巧
本技巧解释了数据训练是如何完成的。
训练流程
我将沿着 GUI 训练选项卡中的步骤进行解释。
步骤1
在此处设置实验名称。
您还可以在此处设置模型是否应考虑音高。如果模型不考虑音高,模型会更轻量,但不适合唱歌。
每个实验的数据都放置在 /logs/您的实验名称/
中。
步骤2a
加载并预处理音频。
加载音频
如果您指定一个包含音频的文件夹,该文件夹中的音频文件将自动读取。例如,如果您指定 C:Users\hoge\voices
,则会加载 C:Users\hoge\voices\voice.mp3
,但不会加载 C:Users\hoge\voices\dir\voice.mp3
。
由于内部使用 ffmpeg 读取音频,如果扩展名受 ffmpeg 支持,它将自动读取。转换为 int16 后,再转换为 float32 并归一化到 -1 到 1 之间。
降噪
音频通过 scipy 的 filtfilt 进行平滑处理。
音频分割
首先,通过检测持续时间超过一定时期(max_sil_kept=5 秒?)的静音部分来分割输入音频。分割音频后,每 4 秒分割一次,重叠 0.3 秒。对于 4 秒内分割的音频,在音量归一化后,将 wav 文件转换为 /logs/您的实验名称/0_gt_wavs
,然后将其转换为 16k 采样率的 wav 文件到 /logs/您的实验名称/1_16k_wavs
。
步骤2b
提取音高
从 wav 文件中提取音高信息。使用 parselmouth 或 pyworld 内置的方法提取音高信息 (=f0) 并将其保存在 /logs/您的实验名称/2a_f0
中。然后将音高信息对数转换为 1 到 255 之间的整数并将其保存在 /logs/您的实验名称/2b-f0nsf
中。
提取特征指纹
提前使用 HuBERT 将 wav 文件转换为嵌入。读取保存在 /logs/您的实验名称/1_16k_wavs
中的 wav 文件,使用 HuBERT 将 wav 文件转换为 256 维特征,并以 npy 格式保存在 /logs/您的实验名称/3_feature256
中。
步骤3
训练模型。
初学者词汇表
在深度学习中,数据集被分割并逐渐进行学习。在一次模型更新(步骤)中,检索 batch_size 数据并执行预测和错误更正。对数据集执行一次此操作算作一个 epoch。
因此,学习时间为每步学习时间 x(数据集中的数据量 / batch_size)x epoch 数量。一般来说,batch_size 越大,学习越稳定(每步学习时间 ÷ batch_size 变得越小),但它会使用更多的 GPU 内存。GPU RAM 可以通过 nvidia-smi 命令查看。通过根据执行环境的机器尽可能增加 batch_size,可以在短时间内完成学习。
指定预训练模型
RVC 从预训练权重而不是从 0 开始训练模型,因此可以使用小型数据集进行训练。
默认情况下
- 如果考虑音高,它将加载
rvc-location/pretrained/f0G40k.pth
和rvc-location/pretrained/f0D40k.pth
。 - 如果不考虑音高,它将加载
rvc-location/pretrained/f0G40k.pth
和rvc-location/pretrained/f0D40k.pth
。
在学习时,模型参数会为每个 save_every_epoch 保存到 logs/您的实验名称/G_{}.pth
和 logs/您的实验名称/D_{}.pth
中,但通过指定此路径,您可以重新开始学习或从不同实验中学习到的模型权重开始训练。
学习索引
RVC 保存训练期间使用的 HuBERT 特征值,并在推理期间搜索与学习期间使用的特征值相似的特征值以进行推理。为了高速执行此搜索,需要提前学习索引。对于索引学习,我们使用近似最近邻搜索库 faiss。读取 logs/您的实验名称/3_feature256
的特征值并用它来学习索引,并将其保存为 logs/您的实验名称/add_XXX.index
。
(自 20230428 更新版本起,它从索引中读取,不再需要保存/指定。)
按钮说明
- 训练模型:执行 step2b 后,按下此按钮即可训练模型。
- 训练特征索引:训练模型后,执行索引学习。
- 一键训练:step2b、模型训练和特征索引训练一次完成。搜索库 faiss。读取
logs/您的实验名称/3_feature256
的特征值并用它来学习索引,并将其保存为logs/您的实验名称/add_XXX.index
。
(自 20230428 更新版本起,它从索引中读取,不再需要保存/指定。)
按钮说明
- 训练模型:执行 step2b 后,按下此按钮即可训练模型。
- 训练特征索引:训练模型后,执行索引学习。
- 一键训练:step2b、模型训练和特征索引训练一次完成。
结论
基于检索的语音转换(RVC)是一种开源语音转换 AI 算法,可实现逼真的语音到语音转换,准确保留原始说话者的语调和音频特征。有关更详细的说明和更新,请访问官方 GitHub 仓库。