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.
Showing
3 changed files
with
605 additions
and
381 deletions
| ... | @@ -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) | ... | ... |
-
Please register or sign in to post a comment