Commit bf098870 bf098870a097ab8c7ff31835e0332f067624b0ca by cnb.bofCdSsphPA

Document asset-type training policy before bulk internal ingestion

Constraint: Internal media types need a clear training whitelist and versioning policy before they are mapped into manifests and pgvector
Rejected: Treat all audio-like assets as the same training label source | Would blur original-vs-instrumental semantics and degrade retrieval quality
Confidence: high
Scope-risk: narrow
Directive: Keep original recordings, instrumental variants, and short-video clips explicitly separated by audio_role and version semantics during ingestion
Tested: Verified new documentation anchors and mapping tables in training-data-and-pgvector-guide.md
Not-tested: Automated import from the upstream SQL type enum into manifests
1 parent a68a7296
......@@ -2,6 +2,32 @@
## 2026-06-02
### Stage: 为内部素材 type 枚举补齐训练参与策略文档
完成项:
-[training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md) 新增内部素材 type 映射章节
- 对用户给出的素材类型补齐:
- 主 reference 推荐
- 主 query 推荐
- 伴奏类的条件式参与策略
- 文本/图片/授权/压缩包的 metadata-only 策略
- 增加 `canonical_song_id / version_id / asset_type_code / audio_role` 的落库建议
验证结果:
- 文档中已出现以下关键锚点:
- `12. 你这批内部素材 type,哪些推荐参与训练`
- `12.3 最推荐的主任务训练组合`
- `instrumental_variant`
- `short_video_clip`
- 当前建议与现有数据规范保持一致:
- reference / query 分离
- 伴奏版本默认不无脑并入原曲主标签
- 非音频资产不进入音频模型训练
结论:
- 现在这批内部资产已经有一套明确的训练白名单 / 条件白名单 / 元数据白名单
- 后续做批量导入或 pgvector 入库时,可以直接按文档映射执行
### Stage: 为外部数据集接入增加 overlap query manifest 能力
完成项:
......
......@@ -343,5 +343,140 @@ flowchart TD
4. **固定一部分永不训练,只做 test set。**
5. **先把 manifest 字段做全,再谈 pgvector 和工业服务。**
---
## 12. 你这批内部素材 type,哪些推荐参与训练
## 12.1 一页结论
如果目标是做 **音乐 ACR / 歌曲识别**,推荐按下面的优先级:
- **主 reference 首选**`11 原曲-无损`
- **次级 reference / 兼容增强**`1 原曲-压缩`
- **主 query 来源**`7 抖音片段``8 片段(副歌)``16 快手片段``18 音频demo`
- **伴奏类**`2/9/10/12` 不建议直接无脑混进“原曲主任务”同标签训练,除非你们的业务明确要识别伴奏版本
- **纯文本/图片/授权/压缩包**:不进音频训练,只进元数据治理
---
## 12.2 推荐映射表
| type | 内容 | 建议角色 | 是否进主训练 | 建议说明 |
|---:|---|---|---|---|
| 1 | 原曲-压缩(mp3) | secondary reference / clean query 来源 | 是 | 当 11 缺失时可做主 reference;有 11 时更适合做压缩退化增强 |
| 2 | 伴奏有和声-压缩(mp3) | 可选单独版本库 / hard negative | 条件式 | 不建议直接和原曲共用同一训练语义 |
| 3 | TXT歌词 | metadata | 否 | 可入库做检索增强,不进音频模型 |
| 4 | 封面 | metadata | 否 | 不进音频训练 |
| 5 | 授权书 | compliance metadata | 否 | 只做合规治理 |
| 6 | 专辑信息(txt) | metadata | 否 | 只做元数据 |
| 7 | 抖音片段 | query | 是 | 很适合真实 query 训练/评测 |
| 8 | 片段(副歌) | query | 是 | 高价值 query,建议重点保留 |
| 9 | 伴奏无和声-压缩(mp3) | 可选单独版本库 / hard negative | 条件式 | 不建议默认并入原曲主标签 |
| 10 | 伴奏无和声-无损 | 可选 reference / hard negative | 条件式 | 仅在“识别伴奏版本”任务里进入主训练 |
| 11 | 原曲-无损(wav/flac) | primary reference | **强烈推荐** | 最适合作为标准 reference 真值 |
| 12 | 伴奏有和声-无损 | 可选单独版本库 / hard negative | 条件式 | 与原曲声学差异大,默认不要并到原曲主任务 |
| 13 | 滚动歌词(lrc) | metadata | 否 | 可做歌词侧检索,不进音频模型 |
| 14 | 封面源文件(psd) | metadata | 否 | 不进训练 |
| 16 | 快手片段 | query | 是 | 与 7 类似,适合真实短视频场景评测 |
| 17 | 词曲压缩包 | archive metadata | 否 | 先解包治理,不直接训练 |
| 18 | 音频demo(mp3/wav) | query / weak reference | 条件式 | 先按质量分层;可做 query,必要时做辅 reference |
| 19 | 曲谱(png) | metadata | 否 | 不进音频训练 |
| 20 | 译文滚动歌词 | metadata | 否 | 只做文本侧扩展 |
---
## 12.3 最推荐的主任务训练组合
### A. 如果你的目标是“识别原曲”
```text
reference:
- 11 原曲无损(主)
- 1 原曲压缩(辅)
query:
- 从 11 / 1 切 5s / 8s clean query
- 7 抖音片段
- 8 副歌片段
- 16 快手片段
- 18 音频demo(筛质后)
```
### B. 如果你的目标是“原曲 + 伴奏版本都要识别”
建议不要直接把原曲和伴奏粗暴合并成同一个训练标签,而是至少保留:
- `canonical_song_id`:作品级 ID
- `version_id`:版本级 ID
- `audio_role``original / inst_with_harmony / inst_no_harmony / short_clip / demo`
这样你后面可以做两种策略:
1. **作品级识别**
- 原曲和伴奏共享 `canonical_song_id`
- 但保留不同 `version_id`
2. **版本级识别**
- 原曲和伴奏完全分开标签
如果你现在主目标只是 ACR 识别“这首歌是谁”,而不是区分伴奏版本,建议先走策略 1,但**训练时不要让伴奏版本无脑占太高比例**,否则会把主模型拉偏。
---
## 12.4 我给你的实际建议
### 第一批一定要进的数据
- `11 原曲无损`
- `1 原曲压缩`
- `7 抖音片段`
- `8 副歌片段`
- `16 快手片段`
### 第二批可控加入的数据
- `18 音频demo`
- 先按质量筛选
- 干净 demo 可做 query
- 明显截断/噪声重的 demo 进 hard-case pool
### 不建议第一阶段直接并入主训练标签的数据
- `2 伴奏有和声`
- `9 伴奏无和声-压缩`
- `10 伴奏无和声-无损`
- `12 伴奏有和声-无损`
更稳妥的做法:
- 先单独入库
- 先做评测集 / hard negative
- 等主模型稳定后,再决定是否做多版本任务
---
## 12.5 对应 manifest / pgvector 字段建议
如果你们要把这些 type 真正落到训练和数据库,建议至少补这几个字段:
| 字段 | 示例 | 作用 |
|---|---|---|
| `canonical_song_id` | `song_123` | 作品主键 |
| `version_id` | `song_123_orig_lossless` | 版本主键 |
| `asset_type_code` | `11` | 原始 type 枚举 |
| `audio_role` | `original_lossless` | 训练与检索语义 |
| `type` | `reference / clean / augmented / confused` | 模型训练角色 |
| `source_platform` | `douyin / kuaishou / internal` | 来源治理 |
### 一个实用映射例子
| 原始 type | 推荐 `audio_role` | 推荐训练 `type` |
|---:|---|---|
| 11 | `original_lossless` | `reference` |
| 1 | `original_lossy` | `reference``clean` |
| 7 | `short_video_clip` | `clean` / `confused` |
| 8 | `chorus_clip` | `clean` |
| 16 | `short_video_clip` | `clean` / `confused` |
| 18 | `demo_audio` | `clean` / `augmented` |
| 2/9/10/12 | `instrumental_variant` | 先不进主训练,或做 hard negative |
## Sources
- 当前代码事实来自 [acr-engine/src/data/dataset.py](../acr-engine/src/data/dataset.py), [acr-engine/src/data/manifest_tools.py](../acr-engine/src/data/manifest_tools.py), [acr-engine/src/data/external_adapters.py](../acr-engine/src/data/external_adapters.py), [acr-engine/src/utils/audio.py](../acr-engine/src/utils/audio.py), [acr-engine/src/engines/ecapa_embedder.py](../acr-engine/src/engines/ecapa_embedder.py), [acr-engine/train.py](../acr-engine/train.py)
......