coverhunter_finetune_topic.md 12.2 KB

CoverHunter 双流微调专题方案

1. 专题目标

本专题目标是围绕当前仓库,建立一套可持续扩展的 CoverHunter 双流微调方案,用于音乐翻唱识别、哼唱检索、录音片段检索和抗噪 ACR 检索。

专题的核心方向不是一次性跑通训练,而是建立一条可反复扩展的训练专题链路:

  1. 明确现有音源与数据资产
  2. 定义双流训练架构
  3. 设计分阶段训练计划
  4. 形成标准训练流程
  5. 规范训练产物与权重使用方式
  6. 为后续补充更多 music 语料预留稳定入口

2. 当前已有音源与数据资产

2.1 当前仓库内可直接使用的数据

当前可直接用于训练与冒烟验证的数据位于:

acr-engine/data/synthetic_v2/

其中包含:

  • train.json
  • test.json
  • segments/*.wav

2.2 当前训练集统计

基于 acr-engine/data/synthetic_v2/train.json 的统计结果:

  • 样本总数:96
  • song_id 数量:16
  • 类型分布:
    • reference: 16
    • clean: 32
    • augmented: 16
    • humming_like: 16
    • confused: 16

2.3 当前音源的含义

按现有数据结构,可以理解为每首歌目前至少对应以下几类样本:

  1. reference
    • 作为标准原曲/参考版本
    • 用于建立稳定的正样本锚点
  2. clean
    • 较干净的切片
    • 代表相对理想的检索输入
  3. augmented
    • 已经经过部分增强的样本
    • 用于初步提升泛化能力
  4. humming_like
    • 偏哼唱/偏旋律化表达的近似样本
    • 用于强化“忽略音色、聚焦旋律”能力
  5. confused
    • 易混淆样本
    • 用于构建难负样本与边界学习能力

2.4 当前音源的局限性

当前 synthetic_v2 更适合做:

  • 训练链路验证
  • 双流结构验证
  • 小规模参数/损失/显存调优
  • 产物定义与使用方式验证

当前它还不适合直接视为最终生产训练集,原因包括:

  • 歌曲数较少(16 首)
  • 类型覆盖有限
  • 录音噪声场景仍偏少
  • 真实翻唱的多样性不足
  • 真实设备采集差异不足

所以本专题应采用 分阶段训练策略


3. 当前双流训练架构

3.1 架构定义

当前已按双流结构实现:

流 A:MERT + Melody 分支

位置:

  • acr-engine/src/models/ecapa_tdnn.py

职责:

  • 建模高层语义与旋律表达
  • 提高跨音色、跨设备、跨唱法的语义对齐能力

当前组成:

  • FrozenMERTFeatureExtractor
  • melody/chroma 特征投影与融合

默认模型配置:

model:
  mert_model_name: m-a-p/MERT-v1-95M

流 B:ECAPA 分支

职责:

  • 强化局部声学结构与 timbre/韵律相关判别信息
  • 作为与 MERT 分支互补的检索支路

双流融合

  • DualStreamFusion

作用:

  • 将语义旋律流与 ECAPA 流融合到统一时序空间

检索头

  • CoverHunterHead

作用:

  • 将融合后的时序特征进一步编码
  • 输出最终 embedding 用于对比训练和检索

训练目标

  • InfoNCE
  • AAMSoftmax

4. 训练专题的总体思路

本专题不建议“一步到位”直接上大规模真实全量训练,而建议按三个阶段推进。

阶段 A:链路验证阶段

目标:

  • 验证模型结构、数据流、增强链路、权重产物、运行日志是否闭环

训练数据:

  • acr-engine/data/synthetic_v2

产出:

  • 跑通训练
  • 确认显存
  • 确认增强是否有效
  • 确认权重可以导出并复用

阶段 B:专题微调阶段

目标:

  • 在当前专题下引入更多音乐语料
  • 逐步扩充:原曲、翻唱、录音、哼唱、噪声注入样本
  • 建立更稳定的双流 CoverHunter embedding

训练数据规划:

  • 原曲标准音源
  • 真实或半真实翻唱音源
  • 设备录音音源
  • 环境噪声音源
  • 难负样本音源

阶段 C:检索权重沉淀阶段

目标:

  • 固化最优权重
  • 建立 reference embedding 索引流程
  • 形成线上/离线检索用权重标准

5. 训练数据计划

后续你提到会补充更多 music 语料,因此建议数据建设按下面结构统一。

5.1 推荐数据结构

建议每首歌围绕 song_id 组织为:

  • reference
  • clean
  • cover
  • recording
  • environment
  • humming_like
  • confused

5.2 推荐含义

reference

  • 标准原曲版本
  • 用于构建基准 embedding 和 reference index

clean

  • 质量较好的切片/相对干净音频
  • 用于稳定正样本训练

cover

  • 真实翻唱版本
  • 用于训练旋律一致、音色不同的对齐能力

recording

  • 手机/麦克风录制版本
  • 用于训练设备失真和场景采集鲁棒性

environment

  • 注入环境噪声或真实环境录音
  • 用于训练抗噪能力

humming_like

  • 哼唱、跟唱、弱伴奏旋律版本
  • 用于训练旋律驱动检索能力

confused

  • 容易相似但不属于同一首歌的样本
  • 用于强化难负样本学习

5.3 当前专题的样本补充建议

优先补充顺序建议为:

  1. 更多 reference / clean 原曲
  2. 更多 recording / environment 样本
  3. 更多真实 cover 样本
  4. 更多 confused 难负样本
  5. 更多 humming_like 样本

原因:

  • 当前抗噪与设备泛化是近期最容易拉开效果差异的方向
  • cover / humming 的价值很高,但数据准备成本更高

6. 数据增强计划

当前代码已实现两大类增强,用于“伪造录音”和“伪造翻唱”。

位置:

  • acr-engine/src/utils/augment.py

6.1 伪造录音增强

包括:

  • AddGaussianNoise
  • AddBackgroundNoise
  • BandPassFilter
  • Mp3Compression

作用:

  • 模拟餐厅底噪、街道底噪
  • 模拟廉价设备频响缺失
  • 模拟压缩带来的失真
  • 提高抗噪与抗设备变化能力

6.2 伪造翻唱增强

包括:

  • PitchShift
  • TimeStretch
  • Frequency Masking

作用:

  • 模拟升降调翻唱
  • 模拟节奏变化
  • 逼迫模型降低音色依赖,关注旋律主线

6.3 当前专题下的增强原则

  • reference 不建议过强增强
  • clean 可做轻增强
  • recording / environment 可做强增强
  • humming_like / confused 应提高采样权重

7. 训练流程

7.1 环境准备

解释器:

/usr/local/miniconda3/bin/python

安装依赖:

/usr/local/miniconda3/bin/python -m pip install -r acr-engine/requirements.txt

当前依赖至少需要:

  • torch
  • torchaudio
  • transformers
  • huggingface_hub
  • librosa
  • soundfile
  • audiomentations

7.2 4GB GPU 专用配置

当前 GPU 为:

  • Quadro P1000
  • 4GB 显存

因此我已经新增专用配置:

  • acr-engine/configs/coverhunter_finetune_4gb.yaml

特点:

  • 更小 batch_size
  • 更短片段
  • 更小通道数
  • 更浅层数
  • 更适合当前显存资源

7.3 首次验证流程

先 dry-run:

cd /mnt/e/hikoon-ACR/acr-engine && \
/usr/local/miniconda3/bin/python scripts/run_coverhunter_finetune.py \
  --python /usr/local/miniconda3/bin/python \
  --config configs/coverhunter_finetune_4gb.yaml \
  --data data/synthetic_v2 \
  --device cuda \
  --segment-strategy hybrid \
  --dry-run

7.4 小规模试训

cd /mnt/e/hikoon-ACR/acr-engine && \
/usr/local/miniconda3/bin/python train.py \
  --config configs/coverhunter_finetune_4gb.yaml \
  --data data/synthetic_v2 \
  --output data/training_runs/coverhunter_4gb_trial \
  --device cuda \
  --segment-strategy hybrid \
  --batch-size 2 \
  --epochs 2

7.5 专题正式训练

cd /mnt/e/hikoon-ACR/acr-engine && \
/usr/local/miniconda3/bin/python scripts/run_coverhunter_finetune.py \
  --python /usr/local/miniconda3/bin/python \
  --config configs/coverhunter_finetune_4gb.yaml \
  --data data/synthetic_v2 \
  --device cuda \
  --segment-strategy hybrid \
  --noise-root data/noise/restaurant \
  --noise-root data/noise/street

7.6 后续扩容训练

当你补充新的 music 语料后,建议:

  1. 先保持 song_id + type + audio_path + duration 元数据结构一致
  2. 新语料先做小批量接入
  3. 先跑 2 epoch 验证
  4. 再逐步扩大训练轮次

8. 训练过程会产生什么产物

每次训练会生成目录:

acr-engine/data/training_runs/<run_name>/

标准产物包括:

  • best_model.pt
  • checkpoint_epoch_*.pt
  • song_to_idx.json
  • training_metrics.json
  • training_manifest.json
  • run_request.json
  • run_summary.json
  • stdout.log
  • stderr.log

8.1 各产物的用途

best_model.pt

  • 当前训练过程中最优权重
  • 后续检索、建库、推理优先使用它

checkpoint_epoch_*.pt

  • 周期性保存点
  • 用于中断恢复、回溯比较

song_to_idx.json

  • 训练类别到 song_id 的映射
  • 用于解释训练分类头与标签对应关系

training_metrics.json

  • 记录最后一次训练指标
  • 用于专题对比不同配置

training_manifest.json

  • 记录本次训练的配置、输入、产物路径
  • 适合作为专题可追溯记录

run_request.json / run_summary.json

  • 记录本次运行命令、解释器、配置与运行结果
  • 便于回放与专题管理

9. 预期权重怎么使用

这是专题里非常关键的一部分。

9.1 训练权重的核心用途

训练出来的 best_model.pt 不是只为了看 loss,而是为了后续两类使用:

  1. 离线建库
  2. 在线查询 embedding 提取

9.2 离线建库

目标:

  • 使用参考音源(reference)切片提取 embedding
  • 建立 reference 向量索引

预期流程:

  1. 读取 reference 音源
  2. 切片
  3. 用双流模型提 embedding
  4. 存成 embedding matrix
  5. 后续接 Faiss / pgvector / Milvus

9.3 在线查询

目标:

  • 输入录音、翻唱、哼唱片段
  • 提取 embedding
  • 与 reference index 做相似度检索

预期方式:

  1. 加载 best_model.pt
  2. 对查询音频切片
  3. 提取 embedding
  4. 与 reference embedding 做 ANN 检索
  5. 结合 vote / rerank 输出最终结果

9.4 推荐使用策略

最佳权重

生产或专题评估优先使用:

  • best_model.pt

恢复训练

继续训练优先使用:

  • checkpoint_epoch_*.pt

对比实验

建议每个专题 run 保留完整目录,不覆盖历史 run。


10. 预计怎么推进专题训练

第 1 步:先跑通当前 synthetic_v2

目标:

  • 验证链路
  • 验证显存
  • 验证双流结构
  • 验证 MERT 接口

第 2 步:补录音噪声语料

优先补充:

  • 餐厅
  • 街道
  • 室内人声背景
  • 手机录制样本

目标:

  • 提升抗噪与设备鲁棒性

第 3 步:补真实翻唱/旋律相近样本

目标:

  • 强化旋律对齐
  • 降低音色依赖

第 4 步:补难负样本

目标:

  • 降低误识别
  • 提高边界判别能力

第 5 步:固化最优专题权重

目标:

  • 形成一个可用于离线建库与线上检索的标准权重版本

11. 当前专题的资源结论

可以做的事

  • 继续完善训练链路
  • synthetic_v2 做小规模训练
  • 做双流模型结构验证
  • 做 4GB GPU 轻量试训
  • 规范化训练产物与权重使用方式

当前暂时受限的事

  • 由于环境缺依赖,还不能直接启动真实训练
  • 由于 GPU 只有 4GB,真实 MERT + ECAPA 双流正式训练需要保守配置
  • 当前真实音乐语料仍不足,暂时更适合专题验证,不适合最终权重定版

12. 本专题当前落地文件

配置

  • acr-engine/configs/coverhunter_finetune.yaml
  • acr-engine/configs/coverhunter_finetune_4gb.yaml
  • acr-engine/configs/default.yaml

模型与训练

  • acr-engine/src/models/ecapa_tdnn.py
  • acr-engine/src/models/losses.py
  • acr-engine/src/data/dataset.py
  • acr-engine/src/utils/augment.py
  • acr-engine/train.py
  • acr-engine/scripts/run_coverhunter_finetune.py

文档

  • docs/coverhunter_training_process.md
  • docs/coverhunter_finetune_topic.md

13. 当前专题结论

当前已经具备:

  • 双流 CoverHunter 微调架构
  • 4GB GPU 专用轻量配置
  • 训练流程脚本
  • 训练产物记录机制
  • 专题级训练文档

当前下一步最实际的动作是:

  1. /usr/local/miniconda3/bin/python 下补齐依赖
  2. coverhunter_finetune_4gb.yaml 跑 dry-run
  3. synthetic_v2 做 2 epoch 小规模试训
  4. 再逐步接入更多 music 语料