我做了一个「简谱唱名标注工具」:自动识别音符,一键给歌谱加 do re mi
文章目录为什么要给简谱加唱名核心功能技术实现思路1. 桌面应用结构2. 音符识别流程3. 为什么要“去高低音点”4. 阈值为什么要实时调整5. 手动补标设计6. 预览与导出保持一致7. 工程保存与缺图找回8. 单文件打包使用场景一个简单示例关注作者学简谱、教唱歌、带合唱排练时经常会遇到一个很现实的问题谱子上只有1 2 3 4 5 6 7初学者要一边看数字、一边反应唱名很容易卡顿。所以我做了一个桌面小工具导入一张简谱图片软件自动识别里面的数字音符并在音符上方或下方标注对应唱名1 - do 2 - re 3 - mi 4 - fa 5 - sol 6 - la 7 - si标注完成后可以直接导出一张与原图同尺寸的新图片用于打印、分享、课堂教学或排练。演示视频https://www.bilibili.com/video/BV1TaTn6tEkd为什么要给简谱加唱名简谱本身很轻便但对初学者来说数字和唱名之间还需要一次转换。比如看到5 6 5 3 2 1熟练的人会自然唱出sol la sol mi re do但刚开始学习的人往往会停下来想。给简谱加唱名有几个直接好处降低入门门槛初学者可以更快建立数字音符和唱名之间的对应关系。提高练唱效率适合自学复习导出的图片可以保存到手机、平板或打印出来。帮助建立音高感觉长期看数字和唱名对应能更快形成相对音高记忆。这个工具不是替代视唱练耳而是把“认音符”的机械步骤先帮你减轻一点让注意力更多放在旋律、节奏和表达上。核心功能目前工具已经支持这些常用流程打开多张图片也可以拖拽图片到软件界面。支持jpg/jpeg/png/gif/bmp/tiff/webp等常见图片格式。自动识别简谱里的数字音符1-7。默认标注do re mi fa sol la si也可以改成音名、中文或自定义文本。可设置唱名显示在音符上方或下方。可调整距离、字体、字号、粗细、颜色和透明度。每张图片的参数独立保存切换图片不会互相影响。支持识别前去掉高音点、低音点减少带点数字识别干扰。支持识别阈值实时调整快速过滤低置信度结果。支持手动补标鼠标跟随预览左键放置滚轮切换1-7。支持右键点选删除或右键框选批量删除误识别标注。支持CtrlZ撤销也有工具栏撤销按钮。支持保存工程下次继续编辑。打开工程时如果图片丢失会灰色显示可重新浏览同尺寸图片找回。导出图片保持原图尺寸默认保存到原图目录文件名自动追加日期避免覆盖。批量导出多张歌谱。工具栏和导出完成弹窗内嵌作者二维码方便关注。技术实现思路这个工具的目标很明确普通电脑也能跑最好不依赖云端服务最终能打包成一个单文件可执行程序。因此整体方案采用桌面界面Tkinter图片处理Pillow本地 OCRRapidOCR ONNX Runtime候选补漏OpenCV与模板匹配思路打包发布PyInstaller单文件 exe1. 桌面应用结构应用主界面由几个区域组成顶部工具栏打开图片、打开工程、保存工程、撤销、识别音符、导出当前、批量导出、使用说明等。左侧图片列表管理多张歌谱图片支持右键删除和缺图找回。中间画布显示原图和唱名标注效果。右侧参数面板调整唱名映射、位置、字体、颜色、透明度、识别阈值、手动模式等。内部数据大致可以理解为三层ImageDoc - 图片路径 - 原始图片对象 - 当前标注列表 - 是否缺失 NoteLabel - 数字音符 - 音符坐标 - OCR 置信度 - 是否隐藏 ImageSettings - 唱名映射 - 上方/下方 - 距离 - 字体、字号、粗细 - 颜色、透明度 - 阈值 - 是否去高低音点 - 手动模式当前数字这样做的好处是每张图片都有自己的状态。打开多张歌谱时第一张图调成红色大字第二张图调成蓝色小字互不影响。2. 音符识别流程简谱识别看起来像“识别数字”但实际比普通 OCR 麻烦一些。因为歌谱里会有连续数字比如555、067高音点、低音点下划线、连音线、小节线歌词汉字标题、调号、拍号扫描噪点和纸张阴影所以识别流程分为几步原始图片 - 可选去掉高音点/低音点 - RapidOCR 本地识别数字文本 - 对连续数字拆分成单个音符候选 - OpenCV/Pillow 候选检测补漏 - 根据谱面行位置过滤 - 去重合并 - 根据阈值显示有效标注优先使用 RapidOCR是因为它对真实扫描图中的数字串识别更稳尤其是连续数字。OpenCV 和 Pillow 主要用于补充一些 OCR 漏掉的小数字候选。3. 为什么要“去高低音点”简谱里常见的高音、低音标记是在数字上方或下方加点。对人来说这很自然但对 OCR 来说这些点可能会干扰数字轮廓。比如带点的1可能被识别成别的符号带点的5也可能降低识别置信度。所以工具在识别前提供了“去掉高低音点”的预处理。它只作用于识别过程不会修改原图也不会影响最终导出的歌谱画面。简单说就是给 OCR 看一张更干净的图 给用户导出时仍使用原始歌谱这在扫描版、拍照版歌谱上会比较有用。4. 阈值为什么要实时调整OCR 会给每个识别结果一个置信度。阈值低识别结果更多但误识别也会变多阈值高结果更干净但可能漏掉一些音符。所以工具没有把阈值写死而是做成可调参数并且调整后实时影响预览。这相当于给用户一个“筛选旋钮”谱子干净可以把阈值调低一点尽量多识别。谱子复杂可以把阈值调高一点先减少误标。少量漏标再用手动模式补上。5. 手动补标设计自动识别不可能 100% 完美尤其是老歌谱、扫描模糊、背景复杂的图片。所以这个工具没有只做“自动识别”而是把手动编辑也做成核心功能开启手动模式后鼠标旁会显示当前待放置的数字和唱名。鼠标滚轮可以在1-7之间切换。左键点击即可放置唱名。右键点击可删除标注。右键拖拽可以框选批量删除。这个交互的重点是“直观”。用户不用猜点击后会发生什么鼠标移动时已经能看到最终标注大概是什么样。6. 预览与导出保持一致这类工具很容易出现一个问题预览看着没问题导出后位置、颜色或透明度却不一样。为了解决这个问题预览和导出都基于同一套标注参数同一套坐标换算同一套字体选择同一套颜色与透明度同一套上方/下方距离计算同一套唱名映射导出时使用原图尺寸重新绘制标注所以最终图片不会因为预览缩放而损失清晰度。7. 工程保存与缺图找回很多时候用户不是只处理一张图而是处理一组歌谱。中途关闭软件后下次还要继续调整。所以工具支持保存工程。工程文件记录图片路径每张图片的独立参数自动识别结果手动添加的标注被隐藏或删除的标注状态如果下次打开工程时图片文件移动了软件不会直接崩溃而是在列表中灰色显示并允许用户右键“浏览图片”找回。为了避免误匹配找回图片时要求尺寸一致。这样可以保证原来的标注坐标仍然能准确落在对应音符上。8. 单文件打包为了让普通用户不用安装 Python最终使用 PyInstaller 打包成单文件 exe。打包后会把这些内容一起带进去Python 运行时Tkinter 应用代码RapidOCR/ONNX Runtime 依赖Pillow/OpenCV 等图片处理依赖作者二维码应用图标用户拿到唱谱标注工具.exe后直接双击运行即可。使用场景这个工具比较适合声乐老师给学生准备练唱谱合唱团排练前整理分发资料简谱初学者自学音乐兴趣班教学它不是一个复杂的专业制谱软件而是一个偏实用的小工具把已有图片快速加工成更适合“唱”的版本。一个简单示例假设我们导入一张《海阔天空》的简谱图片点击“打开图片”或直接拖入图片。点击“识别音符”。根据识别结果调整阈值。设置唱名显示在上方距离调到合适位置。选择字体、字号、颜色和透明度。对误识别的地方右键删除。对漏识别的地方开启手动模式补标。点击“导出当前”或“批量导出”。最后得到的就是一张带唱名的新歌谱图片尺寸和原图一致可以直接打印或分享。关注作者欢迎关注作者公众号回复简谱标注免费获取工具