Compare Memo

音乐识别(自动转谱)实现方式与开源方案对比:Songscription × 10_music

2026-01-21 · for 10_music(产品/工程) · 结合 Songscription 调研 + 本仓库现状

从“音符识别”到“可读谱面”:把模型输出变成可练的谱,关键在谱面层与编辑层。

梳理自动转谱的典型流水线、开源可复刻栈,并对比 10_music 当前的 Demucs+Basic Pitch 路线,给出最值得补齐的能力与一条最小闭环下一步。

音乐AI转谱MIDIMusicXML开源对比复刻路线

要点

  • Songscription 的“识别音乐”= 音符级转录(audio→notes/MIDI) + 谱面层(Notation/Engraving);真正的产品壁垒多在后者:节拍/拍号/量化、连音线/分组/声部、可编辑工作台。
  • 你仓库(10_music)当前路径对齐“推荐 MVP 档位”:Demucs 分离 → Basic Pitch 转 MIDI →(你自写)后处理/可视化/导入 Reaper;优势是闭环快、工程可控,但离“可读可练的谱”还差一个谱面层。
  • 开源栈可分三类: ① 轻量 baseline(Basic Pitch / CREPE / pYIN) ② 钢琴强模型(bytedance/piano_transcription) ③ 研究级多轨(magenta/mt3) —— 三者都需要配套的量化/拍号/排版与 UI 才能像 Songscription 那样“导出 PDF/MusicXML”。
  • 最值得你参考的不是“换更强模型”,而是补齐中间层:beat/tempo/meter 推断 → note quantization → MusicXML 生成 → Web 渲染(OSMD/VexFlow)→ 人在回路编辑(最小操作集)。

识别音乐是怎么实现的(从调研线索抽象)

转录层(audio→notes)常见实现形态

  • Frame/Onset 模型:对时间×音高网格做多标签分类(onset/frame/offset),后处理成 note events。
  • Seq2Seq/Transformer:把音频编码为 token 序列,直接生成 MIDI-like 事件流(更像 MT3 的路线)。
  • 先分离再转录:Demucs/Spleeter 把混音拆 stems,再用 instrument-specific 模型做“选乐器转录”。

谱面层(notes→score)为什么难

  • 节拍/拍号:要把自由速度的演奏拟合到离散小节网格;错误会放大到整页谱面。
  • 可读性规则:连线/分组/声部划分/装饰音是“出版规则 + 语义省略”,很难纯模型端到端稳定产出。
  • 人在回路:最小可用产品通常靠“强编辑器 + 规则引擎”把模型输出变成可练的谱。

有哪些开源方案(按模块分层)

代表开源 强项 短板 / 代价
轻量转录 baseline spotify/basic-pitch 易落地、速度快;对旋律/和弦有不错的 note 召回;工程化体验好(CLI/ONNX) 默认不解决拍号/排版;多乐器混音靠分离;谱面级质量需大量后处理
钢琴转录 bytedance/piano_transcription 专注 solo piano 的精度与时值;适合作为“钢琴谱”质量上限参考 目标域窄;对非钢琴/混音不适配;推理成本与依赖更重
研究级多轨 magenta/mt3 多任务/多轨 token 化路线;更接近“端到端生成事件流” 工程复杂、算力要求高;落地需大量封装与评测;输出仍需要谱面层
工具箱(多任务) omnizart 同一套工具覆盖 vocal/drum/chord/beat 等;适合快速原型与补齐“节拍/和弦”信号 模型/依赖跨度大;不同任务质量参差;产品化要做统一接口与质量闸门
源分离(选乐器) facebookresearch/demucs / deezer/spleeter 显著提升“指定乐器转录”的可行性;对混音输入更鲁棒 分离伪影会传递到转录;成本上升;需要处理相位/响度一致性
节拍/量化(谱面层关键组件) CPJKU/madmom / aubio / librosa beat/tempo/downbeat 信号;把 note events 拉回小节网格的基础 对 rubato/复杂节奏易漂;通常要结合启发式与可编辑 UI
MusicXML / 渲染 / 编辑 OpenSheetMusicDisplay / VexFlow / music21 / partitura 把 MIDI 变成可视谱面;Web 侧渲染;规则/转换工具可复用 真正“出版级”仍需要大量规则与交互;TAB/GuitarPro 还要额外映射
把开源件拼成“Songscription-like”闭环(最小版)
  1. 输入:WAV/MP3 → 统一采样率 + 分段。
  2. (可选)分离:Demucs → 选择 vocals/piano 等 stem。
  3. 转录:Basic Pitch(MVP)或 piano_transcription(钢琴)或 MT3(研究)。
  4. 谱面层:beat/downbeat + 量化 + 规则(连线/分组/声部)→ MusicXML。
  5. 渲染与编辑:OSMD/VexFlow 渲染 + 最小操作集(改节拍/改时值/删错音)。

