清唱模型:从文件到试听的深度拆解
本教程对应你这次的真实实验。训练输出最终保存到本机 voice_lab/runs/new4090d_ab_retry1;真实完成状态以该目录 comparison.json 为准。
1. 先明确输入和输出
这次模型接收一段已经唱好的人声,生成目标音色的人声。输入提供歌词、旋律、节奏。只用你的录音训练,因此第一次测试是“未见过的你 → 重建你的音色”。另一位授权歌者 → 你的音色,需要另外准备输入才能验证。
它没有文字聊天界面。界面是音频播放器、评分表和转换命令。权重文件 .pth 不能直接双击播放;.wav 才是可播放的声音。
2. 术语全称与具体作用
| 名称 | 全称 | 用熟悉的话解释 |
|---|---|---|
| RVC | Retrieval-based Voice Conversion | 基于检索的声音转换。本轮检索比例为 0,避免额外索引影响对照 |
| SVC | Singing Voice Conversion | 歌声音色转换,保留内容与旋律,更换音色 |
| HuBERT | Hidden-Unit BERT | 将声音压成内容特征;BERT 为 Bidirectional Encoder Representations from Transformers |
| F0 | Fundamental Frequency | 基频,主要对应唱出的音高 |
| RMVPE | Robust Model for Vocal Pitch Estimation | 提取人声音高的模型;与 HuBERT 一样,两组共用冻结预训练权重 |
| G / D | Generator / Discriminator | 生成器输出声音;判别器学习区分生成片段和真实片段 |
| GAN | Generative Adversarial Network | 生成对抗网络,G 和 D 通过各自目标共同训练 |
| scratch | 随机初始化训练 | 本轮仅转换 G/D 从随机数开始,内容与音高提取器仍来自预训练 |
| fine-tuning | 微调 | 从官方 G/D 已学到的权重开始,用你的录音继续更新 |
| tensor | 张量 | 多维数字数组。例如内容特征是“时间帧 × 768 个数字” |
| parameter / weight | 参数 / 权重 | 模型里可学习的数字,optimizer 每步修改它们 |
| optimizer | 优化器 | 根据梯度修改参数;本轮使用 AdamW |
| AdamW | Adam with decoupled Weight Decay | 自适应梯度优化,并把权重衰减与梯度更新分开处理 |
| batch | 批次 | 一次送入模型的片段集合,这里每批 4 个 |
| step | 更新步 | 一批完成一次 D 更新、一次 G 更新;两组目标各 1000 次 |
| epoch | 数据轮次 | 遍历训练加载器一轮;长度分桶与补齐会造成部分片段重复 |
| checkpoint | 模型快照 | 某一更新时刻保存的权重,例如 step500 |
| seed | 随机种子 | 控制随机数起点;这里 1234,不代表 GPU 逐位完全一致 |
| FP32 | 32-bit Floating Point | 32 位浮点数;本次两组相同精度,避免半精度跳步 |
| GPU | Graphics Processing Unit | 适合大量并行数字计算;本轮是 RTX 4090 D |
| CUDA | Compute Unified Device Architecture | NVIDIA GPU 计算平台,PyTorch 通过它在显卡上计算 |
| VRAM | Video Random Access Memory | 显存,存放模型、梯度、激活和临时数组;不同统计口径数值不同 |
| PCM | Pulse-Code Modulation | 脉冲编码调制;PCM16 WAV 存储 16 位量化的波形样本 |
| sample rate | 采样率 | 每秒记录多少波形数字;40 kHz = 40,000 个/秒 |
| frame / hop | 帧 / 帧移 | 分析声音时的滑动窗口及每次前进的样本数 |
| STFT | Short-Time Fourier Transform | 短时傅里叶变换,把每个时间窗口转为频率能量分布 |
| mel | 梅尔频率尺度 | 频率的一种感知尺度;mel 重建 loss 比较生成与真实的声学特征 |
| KL | Kullback–Leibler divergence | KL 散度,训练中约束潜在分布之间的差异 |
| F0 cent | 音分 | 100 cent 为平均律半音,1200 cent 为八度,用于比较音高误差 |
| RMS | Root Mean Square | 均方根,描述波形幅度;匿名试听做响度近似匹配 |
| SSH | Secure Shell | 安全远程终端,连接你的 AutoDL 云端实例 |
| CLI | Command-Line Interface | 命令行界面,例如终端中运行转换命令 |
| GUI | Graphical User Interface | 图形界面,例如带播放按钮的试听页面 |
| SHA256 | Secure Hash Algorithm 256-bit | 文件指纹,核对上传/下载后字节是否一致 |
3. 数据阶段:实际做了什么,得到什么
3.1 读取原录音
输入是你本机清唱目录里的 6 个 M4A。转成单声道、40 kHz、PCM16 WAV,原始文件不改动。
结果:data/self_rvc_v1 中有 6 个 WAV 和 manifest.json。清唱训练无需主动添加伴奏或噪声。含伴奏/噪声输入是否稳健是后续单独测试,不能混进这次干净条件对照后再归因于初始化方式。
3.2 按整段录音划分
| 分组 | 文件尾号 | 时长 | 谁可以使用 |
|---|---|---|---|
| train | 1234、19、57、93 | 311.38 秒 | 参数更新使用 |
| val | 63 | 33.64 秒 | 保留;本次没有用它选择 checkpoint |
| test | 92 | 34.24 秒 | 仅最终评估,固定前 20 秒 |
先划分录音,再切片。这样不会把同一段录音相邻片段同时放到训练和测试里。
3.3 共同预处理与特征提取
仅 train 经上游高通、静音切片、归一化,一共生成 62 个切片。每个切片得到内容特征、音高数组、量化音高数组。A/B 复用同一份特征,不分别随机洗一次数据。
结果:云端上游 logs/..._shared/ 里有 0_gt_wavs、1_16k_wavs、3_feature768、2a_f0、2b-f0nsf。features.json 记录它们的 SHA256。极短尾片段可以是合法提取结果;上游长度分桶决定是否参与训练。
4. 训练阶段:一“步”里面发生什么
- 读取同一 batch 的内容特征、F0 与真实人声。
- G 根据内容、音高和 speaker id 生成波形片段。
- D 对真实/生成波形给出预测,计算判别器 loss;反向传播,更新 D。
- 计算 G 的对抗、特征匹配、mel 重建、KL 等目标;反向传播,更新 G。
- 确认原始 loss 和梯度有限,记录实际更新计数。
- 固定步数保存权重;1000 次真实更新完成后停止该组。
A/B 的区别发生在第 0 步:A 的 G/D 随机,B 的 G/D 已加载固定官方预训练。共享的 HuBERT/RMVPE 不更新。B 从公开数据学到的先验不算“你的数据”,但它属于额外预训练成本。
结果:两组各自有 start.json(起始配置)、metrics.jsonl(真实步数/原始 loss/显存)、summary.json(实际完成状态)、checkpoints/step0.pth、step500.pth、step1000.pth 以及最终 model.pth。原生完整 G/D 与优化器 checkpoint 另保留在云端上游 logs;这里的 .pth 推理快照不是完整断点续训包。
5. “CUDA 测试通过”应该看什么
torch.cuda.is_available() == True 只表示程序能找到 CUDA。证据强度依次为:
| 看到的结果 | 实际能说明什么 |
|---|---|
nvidia-smi 显示 4090 D |
云端能识别显卡 |
torch.cuda.is_available() 为 True |
PyTorch 能调用 CUDA |
start.json 的 device、torch、cuda runtime 正确 |
训练初始化到了正确设备 |
metrics.jsonl 中 step=1、10、20 持续增长,loss 有限 |
已发生真实 G/D 参数更新 |
| 两组 summary 的 complete 与相同实际步数 | 本轮更新协议完成 |
| 输出 WAV 能解码、时长正确、实际听过 | 推理与声音体验可以继续评估 |
任何一项都不能单独证明音质好。看 loss 降低也不能替代试听。
6. 现在怎么实操试听,界面长什么样
第一步:找到本机结果
打开 voice_lab/runs/new4090d_ab_retry1。若还有下载进行中,等 DOWNLOAD_RECEIPT.json 出现,表示 ZIP 已下载、SHA256 相同并完成解压。
预期结果:有 LISTEN.html、listening、blind、两个模型目录、报告及评分表。LISTEN.html 是取回后在本机生成的页面,不需要租 GPU 播放。
第二步:打开试听页面
双击 LISTEN.html,用浏览器打开。界面有三个音频播放控件:测试原声、匿名 X、匿名 Y。点击三角形播放;可拖动进度条、暂停和下载 WAV。
预期结果:听到固定的 20 秒测试内容及两种重建。你的音量、耳机和播放设置保持一致。
第三步:记录评分
用 Excel 打开 listening_scores.csv,填写 listener 和 X/Y 的四项 1–5 分。每项备注具体问题,例如“某个字不清楚”“气声变成杂音”“高音尾音不稳”。保存时保留 CSV 格式。
预期结果:得到个人盲评记录。一个人一段音频的评分只描述这次体验;没有统计推广结论。
第四步:揭晓
完成评分后展开页面“揭晓身份与原始输出”,打开 blind_key.json。再听 A/B 原始 WAV;匿名版做过 RMS 匹配和峰值限制,原始版保持模型直接输出。
预期结果:能把听感与初始化方式对应起来。未评分前不会宣布胜者。
第五步:看报告与证据
打开 MEASURED_REPORT.md 和 training_curves.png。报告列出实际步数、时间、峰值显存、F0 误差、数据划分与失败史。打开 JSON/JSONL 可以逐条核对数字。
预期结果:了解每个结论来自哪个文件,以及哪些问题还没有测。
7. 将另一段人声转换成你的音色
本次已经训练过;此操作使用已保存权重,无需重新训练。准备获授权、未参与本次训练的 10–20 秒干净人声 WAV。音频提供歌词/旋律;模型负责转换音色。
后续在确认价格与新运行预算后,有卡开机,上传新的 WAV 到 /root/autodl-tmp/another_voice.wav。进入你现有项目终端,运行一次推理:
cd /root/autodl-tmp/voice-self-compare-e64531a3
.rvc-venv/bin/python voicelab/rvc_infer_entry.py --model runs/new4090d_ab_retry1/finetune/model.pth --input /root/autodl-tmp/another_voice.wav --output /root/autodl-tmp/converted_to_me_B.wav --speaker-id 0 --pitch 0 --index-rate 0 --rms-mix-rate 1 --protect 0.33
A 的同条件对照把 finetune 改为 scratch,输出改为 converted_to_me_A.wav。下载两个输出 WAV 试听。模型、代码、公共特征权重仍在现有云端项目,无须再次上传原语言模型。若换机器,应复制本项目、公共资产、运行时修复及已训练的两套权重,核对哈希并恢复相同依赖。
移调 pitch 的单位是半音;本轮为 0。先保持本次设置再单独探索变调,避免同时改多个变量。本人一个 speaker 的模型没有“两位歌者之间音色比例”滑杆;这需要新的模型与数据实验。
8. 学代码的具体顺序
| 顺序 | 文件 / 函数 | 学完应该能回答 |
|---|---|---|
| 1 | voicelab/rvc_data.py |
如何解码、重采样、分整录音并验证哈希 |
| 2 | voicelab/rvc_assets.py |
哪些模型是公共冻结特征,哪些是 B 的起始 G/D |
| 3 | preflight_rvc.py |
为什么导入成功还要用真实 WAV 验证预处理输出 |
| 4 | voicelab/rvc_compare.py |
如何保证共同特征、相同 batch/seed、固定测试输入 |
| 5 | upstream/RVC/train/train.py |
一批数据如何先更新 D,再更新 G |
| 6 | voicelab/rvc_bridge.py |
怎样记录真实更新、未截断 loss,保存 0/500/1000 权重 |
| 7 | voicelab/rvc_infer_entry.py |
权重如何加载,输入人声如何变成输出 WAV |
| 8 | voicelab/inference.py |
音分误差怎样计算,为什么它不代表自然度 |
| 9 | launch_rvc.py |
限时退出、下载窗口、平台关机与真实账单的区别 |
| 10 | fetch_rvc_results.py、render_rvc_report.py |
如何安全取回实测产物、生成曲线/播放器/报告 |
可以边读边打开本轮 JSON 与 WAV,对照输入输出。不要在已完成的结果目录里重复启动训练;实验目录是证据,新的实验应使用新目录和独立预算。
9. 这次小数据试验能说明到哪一步
能检验:两种初始化是否能在你这批数据上完成真实更新、固定片段重建怎样、时间/显存/音高指标怎样。不能检验:任意歌者效果、实时延迟、多卡增益、商业音质、任意用户零样本音色混合。
要加强对照,依次扩展跨歌者授权输入、更多音域/唱法、多个随机种子、多首测试歌曲及多听者盲评。每一步都保留固定输入、公共控制变量与真实失败证据。