Commit a4c891da a4c891dad1af312917720d031a600ae8b30ac53d by cnb.bofCdSsphPA

Clarify how audio becomes trainable and queryable data

Constraint: The guidance had to align with the repo's existing manifest and pgvector templates while staying usable for later industrial ingestion.
Rejected: A purely conceptual note | It would not be actionable for future sessions or data engineering work.
Confidence: high
Scope-risk: narrow
Directive: Keep future dataset onboarding and pgvector ingestion changes anchored on manifest-first contracts and stable song identifiers.
Tested: Relative markdown links for the updated docs were validated locally and repository anchor files were confirmed present.
Not-tested: No model retraining or database ingestion was run in this documentation-only stage.
1 parent d1e1a2b7
...@@ -2,6 +2,33 @@ ...@@ -2,6 +2,33 @@
2 2
3 ## 2026-06-02 3 ## 2026-06-02
4 4
5 ### Stage: 训练数据与 pgvector 专项说明补强
6
7 完成项:
8 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
9 - 单独详细说明:
10 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
11 - reference 与 query 的角色区分
12 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
13 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
14 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
15
16 验证结果:
17 - 已校验文档内新增相对链接全部可达
18 - 文档已覆盖:
19 - 输入格式
20 - 切片时长建议
21 - label 设计
22 - `song_id/version_id` 规范
23 - `pgvector` 数据模型与入库流程
24 - 当前引用的仓库内实现锚点:
25 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
26 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
27
28 结论:
29 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
30 - 新 session 与后续数据工程实现可直接按该文档落地
31
5 ### Stage: 文档浓缩与相对链接跳转 32 ### Stage: 文档浓缩与相对链接跳转
6 33
7 完成项: 34 完成项:
...@@ -814,6 +841,33 @@ ...@@ -814,6 +841,33 @@
814 841
815 ## 2026-06-02 842 ## 2026-06-02
816 843
844 ### Stage: 训练数据与 pgvector 专项说明补强
845
846 完成项:
847 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
848 - 单独详细说明:
849 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
850 - reference 与 query 的角色区分
851 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
852 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
853 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
854
855 验证结果:
856 - 已校验文档内新增相对链接全部可达
857 - 文档已覆盖:
858 - 输入格式
859 - 切片时长建议
860 - label 设计
861 - `song_id/version_id` 规范
862 - `pgvector` 数据模型与入库流程
863 - 当前引用的仓库内实现锚点:
864 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
865 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
866
867 结论:
868 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
869 - 新 session 与后续数据工程实现可直接按该文档落地
870
817 ### Stage: 文档补全 + ACR 最小可运行链路 871 ### Stage: 文档补全 + ACR 最小可运行链路
818 872
819 完成项: 873 完成项:
...@@ -836,6 +890,33 @@ ...@@ -836,6 +890,33 @@
836 890
837 ## 2026-06-02 891 ## 2026-06-02
838 892
893 ### Stage: 训练数据与 pgvector 专项说明补强
894
895 完成项:
896 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
897 - 单独详细说明:
898 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
899 - reference 与 query 的角色区分
900 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
901 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
902 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
903
904 验证结果:
905 - 已校验文档内新增相对链接全部可达
906 - 文档已覆盖:
907 - 输入格式
908 - 切片时长建议
909 - label 设计
910 - `song_id/version_id` 规范
911 - `pgvector` 数据模型与入库流程
912 - 当前引用的仓库内实现锚点:
913 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
914 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
915
916 结论:
917 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
918 - 新 session 与后续数据工程实现可直接按该文档落地
919
839 ### Stage: 准确率优化 v2(128 Mel / band-split / retrieval 评测 / dataset 规范 / SOTA 调研) 920 ### Stage: 准确率优化 v2(128 Mel / band-split / retrieval 评测 / dataset 规范 / SOTA 调研)
840 921
841 完成项: 922 完成项:
...@@ -868,6 +949,33 @@ ...@@ -868,6 +949,33 @@
868 949
869 ## 2026-06-02 950 ## 2026-06-02
870 951
952 ### Stage: 训练数据与 pgvector 专项说明补强
953
954 完成项:
955 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
956 - 单独详细说明:
957 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
958 - reference 与 query 的角色区分
959 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
960 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
961 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
962
963 验证结果:
964 - 已校验文档内新增相对链接全部可达
965 - 文档已覆盖:
966 - 输入格式
967 - 切片时长建议
968 - label 设计
969 - `song_id/version_id` 规范
970 - `pgvector` 数据模型与入库流程
971 - 当前引用的仓库内实现锚点:
972 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
973 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
974
975 结论:
976 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
977 - 新 session 与后续数据工程实现可直接按该文档落地
978
871 ### Stage: 工业化服务骨架 + 外部 manifest 转换模板 979 ### Stage: 工业化服务骨架 + 外部 manifest 转换模板
872 980
873 完成项: 981 完成项:
...@@ -890,6 +998,33 @@ ...@@ -890,6 +998,33 @@
890 998
891 ## 2026-06-02 999 ## 2026-06-02
892 1000
1001 ### Stage: 训练数据与 pgvector 专项说明补强
1002
1003 完成项:
1004 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
1005 - 单独详细说明:
1006 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
1007 - reference 与 query 的角色区分
1008 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
1009 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
1010 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
1011
1012 验证结果:
1013 - 已校验文档内新增相对链接全部可达
1014 - 文档已覆盖:
1015 - 输入格式
1016 - 切片时长建议
1017 - label 设计
1018 - `song_id/version_id` 规范
1019 - `pgvector` 数据模型与入库流程
1020 - 当前引用的仓库内实现锚点:
1021 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
1022 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
1023
1024 结论:
1025 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
1026 - 新 session 与后续数据工程实现可直接按该文档落地
1027
893 ### Stage: 文档治理闭环(导航 / 引用 / 模板) 1028 ### Stage: 文档治理闭环(导航 / 引用 / 模板)
894 1029
895 完成项: 1030 完成项:
...@@ -910,6 +1045,33 @@ ...@@ -910,6 +1045,33 @@
910 1045
911 ## 2026-06-02 1046 ## 2026-06-02
912 1047
1048 ### Stage: 训练数据与 pgvector 专项说明补强
1049
1050 完成项:
1051 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
1052 - 单独详细说明:
1053 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
1054 - reference 与 query 的角色区分
1055 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
1056 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
1057 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
1058
1059 验证结果:
1060 - 已校验文档内新增相对链接全部可达
1061 - 文档已覆盖:
1062 - 输入格式
1063 - 切片时长建议
1064 - label 设计
1065 - `song_id/version_id` 规范
1066 - `pgvector` 数据模型与入库流程
1067 - 当前引用的仓库内实现锚点:
1068 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
1069 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
1070
1071 结论:
1072 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
1073 - 新 session 与后续数据工程实现可直接按该文档落地
1074
913 ### Stage: 真实评测到发布产物链路打通 1075 ### Stage: 真实评测到发布产物链路打通
914 1076
915 完成项: 1077 完成项:
...@@ -928,6 +1090,33 @@ ...@@ -928,6 +1090,33 @@
928 1090
929 ## 2026-06-02 1091 ## 2026-06-02
930 1092
1093 ### Stage: 训练数据与 pgvector 专项说明补强
1094
1095 完成项:
1096 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
1097 - 单独详细说明:
1098 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
1099 - reference 与 query 的角色区分
1100 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
1101 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
1102 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
1103
1104 验证结果:
1105 - 已校验文档内新增相对链接全部可达
1106 - 文档已覆盖:
1107 - 输入格式
1108 - 切片时长建议
1109 - label 设计
1110 - `song_id/version_id` 规范
1111 - `pgvector` 数据模型与入库流程
1112 - 当前引用的仓库内实现锚点:
1113 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
1114 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
1115
1116 结论:
1117 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
1118 - 新 session 与后续数据工程实现可直接按该文档落地
1119
931 ### Stage: 外部数据集 bootstrap + hard-case 过采样试验 1120 ### Stage: 外部数据集 bootstrap + hard-case 过采样试验
932 1121
933 完成项: 1122 完成项:
...@@ -951,6 +1140,33 @@ ...@@ -951,6 +1140,33 @@
951 1140
952 ## 2026-06-02 1141 ## 2026-06-02
953 1142
1143 ### Stage: 训练数据与 pgvector 专项说明补强
1144
1145 完成项:
1146 - 重写并补强 [docs/training-data-and-pgvector-guide.md](./training-data-and-pgvector-guide.md)
1147 - 单独详细说明:
1148 - 当前训练输入应由音频资产 + `song_id` 标签 + manifest 组成
1149 - reference 与 query 的角色区分
1150 - BGM / 手机录音 / 环境录音 / 直播录屏如何转成训练样本
1151 - 面向 PostgreSQL + `pgvector` 的字段保留与入库分层
1152 - 将该专项文档挂接到 [docs/README.md](./README.md) 的“数据与评测”主入口
1153
1154 验证结果:
1155 - 已校验文档内新增相对链接全部可达
1156 - 文档已覆盖:
1157 - 输入格式
1158 - 切片时长建议
1159 - label 设计
1160 - `song_id/version_id` 规范
1161 - `pgvector` 数据模型与入库流程
1162 - 当前引用的仓库内实现锚点:
1163 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
1164 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
1165
1166 结论:
1167 - 现在“训练数据应该长什么样”“BGM/录音如何转训练集”“未来如何接 pgvector”已经有单独成体系文档
1168 - 新 session 与后续数据工程实现可直接按该文档落地
1169
954 ### Stage: MTG-Jamendo / ModelScope bootstrap + type-aware hard-case weighting 1170 ### Stage: MTG-Jamendo / ModelScope bootstrap + type-aware hard-case weighting
955 1171
956 完成项: 1172 完成项:
......
...@@ -60,6 +60,7 @@ flowchart TD ...@@ -60,6 +60,7 @@ flowchart TD
60 ### B. 数据与评测 60 ### B. 数据与评测
61 - [数据规范](./dataset-spec.md) 61 - [数据规范](./dataset-spec.md)
62 - [开放数据工作流](./open-dataset-workflow.md) 62 - [开放数据工作流](./open-dataset-workflow.md)
63 - [训练数据与 pgvector 指南](./training-data-and-pgvector-guide.md)
63 - [数据来源与接入](./dataset-sources-and-licensing.md) 64 - [数据来源与接入](./dataset-sources-and-licensing.md)
64 - [工业评测规范](./industrial-benchmark-spec.md) 65 - [工业评测规范](./industrial-benchmark-spec.md)
65 66
......
1 # Training Data, Input Format, and pgvector Guide / 训练数据、输入格式与 pgvector 指南 1 # Training Data, Input Format, and pgvector Guide / 训练数据、输入格式与 pgvector 指南
2 2
3 > 更新:2026-06-02 3 > 更新:2026-06-02
4 > 关联文档:[数据规范](./dataset-spec.md) · [开放数据工作流](./open-dataset-workflow.md) · [数据来源与接入](./dataset-sources-and-licensing.md) · [服务接口](./service-api.md)
4 5
5 ## 一页结论 6 ## 一页结论
6 7
7 如果后面要把这个 ACR 项目做成稳定可持续的数据工程,建议把数据分成 4 层 8 你这次问的两个核心问题,可以先压缩成一句话
8 9
9 1. **原始音频层**:BGM、歌曲母带、录音、直播切片、手机录音 10 1. **当前训练输入的最小单位是“带 `song_id` 标签的音频片段 + reference 全曲/长片段 + manifest”**,不是只扔一堆音频文件进去。
10 2. **标准音频资产层**:统一采样率、声道、文件命名后的可训练音频 11 2. **如果后面要接入 `pgvector`,应先把音频转成标准资产和 manifest,再从 manifest 生成 embedding 与结构化元数据,不要直接把原始音频塞进数据库。**
11 3. **manifest 层**`catalog.json` / `train.json` / `test.json` / `val.json`
12 4. **向量索引层**:embedding、metadata、pgvector/ANN 检索库
13
14 当前项目真正训练时吃进去的,不是“任意音频文件夹”,而是:
15
16 - 音频文件
17 - 配套 manifest
18 - `song_id` 级别标签
19 - query/reference 角色划分
20
21 如果未来要接 `pgvector`,推荐做法不是直接把原始音频塞进数据库,而是:
22
23 - 音频留文件系统/对象存储
24 - metadata 落 PostgreSQL
25 - embedding 向量落 `pgvector`
26 - `song_id` / `segment_id` / `type` / `offset` 做结构化列
27 12
28 --- 13 ---
29 14
30 ## 1. 分层结构图 15 ## 1. 总体结构图
31 16
32 ```mermaid 17 ```mermaid
33 flowchart LR 18 flowchart LR
34 A[原始 BGM / 录音 / 歌曲] --> B[标准化音频资产] 19 A[原始素材\nBGM / 歌曲 / 录音] --> B[标准化音频资产\n16k / mono / wav优先]
35 B --> C[Reference Catalog] 20 B --> C[Reference 全曲/长片段]
36 B --> D[Query Segments] 21 B --> D[Query 短片段\n5s / 8s]
37 C --> E[Manifest JSON] 22 C --> E[Manifest\ncatalog/train/val/test]
38 D --> E 23 D --> E
39 E --> F[训练 / 评测] 24 E --> F[训练 / 评测 / 建索引]
40 C --> G[Embedding / Fingerprint 索引] 25 F --> G[Embedding / Fingerprint]
41 G --> H[pgvector / 检索服务] 26 G --> H[PostgreSQL + pgvector]
42 ``` 27 ```
43 28
44 --- 29 ---
45 30
46 ## 2. 当前代码实际接受什么数据 31 ## 2. 先回答你的问题 1:当前训练数据和输入数据应该是什么格式
47 32
48 ### 2.1 音频层要求 33 ## 2.1 当前项目真正需要的输入,不只是音频文件
49 34
50 从当前代码看,核心读取逻辑是 35 当前项目训练/评测链路需要 3 类输入
51 36
52 - `librosa.load(..., sr=16000, mono=True)` 37 | 层 | 现在需要什么 | 作用 |
53 - 默认训练片段长度:`5s` 38 |---|---|---|
54 - 外部数据 query 推荐长度:`8s` 39 | 音频资产层 | `.wav/.mp3/.flac/.ogg` | 真正被读取和切片的内容 |
55 - 频谱输入:Mel spectrogram 40 | 标注层 | `song_id``type``offset` 等 | 告诉系统“这是谁、是什么角色” |
56 - 当前文档目标输入层:**128 Mel** 41 | manifest 层 | `catalog.json` / `train.json` / `test.json` / `val.json` | 驱动训练、建库、评测 |
57 42
58 所以推荐原始资产先标准化为 43 也就是说,**最小可训练单元**不是“一个文件”,而是
59 44
60 | 项目 | 推荐值 | 说明 | 45 - 一个音频文件路径 `audio_path`
61 |---|---|---| 46 - 一个主标签 `song_id`
62 | 文件类型 | `.wav` / `.mp3` / `.flac` / `.ogg` | 当前转换工具支持这些后缀 | 47 - 一个角色标签 `type`
63 | 采样率 | `16k` | 训练/评测读取时会统一到 16k | 48 - 一个时长 `duration`
64 | 声道 | mono | 当前 pipeline 按 mono 读取 | 49 - 如为 query,通常还应有 `offset`
65 | reference 时长 | 尽量完整曲目 | 用于建索引 | 50
66 | query 时长 | `5s``8s` | 训练常用 5s,开放数据切 query 常用 8s | 51 ---
67 52
68 ### 2.2 manifest 层要求 53 ## 2.2 当前代码侧的默认音频读取约束
69 54
70 当前项目的实际关键字段 55 从当前仓库实现看,数据读取是按以下原则处理的
71 56
72 | 字段 | 必需 | 用途 | 57 | 项目 | 当前推荐值 | 说明 |
73 |---|---|---| 58 |---|---|---|
74 | `song_id` | 是 | 主标签,同一首歌所有 query/reference 共享 | 59 | 采样率 | `16000 Hz` | 读取时会统一到 16k |
75 | `audio_path` | 是 | 音频相对路径 | 60 | 声道 | `mono` | 当前管线按单声道处理 |
76 | `duration` | 是 | 时长,控制切片与合法性 | 61 | query 长度 | `5s``8s` | 训练常用 5s,开放数据 smoke 常用 8s |
77 | `type` | 是 | `reference` / `clean` / `augmented` / `confused` / `humming_like` | 62 | reference 长度 | 尽量完整曲目 | 用于建 reference 索引 |
78 | `offset` | 建议 | query 在原曲中的起始偏移 | 63 | 频谱输入 | `128 维 Mel 频谱` | 你要求从 40 维 MFCC 切到音乐任务更合适的 128 Mel |
79 | `segment_type` | 建议 | `intro` / `mid` / `outro` / `external_query` | 64
80 | `source_dataset` | 建议 | 数据来源标记 | 65 ### 推荐的标准化目标
66
67 ```text
68 容器格式:WAV 优先(也可 MP3/FLAC/Ogg)
69 采样率:16k
70 声道:mono
71 响度:建议归一化到稳定区间
72 切片长度:5s / 8s
73 ```
81 74
82 --- 75 ---
83 76
84 ## 3. 训练数据到底应该长什么样 77 ## 2.3 训练数据中的两种核心角色
85 78
86 ## 3.1 Reference 数据 79 ### A. Reference
87 80
88 Reference 表示“曲库真身”,用于建索引 81 Reference 是“曲库真身”,用于建索引、被检索、被匹配
89 82
90 示例: 83 示例:
91 84
...@@ -102,14 +95,12 @@ Reference 表示“曲库真身”,用于建索引。 ...@@ -102,14 +95,12 @@ Reference 表示“曲库真身”,用于建索引。
102 要求: 95 要求:
103 96
104 - 一首歌至少 1 条 reference 97 - 一首歌至少 1 条 reference
105 - reference 通常是整首歌或较长主版本 98 - 最好是完整曲目或较长主版本
106 - 不建议把噪音重、混响重、环境录音直接当 reference 主资产 99 - 不建议把手机录音、环境录音直接当主 reference
107
108 ---
109 100
110 ## 3.2 Query 数据 101 ### B. Query
111 102
112 Query 表示“我要识别的输入样本” 103 Query 是“未来线上用户会扔给你的东西”,用于训练和评测识别能力
113 104
114 示例: 105 示例:
115 106
...@@ -125,459 +116,475 @@ Query 表示“我要识别的输入样本”。 ...@@ -125,459 +116,475 @@ Query 表示“我要识别的输入样本”。
125 } 116 }
126 ``` 117 ```
127 118
128 Query 的内容应该是: 119 要求:
129
130 - 原曲中的 5s/8s 切片
131 - 或人工合成退化片段
132 - 或真实世界录音片段
133
134 ### Query 常见类型
135 120
136 | type | 含义 | 适合来源 | 121 - 来自对应 `song_id` 的 reference 曲目
137 |---|---|---| 122 - 时长稳定
138 | `clean` | 原曲直接切片 | 标准训练/评测主力 | 123 - offset 可追溯
139 | `augmented` | 加噪、混响、压缩、EQ 后的切片 | 提升鲁棒性 | 124 - query/reference 使用同一个 `song_id`
140 | `confused` | 与其他音乐更相似、容易误判的片段 | 难例强化 |
141 | `humming_like` | 旋律近似、弱配器、手机录音风格 | 旋律/哼唱类近似查询 |
142 125
143 --- 126 ---
144 127
145 ## 4. 如果我们有 BGM、音乐录音,怎么转成训练数据 128 ## 2.4 Query 里具体应该是什么内容
146 129
147 ## 4.1 场景 A:你有一批“标准 BGM 母带/成品曲目” 130 ### 推荐内容类型
148 131
149 这是最容易的情况。 132 | type | 内容 | 用途 |
150 133 |---|---|---|
151 ### 推荐做法 134 | `clean` | 原曲直接切片 | 基础训练/评测 |
152 135 | `augmented` | 加噪、混响、压缩、EQ 后切片 | 提升鲁棒性 |
153 1. 每首完整 BGM 作为 `reference` 136 | `confused` | 容易与别的歌混淆的难例片段 | 拉开区分度 |
154 2. 从同一首 BGM 中随机切出多个 query 片段 137 | `humming_like` | 旋律近似、配器弱、手机录音风格片段 | 强化近旋律检索 |
155 3. 给这些片段打上同一个 `song_id` 138 | `reference` | 全曲或长片段 | 建库索引 |
156 4. query 再按用途分到 `train/test/val`
157 139
158 ### 结果结构 140 ### 不推荐直接混进训练主集的内容
159 141
160 ```mermaid 142 - 完全未知来源、无法映射 `song_id` 的录音
161 flowchart TD 143 - 严重截断、纯噪声、无有效音乐主体的片段
162 A[完整 BGM] --> B[reference] 144 - 多首歌混在一起、没有主目标标签的片段
163 A --> C1[query 1]
164 A --> C2[query 2]
165 A --> C3[query 3]
166 C1 --> D[train/test]
167 C2 --> D
168 C3 --> D
169 ```
170 145
171 ### 关键点 146 这些更适合先放到:
172 147
173 - `song_id` 必须稳定 148 - 待清洗池
174 - 曲目版本要分清:主版本、纯伴奏版、短版、重编版不要误当同一首 149 - 难例池
175 - 如果版本差异大,建议拆成不同 `song_id` 150 - 线上回流池
176 151
177 --- 152 ---
178 153
179 ## 4.2 场景 B:你有“手机录音/环境录音/直播录屏” 154 ## 2.5 manifest 应该长什么样
180 155
181 这类数据不应直接全部当 reference 主资产,而更适合作为 query 或 hard-case 样本。 156 ### 最低字段要求
182 157
183 ### 推荐角色 158 | 字段 | 必需 | 说明 |
159 |---|---|---|
160 | `song_id` | 是 | 同一首歌的统一主标签 |
161 | `audio_path` | 是 | 相对路径,建议相对 manifest 根 |
162 | `duration` | 是 | 秒数 |
163 | `type` | 是 | `reference/clean/augmented/confused/...` |
164 | `offset` | query 建议有 | query 在 reference 中的起始位置 |
165 | `segment_type` | 建议 | `intro/mid/outro/external_query` |
166 | `source_dataset` | 建议 | 数据来源,例如 `fma_small` |
184 167
185 | 资产 | 角色 | 168 ### 当前项目 manifest 文件
169
170 | 文件 | 含义 |
186 |---|---| 171 |---|---|
187 | 清晰母带 / 官方音源 | reference | 172 | `catalog.json` | 全部样本总表,尤其包含 reference |
188 | 手机录音 / 环境录音 | query | 173 | `train.json` | 训练 query 样本 |
189 | 直播采集片段 | query | 174 | `val.json` | 验证集 query 样本 |
190 | 背景噪声下的短片段 | query | 175 | `test.json` | 测试集 query 样本 |
191 176
192 ### 标注建议 177 ---
193 178
194 如果录音可以明确对应某首 reference: 179 ## 3. 如果后面要保存到 pgvector,现在应该怎么处理
195 180
196 ```json 181 ## 3.1 正确分层
197 {
198 "song_id": "song_0001",
199 "audio_path": "queries/phone/song_0001_live_01.wav",
200 "duration": 5.0,
201 "type": "augmented",
202 "segment_type": "external_query",
203 "source_dataset": "phone_recording"
204 }
205 ```
206 182
207 如果录音非常嘈杂、很接近旋律轮廓但音色严重失真: 183 **不要**
184 - 原始音频直接进 PostgreSQL 大表
185 - 训练前再从数据库反向拼装所有资产
208 186
209 - 可标 `type=humming_like` 187 **推荐**
210 - 或单独增加你们自己的扩展类型,如 `field_recording`
211 188
212 但要注意: 189 | 内容 | 存储位置 |
213 - 训练前最好先映射回当前系统已有类型,避免代码完全不认识 190 |---|---|
191 | 原始音频 / 标准音频 | 文件系统 / NAS / 对象存储 |
192 | manifest / 结构化元数据 | PostgreSQL 普通表 |
193 | 向量 embedding | `pgvector` 列 |
194 | 检索索引参数 | PostgreSQL 索引 / 服务配置 |
214 195
215 --- 196 ---
216 197
217 ## 4.3 场景 C:你只有一堆音频文件夹,还没做精标注 198 ## 3.2 pgvector 推荐数据模型
199
200 ```mermaid
201 flowchart TD
202 A[songs] --> B[references]
203 A --> C[segments]
204 B --> D[reference_embeddings]
205 C --> E[query_embeddings]
206 ```
218 207
219 先做“弱监督标准化”比不做强。 208 当前仓库已经有对应模板:
220 209
221 ### 最低可行办法 210 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
211 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
212 - [acr-engine/scripts/pgvector_bulk_load_template.py](../acr-engine/scripts/pgvector_bulk_load_template.py)
222 213
223 - 一首文件 = 一个 `song_id` 214 ### 表职责说明
224 - 整首文件 = `reference`
225 - 从整首里随机切 query = `clean`
226 - 后续再人工修正错标/重名/版本冲突
227 215
228 这也是当前: 216 | 表 | 存什么 |
217 |---|---|
218 | `songs` | 歌曲主实体 |
219 | `references` | reference 音频资产 |
220 | `segments` | query 片段 |
221 | `reference_embeddings` | reference 的 embedding |
222 | `query_embeddings` | query 的 embedding |
229 223
230 - `manifest_tools.py audio-dir-to-splits` 224 ---
231 - `external_adapters.py prepare-local`
232 225
233 在做的事情。 226 ## 3.3 现在就应该为 pgvector 预留的字段
234 227
235 ### 适用场景 228 如果你们后面一定要落 PostgreSQL,建议从今天开始在 manifest / 数据处理中保留这些字段:
236 229
237 - FMA 230 | 字段 | 作用 |
238 - MTG-Jamendo 231 |---|---|
239 - 你本地一批 BGM 文件夹 232 | `song_id` | 主连接键 |
240 - 一批已知 song-level 但未做 segment 级标注的数据 233 | `version_id` | 处理多版本/改编/短版 |
234 | `audio_path` / `audio_uri` | 回溯原始资产 |
235 | `duration` | 切片合法性校验 |
236 | `offset` | query 对应 reference 位置 |
237 | `type` | 训练角色 / 查询角色 |
238 | `segment_type` | intro/mid/outro/external |
239 | `source_dataset` | 数据来源治理 |
240 | `license` | 商业化合规 |
241 | `split` | train/val/test |
242 | `model_version` | 向量版本控制 |
243 | `data_version` | 数据快照版本 |
244
245 ### 最重要的原则
246
247 > `song_id` 要稳定,`version_id` 要可扩展,`audio_uri` 要可回溯,`model_version/data_version` 要可审计。
241 248
242 --- 249 ---
243 250
244 ## 5. label 应该怎么设计 251 ## 3.4 一个推荐的数据库入库流程
245 252
246 ## 5.1 主标签:`song_id` 253 ```mermaid
254 flowchart LR
255 A[音频目录] --> B[prepare-local]
256 B --> C[manifests]
257 C --> D[导出 pgvector JSON]
258 D --> E[批量导入 PostgreSQL]
259 E --> F[计算 embedding]
260 F --> G[写入 pgvector]
261 ```
247 262
248 这是最重要的标签。 263 推荐执行顺序:
249 264
250 同一首歌的: 265 1. 音频标准化
266 2. 生成 manifest
267 3. 用 manifest 导出结构化 JSON
268 4. 导入 PostgreSQL 元数据表
269 5. 批量计算 embedding
270 6. 写入 `pgvector`
271 7. 建 ANN 索引
251 272
252 - reference 273 ---
253 - clean query
254 - 手机录音 query
255 - 混响/噪声 query
256 274
257 都应该共享同一个 `song_id` 275 ## 4. 再回答你的问题 2:BGM、音乐录音怎么转成训练数据
258 276
259 ### 推荐命名 277 ## 4.1 场景 A:你有标准 BGM / 母带 / 完整成品
260 278
261 | 场景 | 推荐形式 | 279 这是最适合做训练主集的情况。
262 |---|---|
263 | 内部 BGM | `bgm_000001` |
264 | 商业曲库 | `catalog_000001` |
265 | 开源数据 | `fma_012345` |
266 | 多版本项目 | `song_0001_vocal` / `song_0001_inst` |
267 280
268 --- 281 ### 转化规则
269 282
270 ## 5.2 辅助标签 283 | 输入资产 | 转成什么 |
284 |---|---|
285 | 完整曲目 | `reference` |
286 | 从完整曲目切的 5s/8s 片段 | `clean` query |
287 | 加噪/压缩/混响后的派生片段 | `augmented` query |
288 | 易混淆段落 | `confused` query |
271 289
272 建议额外保留: 290 ### 最小流程
273 291
274 | 字段 | 作用 | 292 ```mermaid
275 |---|---| 293 flowchart TD
276 | `version_id` | 区分原版 / 伴奏版 / 重编版 | 294 A[完整 BGM] --> B[标准化]
277 | `segment_type` | 区分 intro / mid / outro | 295 B --> C[reference]
278 | `recording_type` | 区分 studio / phone / live / screen_capture | 296 B --> D[切 query 片段]
279 | `noise_level` | 区分 clean / mild / heavy | 297 D --> E[clean]
280 | `source_dataset` | 保留来源审计 | 298 D --> F[augmented]
299 D --> G[confused]
300 C --> H[manifest]
301 E --> H
302 F --> H
303 G --> H
304 ```
281 305
282 当前代码最少已经建议保留: 306 ### 标注原则
283 307
284 - `type` 308 - 一首歌一个稳定 `song_id`
285 - `offset` 309 - query 与 reference 共用这个 `song_id`
286 - `segment_type` 310 - 不同重编版不要强行共用同一个 `song_id`
287 - `source_dataset` 311 - 如果是“同一歌不同版本”,建议:
312 - `song_id=主作品ID`
313 - `version_id=具体版本ID`
288 314
289 --- 315 ---
290 316
291 ## 6. 如果以后接 pgvector,当前应该怎么处理 317 ## 4.2 场景 B:你有手机录音、环境录音、直播录屏
292 318
293 ## 6.1 不要直接把原始音频塞进 pgvector 319 这类数据通常更适合作为 **query / hard case**,不适合作为主 reference。
294 320
295 推荐分工: 321 ### 推荐映射
296 322
297 | 层 | 存放位置 | 323 | 原始录音类型 | 建议角色 |
298 |---|---| 324 |---|---|
299 | 原始音频文件 | 对象存储 / 文件系统 | 325 | 手机外放录音 | `augmented``external_query` |
300 | manifest / metadata | PostgreSQL 普通表 | 326 | 环境采集 | `augmented` |
301 | embedding 向量 | `pgvector` | 327 | 直播录屏截取 | `external_query` |
302 | 音频指纹 | PostgreSQL JSON / 独立索引 / 文件 | 328 | 强失真但可识别旋律 | `humming_like` |
303 329
304 --- 330 ### 转化步骤
305 331
306 ## 6.2 推荐表结构 332 1. 先找到它对应哪首 reference
333 2. 确认主要目标曲目是否单一
334 3. 裁成 5s / 8s 片段
335 4. 写入同一个 `song_id`
336 5.`type=augmented / humming_like / confused`
337 6.`segment_type=external_query`
307 338
308 ```mermaid 339 示例:
309 flowchart TD 340
310 A[songs] --> B[segments] 341 ```json
311 A --> C[references] 342 {
312 C --> D[reference_embeddings] 343 "song_id": "song_0001",
313 B --> E[query_embeddings] 344 "audio_path": "queries/phone/song_0001_live_01.wav",
345 "duration": 8.0,
346 "type": "augmented",
347 "segment_type": "external_query",
348 "source_dataset": "phone_recording"
349 }
314 ``` 350 ```
315 351
316 ### songs 352 ---
317 353
318 | 列 | 说明 | 354 ## 4.3 场景 C:你只有一堆历史文件夹,还没有精标注
319 |---|---|
320 | `song_id` | 主键/唯一业务键 |
321 | `title` | 曲名 |
322 | `artist` | 作者/演出者 |
323 | `version_id` | 版本标识 |
324 | `source_dataset` | 来源 |
325 | `license` | 许可证 |
326 355
327 ### references 356 这种情况建议先做 **弱监督标准化**,不要卡死在一开始就完美标注。
328 357
329 | 列 | 说明 | 358 ### 先做 3 步
330 |---|---|
331 | `reference_id` | 主键 |
332 | `song_id` | 外键 |
333 | `audio_uri` | 文件路径/对象存储地址 |
334 | `duration_sec` | 时长 |
335 | `sample_rate` | 采样率 |
336 359
337 ### segments 360 1. **按文件夹/文件名生成候选 `song_id`**
361 2. **把完整长音频先当候选 reference**
362 3. **自动切若干 query 片段,后续再人工抽检修订**
338 363
339 | 列 | 说明 | 364 ### 推荐策略
340 |---|---| 365
341 | `segment_id` | 主键 | 366 | 阶段 | 做法 |
342 | `song_id` | 外键 |
343 | `audio_uri` | query 文件路径 |
344 | `offset_sec` | 起始偏移 |
345 | `duration_sec` | 片段长度 |
346 | `type` | clean/augmented/confused/humming_like |
347 | `segment_type` | intro/mid/outro/external_query |
348 | `split` | train/test/val |
349
350 ### reference_embeddings / query_embeddings
351
352 | 列 | 说明 |
353 |---|---| 367 |---|---|
354 | `id` | 主键 | 368 | 第 1 阶段 | 先把数据“可训练化” |
355 | `song_id` | 外键 | 369 | 第 2 阶段 | 对高价值样本做人工修标 |
356 | `segment_id` / `reference_id` | 外键 | 370 | 第 3 阶段 | 根据误识别样本补 hard cases |
357 | `embedding` | `vector(n)` |
358 | `model_version` | 模型版本 |
359 | `created_at` | 生成时间 |
360 371
361 --- 372 ---
362 373
363 ## 6.3 pgvector 推荐实践 374 ## 5. 标签应该怎么设计
364 375
365 如果当前 embedding 维度是 192,那么可以设计: 376 ## 5.1 最少标签集
366 377
367 ```sql 378 对于当前项目,建议先保留以下标签层级:
368 embedding vector(192)
369 ```
370
371 ### 推荐额外保留字段
372
373 - `model_version`
374 - `data_version`
375 - `index_version`
376 - `source_dataset`
377 - `type`
378 - `offset_sec`
379 - `segment_type`
380
381 这样以后你能做:
382 379
383 - 按模型版本重建 embedding 380 | 维度 | 字段 | 例子 |
384 - 按数据集来源筛选候选 381 |---|---|---|
385 - 按 query 类型分析误判 382 | 主标签 | `song_id` | `song_0001` |
386 -`segment_type` 做 intro/outro 针对性策略 383 | 版本标签 | `version_id` | `song_0001_mixA` |
384 | 角色标签 | `type` | `reference/clean/augmented/confused` |
385 | 结构标签 | `segment_type` | `intro/mid/outro/external_query` |
386 | 来源标签 | `source_dataset` | `fma_small` / `internal_bgm` |
387 | 合规标签 | `license` | `cc-by` / `internal` |
387 388
388 --- 389 ---
389 390
390 ## 6.4 当前项目要为 pgvector 提前准备什么 391 ## 5.2 什么情况下要拆 label
391
392 现在就该做的,不是先建数据库,而是先保证这些字段规范:
393
394 1. `song_id` 稳定且唯一
395 2. `audio_path` 可追踪
396 3. `type` 明确
397 4. `offset` 可回溯
398 5. `source_dataset` 清晰
399 6. 模型产出的 embedding 可以和 metadata 一一对应
400 392
401 换句话说 393 以下情况建议拆成不同 `song_id``version_id`
402 394
403 > 先把 manifest 设计好,未来接 pgvector 才不会返工。 395 | 情况 | 建议 |
396 |---|---|
397 | 主旋律相同但编曲大改 | 拆 `version_id` |
398 | 纯伴奏版 vs 演唱版差异极大 | 拆 `version_id` |
399 | mashup / 混剪 | 不进主训练集,单独 hard-case |
400 | 两首歌拼接 | 单独标记,避免污染主监督 |
404 401
405 --- 402 ---
406 403
407 ## 7. 推荐的落地目录与数据加工流程 404 ## 6. BGM / 录音转训练集的工业化处理建议
408 405
409 ## 7.1 原始层 406 ## 6.1 推荐目录结构
410 407
411 ```text 408 ```text
412 acr-engine/data/raw/ 409 project/
413 bgm_master/ 410 audio/
414 phone_recordings/ 411 reference/
415 live_captures/ 412 queries/
416 fma_small_audio/ 413 augmented/
414 manifests/
415 catalog.json
416 train.json
417 val.json
418 test.json
417 ``` 419 ```
418 420
419 ## 7.2 标准化层 421 如果走当前仓库现成流程,也可以直接按:
420 422
421 ```text 423 - [acr-engine/data/raw/fma_small_audio/](../acr-engine/data/raw/fma_small_audio/)
422 acr-engine/data/curated/ 424 - [acr-engine/data/raw/mtg_jamendo_audio/](../acr-engine/data/raw/mtg_jamendo_audio/)
423 my_bgm_v1/
424 audio/
425 manifests/
426 ```
427 425
428 ## 7.3 训练/评测层 426 然后通过:
429 427
430 ```text 428 - [开放数据工作流](./open-dataset-workflow.md)
431 catalog.json
432 train.json
433 test.json
434 val.json
435 ```
436 429
437 --- 430 生成标准化输出。
438 431
439 ## 8. 针对你当前项目的推荐操作方式 432 ---
440 433
441 ## 8.1 如果你现在手上有 BGM 434 ## 6.2 推荐的数据处理 checklist
442 435
443 最推荐: 436 | 阶段 | 必做项 |
437 |---|---|
438 | 音频清洗 | 去坏文件、去空文件、统一采样率 |
439 | 资产标准化 | mono、16k、稳定命名 |
440 | reference 建立 | 每首歌至少 1 条 reference |
441 | query 生成 | 每首歌切多个位置片段 |
442 | 标签治理 | `song_id/version_id/type/source_dataset/license` |
443 | 数据拆分 | train/val/test 按歌或按 query 控制泄漏 |
444 | 评测 | 看 top1/topk、混淆矩阵、难例集 |
445 | 入库 | manifest -> JSON -> PostgreSQL/pgvector |
444 446
445 1. 每首完整 BGM 先放入一个目录 447 ---
446 2. 用统一命名整理
447 3. 运行:
448 448
449 ```bash 449 ## 7. 如果将来要把音频内容保存到 pgvector 检索系统,应该怎么转
450 /usr/local/miniconda3/bin/python src/data/external_adapters.py inspect-local fma <你的目录>
451 /usr/local/miniconda3/bin/python src/data/external_adapters.py prepare-local fma <你的目录> --output-root data/external_ingested
452 /usr/local/miniconda3/bin/python src/data/external_adapters.py validate-local fma data/external_ingested/fma/manifests
453 ```
454 450
455 如果只是你自有 BGM,不一定非要叫 `fma`,后面可以再做一个内部 adapter。 451 ## 7.1 不要直接存“音频”,要存“音频的表示”
456 452
457 --- 453 `pgvector` 适合存:
458 454
459 ## 8.2 如果你现在手上有录音/采集片段 455 - embedding 向量
456 - 指纹向量
457 - 结构化 metadata
460 458
461 建议 459 不适合存
462 460
463 - 不要把这批录音直接当 reference 主库 461 - 大体积原始 WAV 本体
464 - 先把它们映射到已有 reference 的 `song_id` 462 - 大批量训练中间缓存
465 - 作为 query / hard-case 数据进入训练或评测
466 463
467 如果当前无法人工全标: 464 ### 建议保存的对象
468 465
469 - 先放到单独目录 466 | 对象 | 是否进 pgvector |
470 - 先做 song-level 或 file-level 对齐 467 |---|---|
471 - 后续逐步补 segment-level 标注 468 | 原始音频文件 | 否 |
469 | 标准化音频路径 | 是,存 URI/Path |
470 | reference embedding | 是 |
471 | query embedding | 可选 |
472 | song metadata | 是,普通表 |
473 | 标签/来源/license | 是,普通表 |
472 474
473 --- 475 ---
474 476
475 ## 9. 一张总表 477 ## 7.2 建议的线上检索链路
476 478
477 | 你手上的数据 | 推荐转化方式 | 在系统里的角色 | 479 ```mermaid
478 |---|---|---| 480 sequenceDiagram
479 | 完整 BGM 母带 | 整首保留 + 随机切 query | reference + clean query | 481 participant U as User Query Audio
480 | 官方歌曲文件 | 整首保留 + 切片 | reference + clean query | 482 participant S as ACR Service
481 | 手机录音 | 对齐到已有 `song_id` | augmented / humming_like query | 483 participant E as Embedder
482 | 直播录屏 | 截出音乐段并对齐 `song_id` | external query | 484 participant P as pgvector
483 | 背景噪声录音 | 作为 hard case | confused / augmented | 485 participant M as Metadata DB
484 | 开源整包数据集 | 先 `inspect-local`/`prepare-local` | baseline train/eval corpus | 486
487 U->>S: 上传5s/8s音频
488 S->>E: 提取128 Mel + embedding
489 E->>P: 向量检索TopK
490 P-->>S: 候选 song_id
491 S->>M: 读取歌曲元数据
492 M-->>S: title/artist/version/license
493 S-->>U: 返回识别结果
494 ```
485 495
486 --- 496 ---
487 497
488 ## 10. 你现在最值得立刻固化的字段 498 ## 8. 你们现在就可以采用的落地规范
489 499
490 如果后面确定要上 `pgvector`,现在最少要保证每条样本都能追踪: 500 ## 8.1 训练样本规范(建议定版)
491 501
492 - `song_id` 502 ### 输入规范
493 - `audio_path`
494 - `duration`
495 - `type`
496 - `offset`
497 - `segment_type`
498 - `source_dataset`
499 - `split`
500 - `model_version`(生成 embedding 时记录)
501 503
502 --- 504 - 单条 query:`5s``8s`
505 - 音乐主体明确
506 - 16k mono
507 - 每条 query 必须映射到一个 `song_id`
503 508
504 ## 11. 推荐文档跳转 509 ### reference 规范
505 510
506 - [dataset-spec.md](./dataset-spec.md) 511 - 每首歌至少一个完整 reference
507 - [open-dataset-workflow.md](./open-dataset-workflow.md) 512 - reference 不用强切成很多碎片保存
508 - [dataset-sources-and-licensing.md](./dataset-sources-and-licensing.md) 513 - 以全曲或长片段为主
509 - [session-handoff.md](./session-handoff.md)
510 514
515 ### 标签规范
511 516
512 ## 12. 可直接落地的 pgvector 模板 517 - `song_id`:稳定主键
518 - `version_id`:可扩展
519 - `type`:固定枚举
520 - `source_dataset`:必保留
521 - `license`:商业化必须保留
513 522
514 仓库里现在已经补了两个可直接参考的模板: 523 ---
515 524
516 - SQL schema: [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql) 525 ## 8.2 面向 pgvector 的规范(建议定版)
517 - manifest 导出桥接脚本: [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
518 526
519 ### 导出示例 527 - manifest 作为唯一数据交换层
528 - 音频在文件系统,对象路径写到 `audio_uri`
529 - embedding 单独表,带 `model_version`
530 - 每次重训后保留 `data_version`
531 - 检索结果必须能追溯到原始 reference
520 532
521 ```bash 533 ---
522 cd acr-engine
523 /usr/local/miniconda3/bin/python scripts/export_manifest_to_pgvector_json.py \
524 --data data/synthetic_v2 \
525 --split test \
526 --source-dataset synthetic_v2 \
527 --output reports/pgvector_manifest_export_test.json
528 ```
529 534
530 ### 当前已验证结果 535 ## 9. 推荐执行路径
531 536
532 - `songs=24` 537 如果你们后面要把 BGM、录音、开放数据一起纳入训练,我建议按这个顺序推进:
533 - `references=24`
534 - `segments=20`
535 538
536 这一步还不会直接写 PostgreSQL,作用是: 539 1. 先把所有音频资产标准化为 `16k mono`
540 2. 给每首歌建立稳定 `song_id`
541 3. 完整曲目作为 reference
542 4. 自动切 5s/8s query
543 5. 增加 `augmented/confused/humming_like` 难例
544 6. 生成 manifests
545 7. 跑训练 / 评测 / 建索引
546 8. 从 manifest 导出 pgvector JSON
547 9. 再接 PostgreSQL + pgvector
537 548
538 1. 先把项目现有 manifest 规范转换成 pgvector-friendly 结构化 JSON 549 ---
539 2. 后续你们可以再用 bulk insert / COPY / ETL 把这些行落到 PostgreSQL
540 3. embedding 生成后再写入 `vector(192)`
541 550
551 ## 10. 直接给你的结论
542 552
543 ### Bulk load plan 模板 553 ### 问题 1:当前训练数据和输入数据应该是什么样
544 554
545 仓库里现在还新增了 555 答案
546 556
547 - [acr-engine/scripts/pgvector_bulk_load_template.py](../acr-engine/scripts/pgvector_bulk_load_template.py) 557 - **输入不是单纯音频文件夹,而是“音频 + `song_id` 标签 + manifest”**
558 - **reference 是完整曲目或长片段,query 是 5s/8s 片段**
559 - **当前推荐统一成 16k mono,输入层采用 128 维 Mel 频谱**
560 - **如果未来要接 pgvector,现在就要保留 `song_id/version_id/audio_uri/source_dataset/license/model_version/data_version` 这些字段**
548 561
549 它会把前一步导出的 manifest-friendly JSON,进一步整理成: 562 ### 问题 2:BGM、音乐录音怎么转成训练数据
550 563
551 - SQL 语句模板 564 答案:
552 - songs / references / segments 行数据
553 - 导入顺序说明
554 565
555 示例: 566 - **完整 BGM/母带 -> reference**
556 567 - **从 reference 切 5s/8s -> clean query**
557 ```bash 568 - **加噪/混响/压缩 -> augmented query**
558 cd acr-engine 569 - **手机录音/环境录音/直播录屏 -> external query / hard case**
559 /usr/local/miniconda3/bin/python scripts/pgvector_bulk_load_template.py \ 570 - **所有派生片段都必须回挂到统一 `song_id`**
560 --input reports/pgvector_manifest_export_test.json \
561 --output reports/pgvector_bulk_load_plan_test.json
562 ```
563 571
564 当前已验证结果: 572 ---
565 573
566 - `songs=24` 574 ## 11. 相关仓库内工具
567 - `references=24`
568 - `segments=20`
569 575
570 这样后续如果你们接真实 PostgreSQL,可以分三步走: 576 ### 文档
577 - [数据规范](./dataset-spec.md)
578 - [开放数据工作流](./open-dataset-workflow.md)
579 - [数据来源与接入](./dataset-sources-and-licensing.md)
571 580
572 1. manifest -> pgvector-friendly JSON 581 ### 脚本 / SQL
573 2. JSON -> bulk load plan 582 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
574 3. bulk load plan -> PostgreSQL / pgvector 实际写入 583 - [acr-engine/scripts/pgvector_bulk_load_template.py](../acr-engine/scripts/pgvector_bulk_load_template.py)
584 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
575 585
576 ## Sources 586 ## Sources
577 587 - This guide is grounded in the current repo’s manifest pipeline and pgvector schema templates:
578 - Current code behavior from: 588 - [acr-engine/scripts/export_manifest_to_pgvector_json.py](../acr-engine/scripts/export_manifest_to_pgvector_json.py)
579 - [acr-engine/src/data/dataset.py](../acr-engine/src/data/dataset.py) 589 - [acr-engine/sql/pgvector_schema.sql](../acr-engine/sql/pgvector_schema.sql)
580 - [acr-engine/src/data/manifest_tools.py](../acr-engine/src/data/manifest_tools.py) 590 - [数据规范](./dataset-spec.md)
581 - Existing project docs:
582 - [dataset-spec.md](./dataset-spec.md)
583 - [open-dataset-workflow.md](./open-dataset-workflow.md)
......