10_music 目前的“识别音乐”方式:优势 / 短板 / 对齐点

你已经做到了什么(可复现)

  • 分离:Demucs 一键分轨(Minimax轻音乐与分轨研究/scripts/demucs_one.sh)。
  • 转录:Basic Pitch 批处理把 stem 转 MIDI(basic_pitch_batch.sh,输出到 MIDI/basic_pitch_output/)。
  • 后处理:针对 vocals/bass 单声部化、合并碎片、过滤噪音(midi_best_postprocess.py)。
  • 可视化/导入:多轨 MIDI → piano roll HTML/PNG、以及一键导入 Reaper(midi_lab.py2_edit/Reaper/*)。

与 Songscription 的差距(主要是“谱面层”)

  • 节拍/拍号:当前以“绝对时间戳 note events”居多,缺少 meter / quantization 的统一规则与编辑入口。
  • MusicXML/PDF:仓库以 MIDI/piano roll 为主;要导出谱面,需要从 MIDI 构建小节、时值、连线等。
  • 在线编辑:你有 Reaper(音频/MIDI 时间线),但还没有“谱面编辑工作台”(面向练琴/读谱)。
能力模块 Songscription(推断) 10_music(现状) 开源可补齐
Stem/选乐器 ◑(宣称 direct transcription) ✅(Demucs 分离) Demucs/Spleeter + UI 选择
audio→MIDI ✅(自研 Transformer) ✅(Basic Pitch) Basic Pitch / piano_transcription / MT3
量化/拍号/连线 ◑(评测显示不稳定) ❌(尚未形成谱面规则层) madmom/aubio + music21/partitura
可视化 ✅(谱面 + piano roll) ✅(piano roll HTML/PNG) OSMD/VexFlow(谱面)
编辑工作台 ✅(在线编辑) ◑(Reaper 时间线编辑) Web 谱面编辑器(最小操作集)
导出 ✅(PDF/MusicXML/MIDI/GP) ✅(MIDI/WAV) MusicXML/GP:需要映射与规则

不同方案的优劣势(面向你的仓库)

方案 最适合 收益 代价 关键风险 第一步
A. 保持 Basic Pitch,补谱面层(推荐) 你要最快做出“能看谱/能练”的闭环 在你现有栈上增量演进;对齐调研结论:产品核心在编辑层 需要做 meter/quantize/engraving 规则与 UI 节拍推断不稳导致用户感知差 先只做 solo piano:MIDI → MusicXML → OSMD 渲染
B. 钢琴改用 piano_transcription + 同样补谱面层 你明确聚焦钢琴谱质量(单乐器) 转录层上限更高,减少“错音/碎音” 模型/依赖更重;域外输入不适配 以为换模型就能出好谱,忽略谱面层 用同一批样本做 AB:Basic Pitch vs piano_transcription
C. 研究级:MT3 多轨 + 工程封装 你要多乐器/多轨的长线能力 更接近端到端生成事件流;潜在更强泛化 工程化成本最高;算力与部署复杂 投入大,短期不一定提升用户体验 先做离线 batch + 评测,别先做 UI

证据与确定性(避免“把推断当事实”)

结论 证据 确定性
Songscription 的瓶颈主要在节奏/拍号与谱面可读性 调研报告引用的第三方评测(MusicRadar)与“Transcription vs Notation”分层一致 High
Songscription 使用 Transformer-based 自研模型 + 合成数据占比高 调研报告整理的官方 blog / 媒体报道线索(无法在本次离线环境再核验) Med
10_music 现状对应“Demucs + Basic Pitch + 后处理 + 可视化” 仓库脚本与产物路径可直接验证 High

一个下一步动作(最小闭环)

目标:让 10_music 产出第一张“可读谱面”(哪怕很粗糙),把问题从“模型不够强”变成“哪些编辑动作最常见”。

  1. 先选 solo piano 的 30–60 秒样本(避免混音与多乐器)。
  2. 用你现有链路得到 MIDI(Basic Pitch 或 piano_transcription)。
  3. 补 2 个最小谱面规则:tempo/beat(可用 madmom/aubio/librosa 先给粗 beat) + quantize(把 start/end 对齐到网格)。
  4. 把量化后的结果导出到 MusicXML(用 music21/partitura 做转换/构建小节)。
  5. 用 OSMD 在浏览器渲染;只做 3 个编辑操作:改拍号 / 拖动音符时值 / 删除错音。

Sources

先做出第一张“能读的谱”,再决定要不要换更强的模型。
— One next action