大规模乐谱数据采集实践:从零构建音乐AI训练数据集

13 阅读1分钟

## 前言

随着音乐生成大模型的快速发展,高质量、结构化的符号音乐数据成为稀缺资产。本文记录了我们团队从零搭建 MuseScore 平台乐谱数据采集系统的完整实践,最终交付 **22万首** MSCZ 格式乐谱及配套元数据,覆盖钢琴、弦乐、管乐等主流乐器,涵盖古典、流行、爵士等全风格。

## 一、为什么选择 MuseScore?

MuseScore(musescore.com)是全球最大的用户原创乐谱社区,拥有 **300万+** 曲目,核心价值在于:

- **MSCZ 原生格式**:包含完整音符、节拍、调号、力度、连线等结构信息,远优于 PDF 图片 

- **可无损转换**:一份 MSCZ 可导出 MusicXML、MIDI、PDF、MP3 等多种格式,满足下游多样需求 

- **元数据完整**:每首曲目附带作曲家、调性、拍号、乐器编制、时长、热度等结构化字段 

- **用户原创覆盖广**:既有专业编曲,也有大量流行歌曲改编,风格多样性极高

对比其他来源:

 | 数据源 | 格式 | 结构化程度 | 规模 | |--------|------|-----------|------| | IMSLP | PDF为主 | 低 | 25万(公域) | | MIDI 数据集 | MIDI | 中 | 无力度/调号 | | **MuseScore** | **MSCZ** | **高** | **300万+** |

## 二、技术挑战 

 ### 2.1 平台加密机制

 MuseScore 平台对核心文件实施了加密保护,原生文件以私有加密格式(XTZ)存储,直接下载无法使用。破解加密算法的技术路线风险高、维护成本大,我们选择了更稳定的方案。 

### 2.2 规模化 ID 发现

 平台采用 16 位长整数作为曲目唯一标识(ssid),没有公开的全量 ID 列表,无法直接遍历。ID 发现成为制约采集规模的核心瓶颈。 

 ### 2.3 反爬限制

 平台对高频请求实施严格限速,单 IP 请求超限后触发 429 封控,需要精细的并发管理和流量调度策略。

## 三、系统架构设计 

 我们将整体系统拆分为三条独立流水线: 

``` [ID发现] → [文件下载] → [解密还原] → [格式转换] → [数据入库] ```

### 3.1 ID 发现模块

通过分析官方 App 网络协议,复现搜索接口调用链:

  • - 构建**多账号凭证池**,支持凭证轮转与冷却管理 
  • - 实现**自适应限速器**,根据实时错误率动态调整请求频率 
  • - 以音乐标题关键词为输入驱动搜索,每次搜索返回一批曲目 ID 
  • - 持续写入 ID 资产库,累计收录 **64万+** 有效 ID

### 3.2 文件下载模块

``` ID → 签名生成 → 加密文件下载 → 状态机管理 ``` 

  •  - **代理节点池**:300+ 节点负载均衡,单节点并发控制与健康检测 
  • - **任务状态机**:pending → processing → done/failed,支持断点续传与失败重试 
  • - **双路径容灾**:主路径失败自动切换备用下载路径 

### 3.3 数据还原模块

采用**真实运行环境还原**方案,规避直接逆向加密算法的高维护成本:

  • - 部署 **40+ Android 模拟器容器**(redroid),每个容器安装官方客户端 
  • - 通过流量代理,在传输层实现文件还原 
  • - adb 自动化驱动 App 完成处理操作,提取还原后的原生文件 
  • - 单机日处理能力可横向扩展

### 3.4 格式转换模块

基于 **webmscore**(WebAssembly 版 MuseScore 引擎)实现全离线批量转换:

  1. - 输入:MSCZ 
  2. - 输出:MSCX、MusicXML、PDF、MIDI、MP3 
  3. - 完全离线,零网络依赖,支持多进程并行

## 四、工程实践要点

### 4.1 自适应限速

固定速率的采集策略在面对动态限流时极易触发封控。我们实现了基于滑动窗口的自适应限速器:

```python
# 根据近期 429 比率动态调整 RPS
if error_rate_429 > 0.15:
    target_rps *= 0.8   # 降速 20%
elif error_rate_429 < 0.05:
    target_rps *= 1.1   # 提速 10%
```

实测有效将 429 率从 30%+ 压降至 13% 以内。

### 4.2 节点健康管理

代理节点并非全部可用,需要实时剔除失效节点:

  • - 每个节点维护独立的成功率统计 
  • - 连续失败超阈值自动进入冷却队列 
  • - 冷却期满后重新探活,动态恢复

### 4.3 任务幂等性

大规模采集必须保证任务可重入:

  • - 所有任务状态持久化到文件系统 
  • - 进程异常退出后重启自动跳过已完成任务 
  • - 去重逻辑覆盖本地文件、远程存储、内存三层

## 五、数据集成果

经过持续运行,系统累计产出:

| 指标 | 数量 |
|------|------|
| MSCZ 文件 | **220,626 首** |
| 覆盖乐器种类 | 50+ 种 |
| 元数据字段 | 15+ 个 |
| 可转换格式 | 6 种 |
| 采集 ID 库存量 | 644,273 个 |

数据集已按标准目录结构组织:

```
dataset/
├── [Composer_ID]_[Composer_Name]/
│   └── [Score_ID]_[Score_Title]/
│       ├── score.mscz
│       ├── score.mid
│       ├── score.mp3
│       └── meta.json
```

## 六、应用场景

本数据集可直接支撑以下 AI 任务:

  • - **音乐生成模型训练**:符号音乐 SFT 数据 
  • - **自动编曲**:多乐器编配样本 
  • - **乐谱识别(OMR)**:图像-结构对齐训练数据 
  • - **音乐理解**:调性分析、风格分类、难度评估

## 结语

大规模数据采集的核心挑战从来不是单点技术,而是**系统工程**:如何在反爬、加密、限速、规模三重压力下保持稳定吞吐。本项目从 0 到 22 万首的实践表明,合理的架构设计与工程细节打磨,是大规模数据工程成功的关键。

如有数据合作或定制采集需求,欢迎交流。