RVC-dstts / README.md
leexamp's picture
Upload 22 files
88db9c7 verified
|
Raw History Blame Contribute Delete
13.4 kB
metadata
license: mit
language:
  - zh
  - ja
tags:
  - voice-conversion
  - rvc
  - audio
  - singing-voice
  - low-vram
  - model-card
tasks:
  - voice-conversion

DeepSeek 音色歌声转换(RVC)—— 工具链与文档

用 RVC(Retrieval-based Voice Conversion) 把一首歌的人声替换成另一个音色,并附上完整的工程笔记: 在 2GB 显存的入门级笔记本上(NVIDIA MX350 + i5-1035G1)从零跑通转换、训练、评估的全流程。

License: MIT Model: Research Only


⚠️ 重要声明(请先读这一段)

本仓库的模型音色来自 DeepSeek 的在线 TTS 朗读服务。

  • 训练语音是 DeepSeek TTS 朗读日文维基百科生成的音频,不是任何自然人自愿提供的声音样本
  • 因此本模型本质上是一个商业 TTS 音色的克隆。DeepSeek 的服务条款很可能禁止此类用途;商用 TTS 音色通常本身采自真人配音员,可能还涉及该配音员的声音权
  • 本仓库以"研究与学习"为目的发布,不授予任何商业使用权,也不授予音色权利。 使用者若要用在自己项目中,请自行取得相应授权
  • 本仓库不包含任何歌曲音频。 训练用的歌曲(《生き残る千年》 いよわ)受版权保护,未随仓库分发;示例音频也不包含
  • 作者不对使用本仓库产生的任何法律后果负责。详见 MODEL_CARD.md

一句话:代码可以放心用,模型请自行评估风险。

关于"近似度"与后续训练的说明

1. 本模型不是音色提取物,权重中不含任何原始音频。

它是从约 6.5 分钟合成语音中统计学习得到的音色映射参数。仓库不分发、也不会提供任何用于直接提取、 还原或完整复现 DeepSeek 原始语音的工具、数据或中间产物。

2. 客观相似度约 0.925,且存在明确不足。

项 数值
本模型 vs DeepSeek 录音的声纹相似度 约 0.925
同一人两段不同录音的参照上限 0.973
转换前原唱相似度 0.696

这是相似度分数,不是"还原度"或"拷贝比例"。

模型的已知局限:无词长元音段落易产生气声化听感;超出训练音域(168–367 Hz)的段落表现明显下降 (歌曲跨度可达 27 个半音,远超训练数据);无法复现音色来源方的演唱方式,只替换音色。

3. 若你需要更接近的结果,需要自行后训练。

本仓库提供的是方法、工具链与在受限硬件上的工程实践,不提供"开箱即用、高度还原"的成品。 想要更接近特定音色,使用者必须:

  • 自行准备训练数据
  • 自行完成微调(fine-tune)
  • 自行承担所使用数据的权利与合规责任

这一责任不会因使用本仓库而转移给本仓库作者。


效果

在同一首歌上的客观测量(全部可复现,脚本见 scripts/):

指标 数值 说明
声纹相似度 0.925 与 DeepSeek 原始录音对比(resemblyzer d-vector)
真人同人上限 0.973 同一人两段不同录音之间的相似度,作为天花板参照
原唱(初音未来) 0.696 转换前的起点
达成度 83% (0.925−0.696) / (0.973−0.696)
音高对齐 264.5 Hz 与目标本嗓 264.5 Hz 完全一致(整曲降 5 度后)
F0 轮廓跟随度 0.955 转换输出与原曲旋律的相关性(方法上限 0.961)

主观评价(使用者原话):"很像了"、"音色感觉挺自然的"。


快速开始

0. 使用前配置 ⚙️

scripts/ 中的脚本带有作者本机的绝对路径,使用前请先修改:

# 每个脚本开头都有这两行(或类似的),改成你自己的路径
R=/media/user/Data/rvc                       # 工作目录
V=$R/venv/bin/python                         # Python 解释器
NOW=$R/Retrieval-based-Voice-Conversion-WebUI # RVC 仓库位置

其他可能需要调整的地方:

