【免费下载链接】NoteLite
Open-source OMR and guided music practice: turn sheet music PDFs/images into MusicXML/MIDI, refine scores, and practice with MIDI or microphone feedback.
NoteLite 是一款开源的 OMR(Optical Music Recognition,光学乐谱识别)工具,能把乐谱 PDF / 图片转成 MusicXML 和 MIDI,并支持带反馈的练琴。但它的识谱引擎运行在 Java 21 上,手机上的原生客户端无法本地执行。今天这篇指南就带你用仓库自带的 Python 桥接服务,从零搭建一套云端识谱服务:约 20 分钟完成构建、启动、令牌鉴权、HTTPS 反代配置,并跑通真实乐谱验证。
💡 一句话理解架构:
Python HTTP 服务→按需拉起 Java 子进程→真实 OMR 引擎识谱→返回 MusicXML / MIDI 下载。整个流程见 bridge/README.md。
一、为什么需要云端识谱服务 🎯
NoteLite 提供两类使用方式:
| 方式 | 说明 |
|---|---|
| 桌面客户端 | 在本机直接运行 Java 引擎,完成识别、校谱、导出 |
| 原生 iPhone / iPad / Mac 客户端 | 只负责上传原稿、跟踪任务、下载结果和练习,识谱必须发送到服务器完成 |
也就是说,苹果客户端(见 apple/README.md)必须配置一台"能被手机访问到的服务器"。这套服务器正是仓库中bridge/目录下的 Python 桥接服务——仅用 Python 标准库实现,无需pip install,源码只有约 470 行,位于 bridge/notelite_bridge.py。
二、环境准备:3 个前置条件 ✅
开始之前,请确认服务器(Windows / macOS / Linux 均可)满足:
- Python 3.10+:桥接服务仅依赖标准库;
- JDK 21:引擎启用了 Java 21 预览特性,不能换成其他主版本运行;
- 与本机平台一致的 NoteLite 分发包(稍后用 Gradle 构建),以及与桌面版相同的 OCR 语言数据。
将仓库克隆到服务器:
git clone https://gitcode.com/gh_mirrors/no/NoteLite cd NoteLite三、两步构建:产出与平台匹配的识谱引擎 🛠️
桥接服务不会自己下载任何东西,也不会"模拟识谱",它调用的就是你构建出来的真实引擎。在仓库根目录执行:
# macOS / Linux bash ./gradlew :app:installDist # Windows PowerShell .\gradlew.bat :app:installDist构建完成后,app/build/install/app目录中会包含lib/notelite.jar及全部依赖。注意:分发包与操作系统、CPU 架构绑定,Apple Silicon 的包不能拿到 Windows 上跑,反之亦然。
四、生成访问令牌并启动桥接服务 🔐
服务使用"共享 Bearer 令牌"鉴权:所有任务接口必须携带令牌,令牌要求至少 32 个无空白 ASCII 字符。
# 生成一个随机令牌并写入环境变量 export NOTELITE_BRIDGE_TOKEN="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')" # 启动服务 python3 bridge/notelite_bridge.py --distribution app/build/install/app --storage bridge/.notelite-bridge如果 JDK 21 不在PATH中,追加--java /绝对路径/bin/java。服务的关键参数及默认值如下(详见 bridge/README.md):
| 参数 | 默认值 | 含义 |
|---|---|---|
--host | 127.0.0.1 | 默认仅监听本机,建议前置 HTTPS 代理 |
--port | 8765 | HTTP 端口 |
--storage | bridge/.notelite-bridge | 输入、输出、任务状态和日志目录 |
--heap | 4g | 每个识谱 Java 进程的最大堆内存 |
--timeout | 600 | 单个 Java 进程的超时秒数 |
--queue-size | 4 | 活动任务之外的排队容量 |
--max-jobs | 100 | 保留任务的最大数量(含已完成) |
启动成功后,可用健康检查确认服务在线(该接口无需鉴权):
curl http://127.0.0.1:8765/v1/health # 期望输出:{"status": "ok"}五、API 一览:从上传乐谱到下载结果 📤
桥接服务对外提供一套简洁的 REST 接口(除健康检查外均需Authorization: Bearer <令牌>请求头):
| 接口 | 方法 | 作用 |
|---|---|---|
/v1/health | GET | 健康检查,无需鉴权 |
/v1/jobs?filename=<URL编码文件名> | POST | 上传原稿(请求体即文件字节),返回任务id |
/v1/jobs/{id} | GET | 查询任务状态:queued/running/succeeded/failed |
/v1/jobs/{id}/artifacts/{name} | GET | 下载识别产物(MusicXML / MIDI 等) |
/v1/jobs/{id} | DELETE | 删除已完成或失败任务,释放存储 |
典型调用流程只需四步:
- 上传:
POST /v1/jobs?filename=chula.png,成功返回202和任务id。支持.pdf、.png、.jpg、.jpeg、.tif、.tiff,单文件1 字节 ~ 25 MiB,且文件签名必须与扩展名一致; - 轮询:每约 2 秒查询一次
GET /v1/jobs/{id},直到状态变为succeeded或failed; - 下载:根据返回的
artifacts列表逐个下载 MusicXML(.mxl/.musicxml)、MIDI 等产物; - 清理:本地保存结果后
DELETE任务。注意任务没有自动过期,达到--max-jobs上限后必须删除旧任务才能继续上传。
上传过程中服务还会做多重校验:文件名不能含路径分隔符、拒绝 chunked / 压缩传输、核对文件头魔数,避免"披着 PDF 皮的恶意文件"进入引擎。
六、安全配置:用 HTTPS 反代保护你的令牌 🔒
桥接服务本身只提供HTTP,而且令牌是一个共享凭证——持有令牌的人可以读取、删除已知 ID 的任务。因此官方明确建议:不要把携带令牌的明文 HTTP 直接暴露到公网。正确姿势是加一层 HTTPS 反向代理(Caddy / nginx / 已有网关均可),以 Caddy 为例:
omr.example.com { request_body { max_size 26214400 } reverse_proxy 127.0.0.1:8765 }再把https://omr.example.com和同一个令牌填入苹果客户端即可。以下是建议的安全清单:
- ✅令牌即凭证:随机生成、妥善保存、绝不提交到 Git;
- ✅最小暴露面:服务默认监听
127.0.0.1,仅通过代理对外提供 HTTPS; - ✅专用账户运行:建议用独立系统账户运行服务,存储目录仅该账户可访问;
- ✅资源限制:Java 子进程隔离不等于系统沙箱,公开部署时建议再叠加操作系统或容器的资源限制;
- ✅代理保留
Authorization请求头,并让上传体积上限与服务的 25 MiB 对齐。
七、验证部署:单元测试 + 真实乐谱冒烟测试 🧪
部署后建议跑两层验证。第一层是用测试专用替身引擎跑 HTTP 全流程(覆盖上传、鉴权、下载、删除、队列容量、超时等边界,见 bridge/tests/test_bridge.py):
python3 -m unittest discover -s bridge/tests -v第二层是真实引擎冒烟测试:它构建临时服务、上传仓库自带乐谱、轮询任务、下载并校验 MusicXML / MIDI,最后删除任务(脚本入口 bridge/smoke_real_engine.py):
python3 bridge/smoke_real_engine.py📌 提醒:以上测试验证的是"服务链路"而非 OMR 准确率。每份任务的引擎日志保存在
<storage>/<id>/engine.log,识别失败时可结合任务返回的error字段排查。
八、常见问题速查 🆘
| 现象 | 可能原因与处理 |
|---|---|
上传返回401 | 令牌缺失或不匹配;确认客户端与服务端使用同一个令牌 |
上传返回415 | 文件签名与扩展名不符(如.png里实际是 JPEG),换正确扩展名 |
上传返回413 | 超过 25 MiB 上限,压缩或裁剪原稿 |
上传返回503+Retry-After: 5 | 队列已满或任务存储已满,稍后重试或删除旧任务 |
任务failed且提示未产出 MusicXML | 扫描件质量不佳或引擎异常,查看engine.log |
| 启动即报版本错误 | 必须使用 JDK 21,且分发包要与本机平台一致 |
写在最后 🎉
至此,你已经拥有了一个完整的 NoteLite 云端识谱服务:Python 桥接负责接入与调度,Java 引擎负责真实识谱,HTTPS 反代负责安全边界。下一步可以把服务地址和令牌配置进 iPhone / iPad / Mac 原生客户端,在手机上完成"扫描 → 识别 → 下载 MusicXML → 陪练"的闭环;更多细节可查阅 bridge/README.md 与 apple/README.md。祝你部署顺利,早日让手机成为随身识谱工具!
【免费下载链接】NoteLite
Open-source OMR and guided music practice: turn sheet music PDFs/images into MusicXML/MIDI, refine scores, and practice with MIDI or microphone feedback.
相关推荐
Grasscutter 服务器搭建与客户端接入完全指南:从零部署、代理配置到源码原理
Grasscutter 服务器搭建与客户端接入完全指南:从零部署、代理配置到源码原理 Grasscutter 是一个对某款热门动漫风格游戏的服务器端重实现开源项
游戏开发后端十条蛍LoRA云部署:云端AI服务搭建指南
十条蛍LoRA云部署:云端AI服务搭建指南 概述 十条蛍(Hotaru Jujo)的LoRA(Low Rank Adaptation)模型集合是目前AI绘画领域
Prisma Cloud + AWS RDS 实战指南:从零搭建云端 Prisma 集群并部署服务
Prisma Cloud + AWS RDS 实战指南:从零搭建云端 Prisma 集群并部署服务 导读 本文基于 Prisma 官方文档,完整讲解如何将 Pr
后端数据库GraphQL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考