Simon Edwardsson 把一件听上去很奢侈的事做成了免费 App:你在 MIDI 键盘上弹几个小节,模型接着往下弹。
不联网、不排队、不烧 token——全部推理在手机本地跑完,iPhone 15 上的速度是 108 个音符/秒。
这个 App 叫 RollTab,已经上架 App Store。作者给它的定位很直白:GitHub Copilot,但用在钢琴上。

125M 是怎么够用的:一次生成一整个音符
大模型时代听到 125M,第一反应通常是"这能干什么"。
关键在于 tokenization 换了个思路。常规做法是把音高、时值、力度拆成独立 token 依次生成——一个音符要跑四次 transformer。作者改成了四元组:
NOTE(pitch, delta_onset, duration, velocity)
五个分类字段各有自己的 embedding,加起来送进模型,一次前向就推进一整个音符。作者的原话是,transformer 不再花四次生成一个音符的各项属性,而是"一次把音乐往前推进一个完整音符"。
这一下把序列长度压掉了近四分之三。实时性就是这么挤出来的。
架构本身没什么花活:decoder-only transformer,RMSNorm、旋转位置编码、因果自注意力、SwiGLU。真正的差异在数据表示上。

模型练了三档:33M、64M、125M。端上跑的是最大那档。
最反直觉的一条:数据翻 5 倍,效果反而更差
训练素材是几十万个 MIDI 文件,约 3 亿个音符事件,主要来自公共领域的古典乐。
然后作者做了件很多人不会做的事——把数据集扩大到 5 倍,结果效果变差了。
于是反向操作:钢琴曲筛选、多轨过滤、音符密度和音域覆盖过滤、指纹去重、版本归并,一层层砍。清洗比堆量更管用,这是整篇里最值钱的一条经验。
第二条反直觉的,是验证损失会骗人。交叉熵降下去了,实际听感却没跟着变好。作者用的办法是拿 Gemini 做成对比较,专门针对"续写质量"提问——绝对分数不管用,两两对比才分得出高下。
第三条更拧巴:训练时按一定概率把模型自己预测的音高喂回去(从 0% 逐步升到 50%),验证损失反而升高,续写质量却变好了。
真正拉开差距的是 DPO。上了偏好优化之后,成对偏好分从基础模型的 24.55% 提到了 69.05%——作者说这是预训练之后"差别最大的一步"。

端上部署走的是 Core ML + INT8 权重量化。训练上下文是 512 个音符,实际弹奏时保留最近 384 个、需要时重建 KV cache,所以弹多久都不会断。
钢琴家当场挑刺:像一句没有句号的话
Show HN 上这条拿了 595 分、118 条评论,热闹是热闹,但分歧很明显。
弹古典的那批人挑得最狠。有人直接从和声上开刀,说这段续写里一个半终止都没有,在古典作曲的耳朵里,像是"音乐版的一句流水句"——从头到尾不换气。
也有人把它按在地上比:「结果和马尔可夫模型差不多,甚至更差。我觉得这暴露了 LLM 和音乐之间的理解鸿沟。」
一位古典钢琴家的评价更冷静,说到了点子上:「剩下的只有品味。而品味的大部分,来自不断探索、再把那些走不通的路一条条杀掉。」
当然也有另一边。有人说"入行 AI 这么多年,还是觉得这个应用很神奇";也有人提了个更实际的需求——我弹旋律,你给我配个像样的巴洛克风格三四声部伴奏。
作者自己没有硬撑。有人说节奏和曲式还有很大改进空间,他回:「大概到了 GPT-2 的水平:好到可以拿出来分享,但要改的地方还很多。」
有人问能不能牺牲速度换质量——反正没人真能一秒弹 108 个音符。作者说规划步骤已经在 TODO 上了,还想试试并行生成几条续写再挑最好的那条。

值不值得装,取决于你想拿它干嘛
先说清楚门槛:要用得起来,得有一台 MIDI 键盘。光有 iPhone 打不开这个玩法。
如果你是想要一个能出活的作曲工具,按现在的水平,大概率会失望——作者自己都说了只到 GPT-2,古典耳朵能听出的毛病是真实存在的。
但如果你卡在"弹了四小节,不知道往哪儿走"的时候,它给的是一个不用等、不用联网的下一句。这跟写代码时用补全是同一种用法:不是替你写,是帮你跨过空白页那一下。
对做 AI 的人来说,这个项目里更值钱的其实不是钢琴。
一个 125M 的模型,靠换掉数据表示把四步压成一步,再靠狠清洗和 DPO 把质量拉起来,最后用 Core ML 量化塞进手机做到实时——这条路线上没有一步依赖更大的参数量。
在所有人都盯着千亿参数的时候,垂直领域 + 端侧 + 小模型这条线,能做的事比想象的多。
评论区