位置 说明
logs/<实验名>/added_*.index 检索索引文件,训练后由 train_index.py 生成
assets/weights/*.pth 模型权重,本仓库 weights/ 下的文件放到这里
scripts/asr.sh 里的 V= whisper 虚拟环境的 site-packages 路径
scripts/spk_sim.py / eval_pitchctl.py 需在装有 resemblyzer 的环境中运行

建议直接用文本编辑器全局替换 /media/user/Data/rvc 为你自己的路径。

1. 环境

# 基础:RVC 本体(MIT)
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI
cd Retrieval-based-Voice-Conversion-WebUI
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt

# 应用本仓库的 2GB 显存补丁
patch -p1 < ../patches/0001-train-2gb-vram-fixes.patch

2. 转换一首歌

# 准备:人声轨 + 伴奏轨(可用 demucs 分离)
#   <歌>.vocals.wav    人声
#   <歌>.no_vocals.wav 伴奏

./scripts/convert4.sh <实验名> <模型.pth> -5 "输出名"

convert4.sh 会依次完成:分块 → GPU 推理 → 拼接 → 伴奏同步降调 → 混音 → 两遍 loudnorm 母带。

3. 评估

./scripts/asr.sh 输出.wav              # GPU 加速 ASR(13.8x 实时率)
python scripts/eval_pitchctl.py 输出.wav # 音高受控声纹相似度

技术要点:我们在 2GB 显存上修掉的 6 个真缺陷

这些是项目过程中量出来的问题,每一个都有实测证据。对显存吃紧的机器尤其有用。

1. 音高偏移 6 个半音(听感"还是原唱"的真因)

量出来的事实:源人声 368 Hz,目标音色本嗓 260 Hz。

说话人身份主要由基频决定。 音色换了、音高没换,耳朵就一定判"还是原来那个人"。而声纹嵌入对音高不敏感,所以指标看着好、耳朵听着不对。

修复:--pitch -5 让输出落在 264.5 Hz,同时把伴奏一起降调(否则和原调打架)。

2. 整曲轻了 7 LU

ffmpeg 的 amix 默认会把输入按数量归一化,丢了 6 dB。 修复:amix=normalize=0 + 两遍 loudnorm(-10.7 LUFS / TP -1.0 / LRA 9,对齐原曲)。

3. 成品其实是单声道

amix 以第一个输入的声道布局决定输出。人声是单声道 → 整条立体声伴奏被压平。 修复:人声显式 pan=stereo|c0=c0|c1=c0,并叠加原曲人声的侧信号还原空间感。

修复后侧/中比 −10.1 dB,原曲 −10.4 dB。

4. 人声/伴奏配比错 10.4 dB

实证原曲混音 = 人声 1.0 + 伴奏 1.0(两轨相加与原曲波形相关性 0.9994)。原先用的 1.5 / 0.45 相当于人声高 3.5 dB、伴奏低 6.9 dB。

5. RVC 会把无声输入放大 15 倍

纯器乐段(源人声 −70dB)经 RVC 后 RMS 从 0.0004 涨到 0.0054,频谱平坦度涨 5 倍——**它在没有歌声的地方"凭空造声"**。

修复:scripts/vocal_gate.py 用源人声活动度做软门控。

实测:间奏段压制回 −20dB;正常唱段仅变化 −0.06dB(零影响)。

6. RVC 训练每步泄漏约 1GB 显存

backward() 只释放计算图内部保存的张量,不解除本帧局部变量对图输出的引用。判别器的多尺度特征图 fmap_r/fmap_g(约 670MB)和生成器输出 y_hat(约 364MB)被一直引用到下一轮才释放。

判定方法:gc.collect() + empty_cache() 完全无法回收(allocated 纹丝不动)→ 证明是活引用而非缓存。

修复:每步末显式置 None。显存从"每步涨 1GB、第 2 步即 OOM"变为全程平稳。

附:GPU 能力边界(实测,避免踩坑)

用途 结论
推理(转换、ASR) ✅ 可用。ASR 比 CPU 快 3.6 倍
训练 ❌ 不可用。判别器特征图固定吃 >1.1GB;勉强跑通后 10 秒/步,比 CPU 慢 3 倍
cudaMallocManaged ❌ 在 Pascal 上触发 Xid 31 MMU 故障,会导致显卡不可用需重启
bitsandbytes 8-bit 优化器 ❌ 无 sm_61 内核

结论:这块卡适合推理,不适合训练。 同理,不要盲目把训练搬上小显存 GPU——算力高不等于能跑。


让 Whisper 在 Pascal 显卡上跑起来

openai-whisper 依赖的 PyTorch 新版本已放弃 Pascal(sm_61),会报 no kernel image is available。可行方案:

  1. 换 faster-whisper(CTranslate2 后端),不用 PyTorch
  2. cuDNN 必须 8.x——9.x 要求 SM ≥ 7.5
  3. CUDA 12 库需在解释器启动前通过 LD_LIBRARY_PATH 暴露(进程内改环境变量无效)
  4. 设 HF_HUB_OFFLINE=1 + local_files_only=True,否则网络不通时会长时间挂起

见 scripts/asr.sh(已封装上述全部要点)。


训练数据

项 说明
文本来源 日文维基百科(CC BY-SA 4.0,需署名 + 相同方式共享)
音频生成 DeepSeek 在线 TTS 朗读服务
有效时长 约 6.5 分钟自然语音 → 152 个训练片段
音高增广后 439 个片段(额外生成 +6 / +12 半音的保共振峰变调版本)

数据量的作用远大于调参:本项目中最关键的一次提升来自把真实语音从 2 分钟增加到 6.5 分钟(训练样本 56 → 152)。


文件说明

scripts/
  convert4.sh        完整转换流水线(分块GPU推理 + 伴奏同步降调 + 母带)
  master.sh          混音母带(正确配比 + 立体声 + 两遍 loudnorm)
  vocal_gate.py      按源人声活动度门控,抑制 RVC 在静音处的伪影
  asr.sh / asr_run.py  GPU 加速 ASR(faster-whisper)
  eval_pitchctl.py   音高受控声纹评估(消除音高混淆)
  eval_ckpt.sh       检查点批量评估
  spk_sim.py         说话人相似度(d-vector 余弦)
  batch_eval.sh      多检查点对比

patches/
  0001-train-2gb-vram-fixes.patch   RVC train.py 的 2GB 显存修复
  cpu_offload_adam.py               优化器状态 offload 到主机内存(数值已验证一致)

weights/
  dsvoice2_e20_s1540.pth   推荐使用(声纹 0.925)
  dsvoice4_e4_s872.pth     音高增广版
  dsvoice4_e6_s1308.pth    音高增广版(训练停止处)

⚠️ 关于评估指标的可靠性(重要经验)

声纹相似度对噪声、气声、辅音清晰度完全不敏感。

本项目中被使用者的听感三次推翻了指标结论:

场景 指标 实际听感
音高增广后 相似度 +7.5% ↑ "像呻吟"
怀疑音符丢失 起始点/换音次数全部正常 "有些音符没唱出来"
分析怪异音 频谱、颤音、F0 轮廓全部正常 "还是很怪"

教训:指标只能用来筛掉明显退化的版本,最终判据必须是人耳。

补充:跨音高比较声纹相似度是无效的——把同一段音频升 8 个半音,相似度会从 0.987 掉到 0.66。eval_pitchctl.py 通过把参考音也变调到相同音高来消除这个混淆。


许可证与致谢

内容 许可
本仓库代码(scripts/、patches/) MIT
模型权重(weights/) 仅限研究学习,不授予商业使用权与音色权利
训练文本 日文维基百科,CC BY-SA 4.0

致谢


免责声明

本项目仅用于技术学习与研究。使用者应自行确保其使用方式符合所在地法律法规及第三方服务条款。 作者不对任何因使用本项目而产生的法律纠纷或损失负责。


下架承诺

本仓库作者承诺:若模型音色来源方(DeepSeek)或任何相关权利人提出异议,将立即移除 weights/ 目录下的全部模型权重。

为便于履行该承诺,本仓库采用代码与权重分离的结构:

部分 风险 可否独立移除
scripts/、patches/、文档 无(原创代码 + MIT 依赖) —
weights/ 取决于音色来源方的态度 ✅ 可单独删除,不影响代码可用性

weights/ 目录自带独立说明,建议作为单独仓库发布。这样即使需要下架,代码与方法论仍可完整保留。

若你计划复现本项目,建议:

  1. 先只用 scripts/ 与 patches/,用你自己拥有权利的数据训练
  2. 确认音色来源的许可条款后,再决定是否使用 weights/
  3. 关注来源方是否发布官方开源版本——若有,优先采用其明确授权的权重