Commit 1b812bea 1b812bea5acc67d01bba4452f2bbb1a6f45cbabd by cnb.bofCdSsphPA

Connect real evaluation outputs to release artifacts

Make the benchmark pipeline produce reusable release artifacts from actual evaluation results so model iterations can be tracked, reviewed, and shipped with evidence.

Constraint: Continuous training only helps if each stage emits durable reports and release metadata
Rejected: Keep artifact generation as a disconnected smoke utility | would block repeatable release discipline
Confidence: high
Scope-risk: moderate
Directive: Next iterations should improve hard-case metrics on real/whitelisted datasets and keep artifact generation on every training milestone
Tested: synthetic_v2 data regeneration; 2-epoch CPU training; index build; fast evaluation JSON export; artifact generation to reports/smoke-v2/synthetic_v2
Not-tested: full melody-aware slow evaluation as release default; real external dataset benchmark generation
1 parent dc00d026
Showing 173 changed files with 1827 additions and 4 deletions
{
"generated_at": "2026-06-02T03:59:45Z",
"model_version": "smoke-v1",
"data_version": "synthetic_v2",
"files": {
"benchmark_report": "data/artifact_smoke/benchmark-report.md",
"model_card": "data/artifact_smoke/model-card.md",
"release_checklist": "data/artifact_smoke/release-checklist.md"
}
}
\ No newline at end of file
# Benchmark Report
## 一页结论
- 模型版本:smoke-v1
- 数据版本:synthetic_v2
- 核心结论:top1=0.65 top5=0.95
- 是否通过上线门禁:TBD
## 1. 评测范围图
```mermaid
flowchart LR
A[smoke-v1] --> B[synthetic_v2]
A --> C[Scenario Buckets]
A --> D[Latency / Ops]
```
## 2. 指标表
| Bucket | top1 | top5 | MRR | FAR | Notes |
|---|---:|---:|---:|---:|---|
| clean | 1.0 | 1.0 | | | |
| humming_like | 0.25 | 0.75 | | | |
| confused | 0.25 | 1.0 | | | |
## 3. 文字分析
- 最强项:clean/augmented buckets if present
- 最弱项:see hard-case summary
- 与上一版本对比:TBD
## 4. 细节附录
- 原始 JSON 报告:embedded source
## Sources
- docs/industrial-benchmark-spec.md
# Model Card
## 一页结论
- 模型名称:ACR Hybrid Encoder
- 版本:smoke-v1
- 适用场景:music ACR prototype / retrieval
- 不适用场景:未经白名单数据验证的生产商用全量上线
## 1. 模型结构图
```mermaid
flowchart LR
A[Input Audio] --> B[128 Mel + BandSplit]
B --> C[Encoder]
C --> D[Embedding]
D --> E[Hybrid Retrieval]
```
## 2. 关键信息表
| 项 | 内容 |
|---|---|
| embed_dim | 192 |
| channels | 512 |
| n_mels | 128 |
| use_band_split | True |
| benchmark report | data/artifact_smoke/benchmark-report.md |
## 3. 文字说明
- 训练方式:retrieval-oriented pair training
- 模型限制:hard-case accuracy still evolving
- 风险提示:requires whitelist-reviewed datasets for commercial deployment
## 4. 细节附录
- config embedded from source JSON
## Sources
- docs/dataset-spec.md
- docs/benchmark-report-template.md
# Release Checklist
## 一页结论
发布前必须同时满足:质量通过、合规通过、服务通过、文档齐全。
## 1. 发布门禁图
```mermaid
flowchart TD
A[smoke-v1] --> B[Benchmark Pass]
A --> C[License Review Pass]
A --> D[Service Smoke Pass]
A --> E[Docs Complete]
```
## 2. Checklist 表
| 项目 | 状态 |
|---|---|
| benchmark report 已生成 | yes |
| model card 已生成 | yes |
| license registry 已更新 | pending |
| service smoke test 通过 | yes |
| dataset whitelist 已确认 | pending |
| changelog 已更新 | pending |
## 3. 文字说明
- 当前用于工程治理与预发布检查,不代表已满足商用法律门槛。
## 4. 细节附录
- benchmark 报告路径:data/artifact_smoke/benchmark-report.md
- model card 路径:data/artifact_smoke/model-card.md
## Sources
- docs/dataset-sources-and-licensing.md
- docs/industrial-benchmark-spec.md
No preview for this file type
No preview for this file type
No preview for this file type
This file is too large to display.
{
"song_0000": 0,
"song_0001": 1,
"song_0002": 2,
"song_0003": 3,
"song_0004": 4,
"song_0005": 5,
"song_0006": 6,
"song_0007": 7,
"song_0008": 8,
"song_0009": 9,
"song_0010": 10,
"song_0011": 11,
"song_0012": 12,
"song_0013": 13,
"song_0014": 14,
"song_0015": 15
}
\ No newline at end of file
[
{
"song_id": "song_0000",
"audio_path": "songs/song_0000.wav",
"duration": 15.0,
"base_freq": 130.81,
"type": "reference"
},
{
"song_id": "song_0001",
"audio_path": "songs/song_0001.wav",
"duration": 15.0,
"base_freq": 146.83,
"type": "reference"
},
{
"song_id": "song_0002",
"audio_path": "songs/song_0002.wav",
"duration": 15.0,
"base_freq": 164.81,
"type": "reference"
},
{
"song_id": "song_0003",
"audio_path": "songs/song_0003.wav",
"duration": 15.0,
"base_freq": 174.61,
"type": "reference"
},
{
"song_id": "song_0004",
"audio_path": "songs/song_0004.wav",
"duration": 15.0,
"base_freq": 196.0,
"type": "reference"
},
{
"song_id": "song_0005",
"audio_path": "songs/song_0005.wav",
"duration": 15.0,
"base_freq": 220.0,
"type": "reference"
},
{
"song_id": "song_0006",
"audio_path": "songs/song_0006.wav",
"duration": 15.0,
"base_freq": 246.94,
"type": "reference"
},
{
"song_id": "song_0007",
"audio_path": "songs/song_0007.wav",
"duration": 15.0,
"base_freq": 261.63,
"type": "reference"
},
{
"song_id": "song_0008",
"audio_path": "songs/song_0008.wav",
"duration": 15.0,
"base_freq": 293.66,
"type": "reference"
},
{
"song_id": "song_0009",
"audio_path": "songs/song_0009.wav",
"duration": 15.0,
"base_freq": 329.63,
"type": "reference"
},
{
"song_id": "song_0010",
"audio_path": "songs/song_0010.wav",
"duration": 15.0,
"base_freq": 349.23,
"type": "reference"
},
{
"song_id": "song_0011",
"audio_path": "songs/song_0011.wav",
"duration": 15.0,
"base_freq": 392.0,
"type": "reference"
},
{
"song_id": "song_0012",
"audio_path": "songs/song_0012.wav",
"duration": 15.0,
"base_freq": 440.0,
"type": "reference"
},
{
"song_id": "song_0013",
"audio_path": "songs/song_0013.wav",
"duration": 15.0,
"base_freq": 493.88,
"type": "reference"
},
{
"song_id": "song_0014",
"audio_path": "songs/song_0014.wav",
"duration": 15.0,
"base_freq": 523.25,
"type": "reference"
},
{
"song_id": "song_0015",
"audio_path": "songs/song_0015.wav",
"duration": 15.0,
"base_freq": 587.33,
"type": "reference"
},
{
"song_id": "song_0016",
"audio_path": "songs/song_0016.wav",
"duration": 15.0,
"base_freq": 659.25,
"type": "reference"
},
{
"song_id": "song_0017",
"audio_path": "songs/song_0017.wav",
"duration": 15.0,
"base_freq": 698.46,
"type": "reference"
},
{
"song_id": "song_0018",
"audio_path": "songs/song_0018.wav",
"duration": 15.0,
"base_freq": 783.99,
"type": "reference"
},
{
"song_id": "song_0019",
"audio_path": "songs/song_0019.wav",
"duration": 15.0,
"base_freq": 880.0,
"type": "reference"
},
{
"song_id": "song_0020",
"audio_path": "songs/song_0020.wav",
"duration": 15.0,
"base_freq": 987.77,
"type": "reference"
},
{
"song_id": "song_0021",
"audio_path": "songs/song_0021.wav",
"duration": 15.0,
"base_freq": 146.8292605393491,
"type": "reference"
},
{
"song_id": "song_0022",
"audio_path": "songs/song_0022.wav",
"duration": 15.0,
"base_freq": 164.81110255326524,
"type": "reference"
},
{
"song_id": "song_0023",
"audio_path": "songs/song_0023.wav",
"duration": 15.0,
"base_freq": 184.99297018186778,
"type": "reference"
}
]
\ No newline at end of file
[
{
"song_id": "song_0020",
"audio_path": "segments/song_0020_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.349828784349853,
"segment_type": "mid"
},
{
"song_id": "song_0020",
"audio_path": "segments/song_0020_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 9.642182747327407,
"segment_type": "mid"
},
{
"song_id": "song_0020",
"audio_path": "segments/song_0020_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 2.367717347418965,
"segment_type": "intro"
},
{
"song_id": "song_0020",
"audio_path": "segments/song_0020_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 3.180577192661006,
"segment_type": "mid"
},
{
"song_id": "song_0020",
"audio_path": "segments/song_0020_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 4.660551124366617,
"segment_type": "mid"
},
{
"song_id": "song_0020",
"audio_path": "songs/song_0020.wav",
"duration": 15.0,
"base_freq": 987.77,
"type": "reference"
},
{
"song_id": "song_0021",
"audio_path": "segments/song_0021_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.631088908640184,
"segment_type": "mid"
},
{
"song_id": "song_0021",
"audio_path": "segments/song_0021_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 1.8823366490525628,
"segment_type": "intro"
},
{
"song_id": "song_0021",
"audio_path": "segments/song_0021_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 9.88006210404643,
"segment_type": "mid"
},
{
"song_id": "song_0021",
"audio_path": "segments/song_0021_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 0.9025737685090285,
"segment_type": "intro"
},
{
"song_id": "song_0021",
"audio_path": "segments/song_0021_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 1.3048954561918258,
"segment_type": "intro"
},
{
"song_id": "song_0021",
"audio_path": "songs/song_0021.wav",
"duration": 15.0,
"base_freq": 146.8292605393491,
"type": "reference"
},
{
"song_id": "song_0022",
"audio_path": "segments/song_0022_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.9746734850812295,
"segment_type": "mid"
},
{
"song_id": "song_0022",
"audio_path": "segments/song_0022_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.890968121206573,
"segment_type": "mid"
},
{
"song_id": "song_0022",
"audio_path": "segments/song_0022_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 6.610400547460049,
"segment_type": "mid"
},
{
"song_id": "song_0022",
"audio_path": "segments/song_0022_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 2.6329596668288424,
"segment_type": "intro"
},
{
"song_id": "song_0022",
"audio_path": "segments/song_0022_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 0.8570731183991709,
"segment_type": "intro"
},
{
"song_id": "song_0022",
"audio_path": "songs/song_0022.wav",
"duration": 15.0,
"base_freq": 164.81110255326524,
"type": "reference"
},
{
"song_id": "song_0023",
"audio_path": "segments/song_0023_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.461034326075292,
"segment_type": "mid"
},
{
"song_id": "song_0023",
"audio_path": "segments/song_0023_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 9.605203782802876,
"segment_type": "mid"
},
{
"song_id": "song_0023",
"audio_path": "segments/song_0023_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 4.7458228906154805,
"segment_type": "mid"
},
{
"song_id": "song_0023",
"audio_path": "segments/song_0023_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 8.308702013555955,
"segment_type": "mid"
},
{
"song_id": "song_0023",
"audio_path": "segments/song_0023_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 2.213510770155481,
"segment_type": "intro"
},
{
"song_id": "song_0023",
"audio_path": "songs/song_0023.wav",
"duration": 15.0,
"base_freq": 184.99297018186778,
"type": "reference"
}
]
\ No newline at end of file
[
{
"song_id": "song_0000",
"audio_path": "segments/song_0000_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 9.538159275210802,
"segment_type": "mid"
},
{
"song_id": "song_0000",
"audio_path": "segments/song_0000_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 8.75852940378194,
"segment_type": "mid"
},
{
"song_id": "song_0000",
"audio_path": "segments/song_0000_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 2.6338905075109076,
"segment_type": "intro"
},
{
"song_id": "song_0000",
"audio_path": "segments/song_0000_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 6.389494948660052,
"segment_type": "mid"
},
{
"song_id": "song_0000",
"audio_path": "segments/song_0000_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 5.303536721951775,
"segment_type": "mid"
},
{
"song_id": "song_0000",
"audio_path": "songs/song_0000.wav",
"duration": 15.0,
"base_freq": 130.81,
"type": "reference"
},
{
"song_id": "song_0001",
"audio_path": "segments/song_0001_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.227827155319589,
"segment_type": "mid"
},
{
"song_id": "song_0001",
"audio_path": "segments/song_0001_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 9.347062577364273,
"segment_type": "mid"
},
{
"song_id": "song_0001",
"audio_path": "segments/song_0001_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 2.042591994235364,
"segment_type": "intro"
},
{
"song_id": "song_0001",
"audio_path": "segments/song_0001_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 3.1617719627185403,
"segment_type": "mid"
},
{
"song_id": "song_0001",
"audio_path": "segments/song_0001_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 0.73260721099633,
"segment_type": "intro"
},
{
"song_id": "song_0001",
"audio_path": "songs/song_0001.wav",
"duration": 15.0,
"base_freq": 146.83,
"type": "reference"
},
{
"song_id": "song_0002",
"audio_path": "segments/song_0002_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.0928466220865323,
"segment_type": "mid"
},
{
"song_id": "song_0002",
"audio_path": "segments/song_0002_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.083929086192168,
"segment_type": "mid"
},
{
"song_id": "song_0002",
"audio_path": "segments/song_0002_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 4.024003870577246,
"segment_type": "mid"
},
{
"song_id": "song_0002",
"audio_path": "segments/song_0002_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 9.028055457325827,
"segment_type": "mid"
},
{
"song_id": "song_0002",
"audio_path": "segments/song_0002_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 4.2988814998983464,
"segment_type": "mid"
},
{
"song_id": "song_0002",
"audio_path": "songs/song_0002.wav",
"duration": 15.0,
"base_freq": 164.81,
"type": "reference"
},
{
"song_id": "song_0003",
"audio_path": "segments/song_0003_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 0.1938328705001069,
"segment_type": "intro"
},
{
"song_id": "song_0003",
"audio_path": "segments/song_0003_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.394190479225337,
"segment_type": "mid"
},
{
"song_id": "song_0003",
"audio_path": "segments/song_0003_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 9.999078285092093,
"segment_type": "mid"
},
{
"song_id": "song_0003",
"audio_path": "segments/song_0003_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 9.496117327159888,
"segment_type": "mid"
},
{
"song_id": "song_0003",
"audio_path": "segments/song_0003_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 2.1796454090650363,
"segment_type": "intro"
},
{
"song_id": "song_0003",
"audio_path": "songs/song_0003.wav",
"duration": 15.0,
"base_freq": 174.61,
"type": "reference"
},
{
"song_id": "song_0004",
"audio_path": "segments/song_0004_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 9.654976431382948,
"segment_type": "mid"
},
{
"song_id": "song_0004",
"audio_path": "segments/song_0004_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 2.524783904929726,
"segment_type": "intro"
},
{
"song_id": "song_0004",
"audio_path": "segments/song_0004_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 8.617229646275131,
"segment_type": "mid"
},
{
"song_id": "song_0004",
"audio_path": "segments/song_0004_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 1.5172700695095642,
"segment_type": "intro"
},
{
"song_id": "song_0004",
"audio_path": "segments/song_0004_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 4.161740214103284,
"segment_type": "mid"
},
{
"song_id": "song_0004",
"audio_path": "songs/song_0004.wav",
"duration": 15.0,
"base_freq": 196.0,
"type": "reference"
},
{
"song_id": "song_0005",
"audio_path": "segments/song_0005_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.088720150695117,
"segment_type": "mid"
},
{
"song_id": "song_0005",
"audio_path": "segments/song_0005_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 2.734248967132742,
"segment_type": "intro"
},
{
"song_id": "song_0005",
"audio_path": "segments/song_0005_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 8.347239455766944,
"segment_type": "mid"
},
{
"song_id": "song_0005",
"audio_path": "segments/song_0005_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 5.08240891592894,
"segment_type": "mid"
},
{
"song_id": "song_0005",
"audio_path": "segments/song_0005_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 9.3424839368252,
"segment_type": "mid"
},
{
"song_id": "song_0005",
"audio_path": "songs/song_0005.wav",
"duration": 15.0,
"base_freq": 220.0,
"type": "reference"
},
{
"song_id": "song_0006",
"audio_path": "segments/song_0006_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 2.5062680004361604,
"segment_type": "intro"
},
{
"song_id": "song_0006",
"audio_path": "segments/song_0006_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 7.555773237416772,
"segment_type": "mid"
},
{
"song_id": "song_0006",
"audio_path": "segments/song_0006_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 7.674707744954641,
"segment_type": "mid"
},
{
"song_id": "song_0006",
"audio_path": "segments/song_0006_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 0.33364531245632434,
"segment_type": "intro"
},
{
"song_id": "song_0006",
"audio_path": "segments/song_0006_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 2.007947946500762,
"segment_type": "intro"
},
{
"song_id": "song_0006",
"audio_path": "songs/song_0006.wav",
"duration": 15.0,
"base_freq": 246.94,
"type": "reference"
},
{
"song_id": "song_0007",
"audio_path": "segments/song_0007_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 6.589030736792923,
"segment_type": "mid"
},
{
"song_id": "song_0007",
"audio_path": "segments/song_0007_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.016303290280887,
"segment_type": "mid"
},
{
"song_id": "song_0007",
"audio_path": "segments/song_0007_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 6.433406842054888,
"segment_type": "mid"
},
{
"song_id": "song_0007",
"audio_path": "segments/song_0007_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 4.435623293630087,
"segment_type": "mid"
},
{
"song_id": "song_0007",
"audio_path": "segments/song_0007_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 5.8536468854812105,
"segment_type": "mid"
},
{
"song_id": "song_0007",
"audio_path": "songs/song_0007.wav",
"duration": 15.0,
"base_freq": 261.63,
"type": "reference"
},
{
"song_id": "song_0008",
"audio_path": "segments/song_0008_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 0.42302261562791377,
"segment_type": "intro"
},
{
"song_id": "song_0008",
"audio_path": "segments/song_0008_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 0.18741536585645702,
"segment_type": "intro"
},
{
"song_id": "song_0008",
"audio_path": "segments/song_0008_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 9.211624345024124,
"segment_type": "mid"
},
{
"song_id": "song_0008",
"audio_path": "segments/song_0008_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 4.176939598434806,
"segment_type": "mid"
},
{
"song_id": "song_0008",
"audio_path": "segments/song_0008_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 8.320259130717071,
"segment_type": "mid"
},
{
"song_id": "song_0008",
"audio_path": "songs/song_0008.wav",
"duration": 15.0,
"base_freq": 293.66,
"type": "reference"
},
{
"song_id": "song_0009",
"audio_path": "segments/song_0009_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.076897127246463,
"segment_type": "mid"
},
{
"song_id": "song_0009",
"audio_path": "segments/song_0009_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.397707584136711,
"segment_type": "mid"
},
{
"song_id": "song_0009",
"audio_path": "segments/song_0009_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 7.3864400300146755,
"segment_type": "mid"
},
{
"song_id": "song_0009",
"audio_path": "segments/song_0009_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 5.9724644107162845,
"segment_type": "mid"
},
{
"song_id": "song_0009",
"audio_path": "segments/song_0009_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 7.21182997805427,
"segment_type": "mid"
},
{
"song_id": "song_0009",
"audio_path": "songs/song_0009.wav",
"duration": 15.0,
"base_freq": 329.63,
"type": "reference"
},
{
"song_id": "song_0010",
"audio_path": "segments/song_0010_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.1007588293689183,
"segment_type": "mid"
},
{
"song_id": "song_0010",
"audio_path": "segments/song_0010_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.9822405568601704,
"segment_type": "mid"
},
{
"song_id": "song_0010",
"audio_path": "segments/song_0010_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 8.154060806559823,
"segment_type": "mid"
},
{
"song_id": "song_0010",
"audio_path": "segments/song_0010_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 2.7321660611387344,
"segment_type": "intro"
},
{
"song_id": "song_0010",
"audio_path": "segments/song_0010_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 9.564787178236601,
"segment_type": "mid"
},
{
"song_id": "song_0010",
"audio_path": "songs/song_0010.wav",
"duration": 15.0,
"base_freq": 349.23,
"type": "reference"
},
{
"song_id": "song_0011",
"audio_path": "segments/song_0011_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 8.949259168211244,
"segment_type": "mid"
},
{
"song_id": "song_0011",
"audio_path": "segments/song_0011_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 8.459337061558657,
"segment_type": "mid"
},
{
"song_id": "song_0011",
"audio_path": "segments/song_0011_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 2.5060530898199906,
"segment_type": "intro"
},
{
"song_id": "song_0011",
"audio_path": "segments/song_0011_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 5.0257314474126265,
"segment_type": "mid"
},
{
"song_id": "song_0011",
"audio_path": "segments/song_0011_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 8.42530004113389,
"segment_type": "mid"
},
{
"song_id": "song_0011",
"audio_path": "songs/song_0011.wav",
"duration": 15.0,
"base_freq": 392.0,
"type": "reference"
},
{
"song_id": "song_0012",
"audio_path": "segments/song_0012_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 7.253242125518553,
"segment_type": "mid"
},
{
"song_id": "song_0012",
"audio_path": "segments/song_0012_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 6.880436512027717,
"segment_type": "mid"
},
{
"song_id": "song_0012",
"audio_path": "segments/song_0012_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 0.26647154963833186,
"segment_type": "intro"
},
{
"song_id": "song_0012",
"audio_path": "segments/song_0012_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 7.214001122963067,
"segment_type": "mid"
},
{
"song_id": "song_0012",
"audio_path": "segments/song_0012_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 1.4777570830033182,
"segment_type": "intro"
},
{
"song_id": "song_0012",
"audio_path": "songs/song_0012.wav",
"duration": 15.0,
"base_freq": 440.0,
"type": "reference"
},
{
"song_id": "song_0013",
"audio_path": "segments/song_0013_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.3711217932975037,
"segment_type": "mid"
},
{
"song_id": "song_0013",
"audio_path": "segments/song_0013_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 2.95024257658282,
"segment_type": "intro"
},
{
"song_id": "song_0013",
"audio_path": "segments/song_0013_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 6.7440113989474435,
"segment_type": "mid"
},
{
"song_id": "song_0013",
"audio_path": "segments/song_0013_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 3.27926658740176,
"segment_type": "mid"
},
{
"song_id": "song_0013",
"audio_path": "segments/song_0013_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 0.06830120539555451,
"segment_type": "intro"
},
{
"song_id": "song_0013",
"audio_path": "songs/song_0013.wav",
"duration": 15.0,
"base_freq": 493.88,
"type": "reference"
},
{
"song_id": "song_0014",
"audio_path": "segments/song_0014_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.389628114874606,
"segment_type": "mid"
},
{
"song_id": "song_0014",
"audio_path": "segments/song_0014_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.397598089074283,
"segment_type": "mid"
},
{
"song_id": "song_0014",
"audio_path": "segments/song_0014_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 7.543857087472844,
"segment_type": "mid"
},
{
"song_id": "song_0014",
"audio_path": "segments/song_0014_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 5.77474814637882,
"segment_type": "mid"
},
{
"song_id": "song_0014",
"audio_path": "segments/song_0014_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 5.212510542649235,
"segment_type": "mid"
},
{
"song_id": "song_0014",
"audio_path": "songs/song_0014.wav",
"duration": 15.0,
"base_freq": 523.25,
"type": "reference"
},
{
"song_id": "song_0015",
"audio_path": "segments/song_0015_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.3221248501273655,
"segment_type": "mid"
},
{
"song_id": "song_0015",
"audio_path": "segments/song_0015_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.113385082174164,
"segment_type": "mid"
},
{
"song_id": "song_0015",
"audio_path": "segments/song_0015_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 0.16726147602629915,
"segment_type": "intro"
},
{
"song_id": "song_0015",
"audio_path": "segments/song_0015_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 4.305732086760379,
"segment_type": "mid"
},
{
"song_id": "song_0015",
"audio_path": "segments/song_0015_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 6.197808424119352,
"segment_type": "mid"
},
{
"song_id": "song_0015",
"audio_path": "songs/song_0015.wav",
"duration": 15.0,
"base_freq": 587.33,
"type": "reference"
}
]
\ No newline at end of file
[
{
"song_id": "song_0016",
"audio_path": "segments/song_0016_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 7.208994524555927,
"segment_type": "mid"
},
{
"song_id": "song_0016",
"audio_path": "segments/song_0016_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 4.958024367228626,
"segment_type": "mid"
},
{
"song_id": "song_0016",
"audio_path": "segments/song_0016_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 6.1666879203579,
"segment_type": "mid"
},
{
"song_id": "song_0016",
"audio_path": "segments/song_0016_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 8.621983105655142,
"segment_type": "mid"
},
{
"song_id": "song_0016",
"audio_path": "segments/song_0016_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 3.004352846791234,
"segment_type": "mid"
},
{
"song_id": "song_0016",
"audio_path": "songs/song_0016.wav",
"duration": 15.0,
"base_freq": 659.25,
"type": "reference"
},
{
"song_id": "song_0017",
"audio_path": "segments/song_0017_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.277150196277827,
"segment_type": "mid"
},
{
"song_id": "song_0017",
"audio_path": "segments/song_0017_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 6.391085856661506,
"segment_type": "mid"
},
{
"song_id": "song_0017",
"audio_path": "segments/song_0017_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 5.969708292829935,
"segment_type": "mid"
},
{
"song_id": "song_0017",
"audio_path": "segments/song_0017_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 6.1736267933642495,
"segment_type": "mid"
},
{
"song_id": "song_0017",
"audio_path": "segments/song_0017_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 1.1786165266165671,
"segment_type": "intro"
},
{
"song_id": "song_0017",
"audio_path": "songs/song_0017.wav",
"duration": 15.0,
"base_freq": 698.46,
"type": "reference"
},
{
"song_id": "song_0018",
"audio_path": "segments/song_0018_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 6.641438208318426,
"segment_type": "mid"
},
{
"song_id": "song_0018",
"audio_path": "segments/song_0018_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 3.582227293409872,
"segment_type": "mid"
},
{
"song_id": "song_0018",
"audio_path": "segments/song_0018_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 0.6333068606017467,
"segment_type": "intro"
},
{
"song_id": "song_0018",
"audio_path": "segments/song_0018_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 3.3775515517078736,
"segment_type": "mid"
},
{
"song_id": "song_0018",
"audio_path": "segments/song_0018_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 6.825519260932059,
"segment_type": "mid"
},
{
"song_id": "song_0018",
"audio_path": "songs/song_0018.wav",
"duration": 15.0,
"base_freq": 783.99,
"type": "reference"
},
{
"song_id": "song_0019",
"audio_path": "segments/song_0019_seg_00.wav",
"duration": 5.0,
"type": "clean",
"offset": 6.405372883123518,
"segment_type": "mid"
},
{
"song_id": "song_0019",
"audio_path": "segments/song_0019_seg_01.wav",
"duration": 5.0,
"type": "clean",
"offset": 5.376553581360508,
"segment_type": "mid"
},
{
"song_id": "song_0019",
"audio_path": "segments/song_0019_seg_02_augmented.wav",
"duration": 5.0,
"type": "augmented",
"offset": 1.5268044380447066,
"segment_type": "intro"
},
{
"song_id": "song_0019",
"audio_path": "segments/song_0019_seg_03_humming_like.wav",
"duration": 5.0,
"type": "humming_like",
"offset": 5.864371630124319,
"segment_type": "mid"
},
{
"song_id": "song_0019",
"audio_path": "segments/song_0019_seg_04_confused.wav",
"duration": 5.0,
"type": "confused",
"offset": 4.37486043050575,
"segment_type": "mid"
},
{
"song_id": "song_0019",
"audio_path": "songs/song_0019.wav",
"duration": 15.0,
"base_freq": 880.0,
"type": "reference"
}
]
\ No newline at end of file
......@@ -23,6 +23,8 @@ def main():
parser.add_argument("--split", default="test")
parser.add_argument("--top-k", type=int, default=5)
parser.add_argument("--device", default="cpu")
parser.add_argument("--output-json", default=None)
parser.add_argument("--fast-eval", action="store_true")
args = parser.parse_args()
data_dir = Path(args.data)
......@@ -32,7 +34,7 @@ def main():
ref_embs = np.load(f"{args.index_prefix}_embs.npy")
ref_ids = np.load(f"{args.index_prefix}_ids.npy", allow_pickle=True).tolist()
engine = HybridEngine(matcher, embedder, ref_embs, ref_ids)
engine = HybridEngine(matcher, embedder, ref_embs, ref_ids, disable_melody=args.fast_eval)
for split in ["train.json", "val.json", "test.json"]:
p = data_dir / split
if p.exists():
......@@ -91,7 +93,12 @@ def main():
},
"sample_failures": failures[:10],
}
print(json.dumps(report, ensure_ascii=False, indent=2))
output = json.dumps(report, ensure_ascii=False, indent=2)
print(output)
if args.output_json:
out = Path(args.output_json)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(output)
if __name__ == "__main__":
......
{
"generated_at": "2026-06-02T04:08:01Z",
"model_version": "smoke-v2",
"data_version": "synthetic_v2",
"files": {
"benchmark_report": "reports/smoke-v2/synthetic_v2/benchmark-report.md",
"model_card": "reports/smoke-v2/synthetic_v2/model-card.md",
"release_checklist": "reports/smoke-v2/synthetic_v2/release-checklist.md"
}
}
\ No newline at end of file
# Benchmark Report
## 一页结论
- 模型版本:smoke-v2
- 数据版本:synthetic_v2
- 核心结论:top1=0.6 top5=0.75
- 是否通过上线门禁:TBD
## 1. 评测范围图
```mermaid
flowchart LR
A[smoke-v2] --> B[synthetic_v2]
A --> C[Scenario Buckets]
A --> D[Latency / Ops]
```
## 2. 指标表
| Bucket | top1 | top5 | MRR | FAR | Notes |
|---|---:|---:|---:|---:|---|
| clean | 1.0 | 1.0 | | | |
| augmented | 0.75 | 0.75 | | | |
| humming_like | 0.0 | 0.75 | | | |
| confused | 0.25 | 0.25 | | | |
## 3. 文字分析
- 最强项:clean/augmented buckets if present
- 最弱项:see hard-case summary
- 与上一版本对比:TBD
## 4. 细节附录
- 原始 JSON 报告:embedded source
## Sources
- docs/industrial-benchmark-spec.md
{
"split": "test",
"num_queries": 20,
"top1": 0.6,
"topk": 0.75,
"by_type": {
"clean": {
"n": 8,
"top1": 1.0,
"topk": 1.0
},
"augmented": {
"n": 4,
"top1": 0.75,
"topk": 0.75
},
"humming_like": {
"n": 4,
"top1": 0.0,
"topk": 0.75
},
"confused": {
"n": 4,
"top1": 0.25,
"topk": 0.25
}
},
"hard_case_summary": {
"humming_like": {
"n": 4,
"top1": 0.0,
"topk": 0.75
},
"confused": {
"n": 4,
"top1": 0.25,
"topk": 0.25
}
},
"sample_failures": [
{
"truth": "song_0020",
"query": "segments/song_0020_seg_04_confused.wav",
"type": "confused",
"preds": [
"song_0005",
"song_0022",
"song_0001",
"song_0002",
"song_0008"
]
},
{
"truth": "song_0021",
"query": "segments/song_0021_seg_04_confused.wav",
"type": "confused",
"preds": [
"song_0005",
"song_0022",
"song_0000",
"song_0002",
"song_0001"
]
},
{
"truth": "song_0022",
"query": "segments/song_0022_seg_02_augmented.wav",
"type": "augmented",
"preds": [
"song_0009",
"song_0010",
"song_0006",
"song_0008",
"song_0002"
]
},
{
"truth": "song_0022",
"query": "segments/song_0022_seg_03_humming_like.wav",
"type": "humming_like",
"preds": [
"song_0008",
"song_0007",
"song_0021",
"song_0001",
"song_0004"
]
},
{
"truth": "song_0023",
"query": "segments/song_0023_seg_04_confused.wav",
"type": "confused",
"preds": [
"song_0022",
"song_0002",
"song_0021",
"song_0001",
"song_0005"
]
}
]
}
\ No newline at end of file
# Model Card
## 一页结论
- 模型名称:ACR Hybrid Encoder
- 版本:smoke-v2
- 适用场景:music ACR prototype / retrieval
- 不适用场景:未经白名单数据验证的生产商用全量上线
## 1. 模型结构图
```mermaid
flowchart LR
A[Input Audio] --> B[128 Mel + BandSplit]
B --> C[Encoder]
C --> D[Embedding]
D --> E[Hybrid Retrieval]
```
## 2. 关键信息表
| 项 | 内容 |
|---|---|
| embed_dim | 192 |
| channels | 512 |
| n_mels | 128 |
| use_band_split | True |
| benchmark report | reports/smoke-v2/synthetic_v2/benchmark-report.md |
## 3. 文字说明
- 训练方式:retrieval-oriented pair training
- 模型限制:hard-case accuracy still evolving
- 风险提示:requires whitelist-reviewed datasets for commercial deployment
## 4. 细节附录
- config embedded from source JSON
## Sources
- docs/dataset-spec.md
- docs/benchmark-report-template.md
# Release Checklist
## 一页结论
发布前必须同时满足:质量通过、合规通过、服务通过、文档齐全。
## 1. 发布门禁图
```mermaid
flowchart TD
A[smoke-v2] --> B[Benchmark Pass]
A --> C[License Review Pass]
A --> D[Service Smoke Pass]
A --> E[Docs Complete]
```
## 2. Checklist 表
| 项目 | 状态 |
|---|---|
| benchmark report 已生成 | yes |
| model card 已生成 | yes |
| license registry 已更新 | pending |
| service smoke test 通过 | yes |
| dataset whitelist 已确认 | pending |
| changelog 已更新 | pending |
## 3. 文字说明
- 当前用于工程治理与预发布检查,不代表已满足商用法律门槛。
## 4. 细节附录
- benchmark 报告路径:reports/smoke-v2/synthetic_v2/benchmark-report.md
- model card 路径:reports/smoke-v2/synthetic_v2/model-card.md
## Sources
- docs/dataset-sources-and-licensing.md
- docs/industrial-benchmark-spec.md
#!/usr/bin/env python3
"""Generate benchmark report, model card, and release bundle artifacts."""
from __future__ import annotations
import argparse
import json
from datetime import datetime, timezone
from pathlib import Path
def utc_now():
return datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
def load_json(path: str):
with open(path) as f:
return json.load(f)
def write_text(path: Path, text: str):
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(text)
def benchmark_md(model_version: str, data_version: str, report: dict) -> str:
by_type = report.get('by_type', {})
rows = []
for k, v in by_type.items():
rows.append(f"| {k} | {v.get('top1','')} | {v.get('topk','')} | | | |")
rows_text = '\n'.join(rows) if rows else '| n/a | | | | | |'
return f'''# Benchmark Report\n\n## 一页结论\n- 模型版本:{model_version}\n- 数据版本:{data_version}\n- 核心结论:top1={report.get('top1')} top5={report.get('topk')}\n- 是否通过上线门禁:TBD\n\n## 1. 评测范围图\n\n```mermaid\nflowchart LR\n A[{model_version}] --> B[{data_version}]\n A --> C[Scenario Buckets]\n A --> D[Latency / Ops]\n```\n\n## 2. 指标表\n\n| Bucket | top1 | top5 | MRR | FAR | Notes |\n|---|---:|---:|---:|---:|---|\n{rows_text}\n\n## 3. 文字分析\n- 最强项:clean/augmented buckets if present\n- 最弱项:see hard-case summary\n- 与上一版本对比:TBD\n\n## 4. 细节附录\n- 原始 JSON 报告:embedded source\n\n## Sources\n- docs/industrial-benchmark-spec.md\n'''
def model_card_md(model_version: str, config: dict, benchmark_path: str) -> str:
model_cfg = config.get('model', {})
return f'''# Model Card\n\n## 一页结论\n- 模型名称:ACR Hybrid Encoder\n- 版本:{model_version}\n- 适用场景:music ACR prototype / retrieval\n- 不适用场景:未经白名单数据验证的生产商用全量上线\n\n## 1. 模型结构图\n\n```mermaid\nflowchart LR\n A[Input Audio] --> B[128 Mel + BandSplit]\n B --> C[Encoder]\n C --> D[Embedding]\n D --> E[Hybrid Retrieval]\n```\n\n## 2. 关键信息表\n\n| 项 | 内容 |\n|---|---|\n| embed_dim | {model_cfg.get('embed_dim')} |\n| channels | {model_cfg.get('channels')} |\n| n_mels | {model_cfg.get('n_mels')} |\n| use_band_split | {model_cfg.get('use_band_split')} |\n| benchmark report | {benchmark_path} |\n\n## 3. 文字说明\n- 训练方式:retrieval-oriented pair training\n- 模型限制:hard-case accuracy still evolving\n- 风险提示:requires whitelist-reviewed datasets for commercial deployment\n\n## 4. 细节附录\n- config embedded from source JSON\n\n## Sources\n- docs/dataset-spec.md\n- docs/benchmark-report-template.md\n'''
def release_checklist_md(model_version: str, benchmark_path: str, model_card_path: str) -> str:
return f'''# Release Checklist\n\n## 一页结论\n发布前必须同时满足:质量通过、合规通过、服务通过、文档齐全。\n\n## 1. 发布门禁图\n\n```mermaid\nflowchart TD\n A[{model_version}] --> B[Benchmark Pass]\n A --> C[License Review Pass]\n A --> D[Service Smoke Pass]\n A --> E[Docs Complete]\n```\n\n## 2. Checklist 表\n\n| 项目 | 状态 |\n|---|---|\n| benchmark report 已生成 | yes |\n| model card 已生成 | yes |\n| license registry 已更新 | pending |\n| service smoke test 通过 | yes |\n| dataset whitelist 已确认 | pending |\n| changelog 已更新 | pending |\n\n## 3. 文字说明\n- 当前用于工程治理与预发布检查,不代表已满足商用法律门槛。\n\n## 4. 细节附录\n- benchmark 报告路径:{benchmark_path}\n- model card 路径:{model_card_path}\n\n## Sources\n- docs/dataset-sources-and-licensing.md\n- docs/industrial-benchmark-spec.md\n'''
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--eval-json', required=True)
parser.add_argument('--config-json', required=True)
parser.add_argument('--output-dir', required=True)
parser.add_argument('--model-version', default='dev')
parser.add_argument('--data-version', default='synthetic')
args = parser.parse_args()
out_dir = Path(args.output_dir)
out_dir.mkdir(parents=True, exist_ok=True)
eval_report = load_json(args.eval_json)
config = load_json(args.config_json)
bench_path = out_dir / 'benchmark-report.md'
card_path = out_dir / 'model-card.md'
checklist_path = out_dir / 'release-checklist.md'
manifest_path = out_dir / 'artifact-manifest.json'
write_text(bench_path, benchmark_md(args.model_version, args.data_version, eval_report))
write_text(card_path, model_card_md(args.model_version, config, str(bench_path)))
write_text(checklist_path, release_checklist_md(args.model_version, str(bench_path), str(card_path)))
manifest = {
'generated_at': utc_now(),
'model_version': args.model_version,
'data_version': args.data_version,
'files': {
'benchmark_report': str(bench_path),
'model_card': str(card_path),
'release_checklist': str(checklist_path),
},
}
manifest_path.write_text(json.dumps(manifest, indent=2))
print(json.dumps(manifest, indent=2))
if __name__ == '__main__':
main()
......@@ -39,6 +39,7 @@ class HybridEngine:
ecapa_weight: float = 0.5,
melody_weight: float = 0.25,
reject_threshold: float = 0.35,
disable_melody: bool = False,
):
self.chroma = chroma_matcher
self.ecapa = ecapa_embedder
......@@ -49,6 +50,7 @@ class HybridEngine:
self.ecapa_weight = ecapa_weight
self.melody_weight = melody_weight
self.reject_threshold = reject_threshold
self.disable_melody = disable_melody
self.song_metadata: Dict[str, Dict] = {}
self.song_audio_paths: Dict[str, str] = {}
self.audio = AudioProcessor(sr=sr)
......@@ -114,8 +116,8 @@ class HybridEngine:
ecapa_matches = [(self.ref_ids[idx], float(scores[idx])) for idx in top_indices]
ecapa_norm = self._normalize_scores(ecapa_matches)
candidate_pool = list(set(list(chroma_norm.keys())[: top_n * 8] + list(ecapa_norm.keys())[: top_n * 8]))
melody_norm = self._melody_scores(y, candidate_pool)
candidate_pool = list(set(list(chroma_norm.keys())[: top_n * 4] + list(ecapa_norm.keys())[: top_n * 4]))
melody_norm = {} if self.disable_melody else self._melody_scores(y, candidate_pool)
all_song_ids = set(candidate_pool) | set(melody_norm)
combined: List[Candidate] = []
......
......@@ -95,3 +95,21 @@
- 核心 docs 存在性检查通过
- benchmark/model/release 模板结构检查通过
- 所有核心文档均具备 Sources;SOTA 文档已补齐 Mermaid 图
## 2026-06-02
### Stage: 真实评测到发布产物链路打通
完成项:
- `evaluate.py` 支持 `--output-json`
- 新增 `docs/report-layout.md`
- 新增 `scripts/generate_artifacts.py`
- 打通 `eval.json -> benchmark-report.md / model-card.md / release-checklist.md / artifact-manifest.json`
- 为快速发布链路新增 `--fast-eval`(关闭 melody 重排以加快报告生成)
验证结果:
- synthetic_v2 重建、训练、建索引成功
- `evaluate.py --fast-eval --output-json ...` 成功输出 JSON
- artifact generator 成功输出 4 类发布产物
- `reports/smoke-v2/synthetic_v2/` 目录产物存在性检查通过
- 当前 fast-eval 指标:top1=0.60, top5=0.75,hard-case 仍需继续优化
......
# Report Layout Convention
## 一页结论
所有评测与发布产物统一放入:
- `reports/<model-version>/<data-version>/eval.json`
- `reports/<model-version>/<data-version>/benchmark-report.md`
- `reports/<model-version>/<data-version>/model-card.md`
- `reports/<model-version>/<data-version>/release-checklist.md`
- `reports/<model-version>/<data-version>/artifact-manifest.json`
---
## 1. 布局图
```mermaid
flowchart TD
A[reports/] --> B[model-version]
B --> C[data-version]
C --> D[eval.json]
C --> E[benchmark-report.md]
C --> F[model-card.md]
C --> G[release-checklist.md]
C --> H[artifact-manifest.json]
```
---
## 2. 约定表
| 文件 | 用途 |
|---|---|
| eval.json | 机器可读评测输出 |
| benchmark-report.md | 人类可读 benchmark 摘要 |
| model-card.md | 模型说明 |
| release-checklist.md | 发布门禁 |
| artifact-manifest.json | 产物索引 |
---
## 3. 文字说明
- 所有 release 候选都应有独立目录
- 不要把临时 smoke 文件与正式 release 报告混放
## Sources
- docs/benchmark-report-template.md
- docs/model-card-template.md
- docs/release-checklist.md