## 前言
随着音乐生成大模型的快速发展,高质量、结构化的符号音乐数据成为稀缺资产。本文记录了我们团队从零搭建 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 引擎)实现全离线批量转换:
- - 输入:MSCZ
- - 输出:MSCX、MusicXML、PDF、MIDI、MP3
- - 完全离线,零网络依赖,支持多进程并行
## 四、工程实践要点
### 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 万首的实践表明,合理的架构设计与工程细节打磨,是大规模数据工程成功的关键。
如有数据合作或定制采集需求,欢迎交流。