【生活娱乐】极意钢琴(Pianoesis)-钢琴音乐沉浸式播放演奏软件

0、自我介绍

我是一名热爱音乐的IC设计师。要弹好钢琴很难很难,但我想随时随地凭感觉动动手指就能弹出如真钢琴般的美妙音乐,便早早萌生了极意钢琴的念头,只是因为不会coding所以也只是想想。幸运的是我终于在今年二月遇到了TRAE,变成了我第一个也是唯一用过的vibecoding工具。TRAE x 极意钢琴,给了我一段奇妙的人生体验。


一、一句话定位

让系统听懂钢琴、看懂声部、陪你弹琴。 不用考虑手指的位置,不用关心两只手怎么合,可以选择弹旋律还是伴奏,极意钢琴就是你的另一只手。自研声部分离算法,音轨映射,音符编辑三管齐下,实现对钢琴曲双手双声部的合理分配。让钢琴音乐在极意钢琴里,不只可以听可以看,还可以被所有喜欢的人演奏。

极意:自在极意,本能演奏
noesis:直接领悟,直抵人心


二、核心数据

指标 数值
声部分离方案迭代 A → P 共 16 个方案
对标学术基线 5 套 199 首测试集(测试集1~5,见下文定义)全面超越学术基线HMM(Note-F1 + VTA 双指标):MCMA Inventions测试集 F1=0.9942
内置曲库 135 首公版(版权三重审核);支持上传任意 MIDI / 钢琴音频,曲库无限扩展
产品形态 3 种(Web /Windows 单机/移动端 WASM)
TRAE AI 对话 5700+ 条(23 个 Session ID 全程可核验)
Git commits 178 次
源文件 104 个(Python 85 + Vue 11 + JS 8)
Git覆盖周期 5/30 ~ 7/30,62 天

双显示模式 × 双弹奏模式 × 双声部分离系统 × 多端覆盖

三、产品演示视频 + 30 秒速体验

5.82 复制打开抖音,看看【恰空的作品】极意钢琴(Pianoesis)-钢琴音乐沉浸式播放… https://v.douyin.com/aCL-8psBhG4/ H@V.yG 04/02 OXZ:/ :9pm

打开网址 → 登录 → 开机动画(5键琶音→阴阳图)
    ↓
首页任意键/触摸 → 随机弹奏热身曲目(你弹旋律,系统弹伴奏)
    ↓
点击曲名 → 进入操作台(音高图 + 回放控制 + 声部分离)
    ↓
切换弹奏模式 → 选择曲目 → 弹奏 → 实时评分

:camera_with_flash: 截图:首页全貌(阴阳图 Logo + 热身提示 + 135 首曲库入口)

:camera_with_flash: 截图:操作台全貌(音高图 + 控制栏)

四、三大技术突破

突破 1:声部分离——全面超越学术基线 HMM, 和标准SOTA GMTT接近

MIDI声部分离学术基线简介

基线 来源 特点 短板
HMM (学术基线,传统SOTA) McLeod 2016 经典基线,Java 开源实现,本地可复现 多声部输出,无法根据双手分配双声部;长乐谱计算复杂度爆炸
GMTT (新一代标准SOTA) IJCAI 2023 需 GPU 训练;高密度赋格、多层声部大量交叉缠绕最优;未公开训练参数 多声部输出,无法根据双手分配双声部; 演奏录音转的带噪声 MIDI精度衰减明显;

自研 16 方案迭代(A→P),最终 P 方案在 5 个测试集、199 首曲目上 Note-F1 和 VTA 双指标全面超越经典 HMM 声部分离算法:

测试集 说明 曲目数 P 方案 F1 HMM F1 P 方案胜
测试集1 MCMA Inventions 15 0.9942 0.9919 :white_check_mark:
测试集2 公版曲目二声部谱转 MIDI 45 0.8468 0.8262 :white_check_mark:
测试集3 转录 MIDI 18 0.9381 0.8201 :white_check_mark: (+0.1180)
测试集4 多风格曲目二声部谱转 MIDI 50 0.8951 0.8719 :white_check_mark:
测试集5 公版曲目多声部谱转 MIDI 71 0.8726 0.8449 :white_check_mark:

自研方案设计即根据钢琴双手特征合理分配双声部,而基线方案均为多声部输出。为了公平对比,以上HMM测试数据结果均已做多声部穷举组合取最优得分的方式(实际在未知golden双轨的情况下不可行)。对比方案HMM,方案P无长乐谱计算复杂度爆炸的问题。方案P测试集1 F1=0.9942,仅差 GMTT(ICJAI 2023 论文)报告值 0.0008,且 P 方案无需 GPU、支持演奏 MIDI——实用性全面优于学术基线和标准SOTA。

P 方案自适应路由:谱面 MIDI 走 O 方案(F 基底 + Bplus 门控融合),演奏 MIDI 走 M 方案(K 节奏驱动 + L 规则基底 + 转录 onset 修正),两种路径在 P 方案中统一。

前置环节——伪音过滤(转录 MIDI 预处理)

音频转录模型(piano-transcription-inference)输出的 MIDI 中会包含大量"伪音"——模型误检的幽灵音符(如泛音误判、踏板抬起瞬间的噪声、极低置信度的猜测)。这些伪音若不过滤直接送入声部分离,会严重干扰节奏特征分析和声部判定。

  • 11 条规则过滤:覆盖极短时值/极低 velocity/孤立即死/同音重复抖动等模式
  • 谱面 MIDI 不受影响:谱面 MIDI 不含 detection_info,过滤规则不触发;转录 MIDI 必须先过滤再分离

:camera_with_flash: 截图:声部分离前后对比(同一曲目,分离前单色 vs 分离后左右手双色)

分离前

分离后

突破 2:弹奏引擎——自由速度模式和弹性速度模式

自由速度模式:想要完全自由就选自由速度模式,速度完全由你掌握

弹性速度模式:想要行云流水或是追求张弛有度就选弹性速度模式,给你局部的自由却不失整体速度的骨架,即Rubato

配合四种延音控制策略(MIDI 与原声延音配合、音源爆音四轮修复、无踏板自然延音补偿、对位织体自动取消延音),实现"弹奏体验接近真实钢琴"。

三大弹奏特性

特性 极意钢琴 传统钢琴教学产品
位置无关 只判断"弹/没弹",不关心手指位置和按键位置;对琴键无要求(不吃硬件) 必须指定时间+指定手指+指定琴键;对琴键数量大小有空间要求(硬件限制)
零压力 不强制时间/音符/位置,同步非必须 任务驱动,必须按谱/跟拍/用对指法
原声作为音源 上传原声音频作为音源 → 原声根据弹奏节奏走 只能用合成/钢琴音色

突破 3:音轨映射——重复段识别 + 智能对齐

加载参考 MIDI(如自带双声部音轨的谱转MIDI),自动将音轨和小节线映射到目标MIDI(如单轨的演奏音频转MIDI)。核心技术是重复段识别算法

  • 四步算法:小节切分 → 5 维特征(pitch class/轮廓/低音/onset 密度/和声骨架)→ 自相似矩阵 + 对角线段检测 → 段标注(AABB/ABAB/ABA)
  • Chromagram 回退 + Novelty 边界检测双重回退
  • 识别后自动裁剪重复段,典型场景匹配率从 ~50% 提升到 ~95%

:camera_with_flash: 截图:音轨映射界面(参考 MIDI 叠加在用户演奏上 ,并显示匹配度)

三条路径,帮用户快速实现对钢琴曲双手双声部的合理分配

三条路径不是孤立的功能,而是为同一个目标服务:让用户从单一音轨快速找到最适合自己的弹奏声部方案

三条路径

路径 适用场景 做法 投入
① 声部分离 拿到一首新曲子,想立刻开始弹 算法自动分左右手(199 首回归保障准确率),秒级出结果 零手动
② 音轨映射 有参考 MIDI(如自带双声部音轨的谱转MIDI),想照着弹 加载参考 MIDI,重复段智能对齐 加载一个文件
③ 音符编辑 路径1或路径2出现个别音分配不合适,或想自定义声部分配 手动微调 按需微调

三条路径层层递进:零门槛起步(分离)→ 有参考时对齐(映射)→ 想改就改(编辑),无论用户是"只想随便弹弹"还是"精雕细琢找最优解",都能快速进入弹奏状态。

工程保障

  • 科学性:声部分离有 199 首五测试集回归保障,音轨映射有重复段识别算法支撑——不是"拍脑袋"分轨
  • 编辑零卡顿:原地改属性 + 增量重绘,编辑单个音符不触发全量重算(从 8 秒卡顿降到即时响应)
  • 全链路不离开软件:从输入(MIDI/音频上传)→ 分离 → 映射 → 编辑 → 弹奏 → 评分 → 导出,每一步都在极意钢琴内完成

竞品只能"用现成乐谱跟弹",极意钢琴让用户从任意输入快速找到专属弹奏解


五、技术架构

┌────────────────────────────────────────────────────────────┐
│                        用户浏览器                           │
│  ┌──────────────────────────────────────────────────────┐  │
│  │  Vue 3 前端(Vite 6 构建)                            │  │
│  │  ├─ 钢琴卷帘音高图(Canvas,RAF 渲染)                │  │
│  │  ├─ Tone.js 音频合成(Salamander 钢琴采样)           │  │
│  │  ├─ 弹奏引擎(自由/弹性 + 评分 + 延音)         │  │
│  │  ├─ 热身模式 + 音符飞出特效(Canvas 粒子)            │  │
│  │  └─ i18n 中英双语                                    │  │
│  └──────────────────┬───────────────────────────────────┘  │
└─────────────────────│ HTTP/JSON ───────────────────────────┘
                      ▼
┌────────────────────────────────────────────────────────────┐
│  nginx                                   │
│  ├─ 静态资源:dist/(gzip + immutable 长缓存)              │
│  ├─ auth_request 全站 Cookie 认证守卫                       │
│  ├─ 安全策略:.py/.pth/.sh 404、/py/ 403、安全响应头        │
│  └─ /api/* 反向代理 → 127.0.0.1:5000                        │
└─────────────────────┬──────────────────────────────────────┘
                      ▼
┌────────────────────────────────────────────────────────────┐
│  gunicorn 4 workers → Flask 后端(systemd 守护)            │
│  ├─ MIDI 解析(mido)+ 解析缓存                             │
│  ├─ 声部分离引擎(自研多方案,默认 P)+ 分离结果缓存        │
│  ├─ 伪音过滤器(fake_note_filter,与前端逻辑精确一致)      │
│  ├─ 对位织体检测器(contrapuntal_detector)                │
│  ├─ 音频转录(piano_transcription_inference / PyTorch CPU)│
│  │    异步任务队列,单线程执行,并发返回 409 BUSY            │
│  ├─ HMAC-SHA256 Cookie 认证签发/校验 + 登录频率限制         │
│  └─ 日志轮转(1MB × 3,WARNING 级)                         │
└────────────────────────────────────────────────────────────┘

核心技术栈:Vue 3 + Vite 6 + Tone.js + Canvas + Flask + gunicorn + mido + PyTorch CPU + nginx + HMAC-SHA256 Cookie 认证

设计铁律

  • 所见即所听/测:前端显示什么音符,后端就处理什么音符,两端过滤逻辑差异为 0

六、与同类产品的差异

现有钢琴辅助产品主要有三类模式:教学类(教你弹)、AI 纠错类(识别你弹的对错)、伴奏类(播放伴奏让你跟弹)。它们各有优势,但都有一个共同局限:用户始终是"被教/被评/被带"的一方

极意钢琴开创了第四种模式——合奏伙伴:系统实时弹奏另一只手,与你合奏。不是教你弹,也不是评判你弹得对不对,而是陪你一起弹。

维度 极意钢琴(合奏伙伴) 同类产品(教学/纠错/伴奏)
核心体验 系统陪你弹,实时弹奏另一只手 教你弹 / 识别纠错 / 播放伴奏
速度模式 :white_check_mark: 自由速度+弹性速度双模式 :cross_mark: 固定速度,用户跟系统
位置无关弹奏 :white_check_mark: 只判断"弹/没弹",不关心弹哪里 :cross_mark: 必须按指定琴键
弹奏零压力 :white_check_mark: 不强制时间/音符,想弹就弹 :cross_mark: 跟谱对错 / 实时纠错 / 跟节拍
声部分离 :white_check_mark: 自研 :cross_mark:
音频转录 :white_check_mark: 音频+MIDI→分离→弹奏全链路 :cross_mark:
曲库来源 135 首公版内置 + 任意 MIDI 上传 + 任意音频转录 仅限内置曲库,不支持外部 MIDI
硬件兼容性 :white_check_mark:触摸屏/鼠标/键盘 受限于琴键数量和大小,对空间有要求

七、产品完成度(初赛 Demo → 复赛完整作品)

维度 初赛 Demo 复赛版本
曲库 4 首内置 135 首公版内置 + 任意 MIDI/音频上传
声部分离 N 方案,76 首基线 P 方案,199 首 5 测试集全面超越 HMM基线
弹奏模式 基础自由模式 弹性模式 5 条规则 + 4 种延音控制 + 评分系统
音轨映射 重复段识别 + 智能对齐 + 手动编辑
音高图 单色矩形 16 色 Stadium 形状 + 对数变深渐变 + 弹奏模式三层明度梯度
首页体验 静态首页 电影级开机动画 + 热身音符双声部飞出特效
移动端 基本可用 逐机型适配(iPhone/荣耀/小米)+ 触屏弹奏响应优化
安全合规 Basic Auth Cookie 认证 + 频率限制 + 调试日志防护 + PWA 残留清理
性能 JS 减 57% + gunicorn 4 workers + 内存缓存 + 代码分割

体验稳定:核心流程无阻断性 bug;199 首回归测试每次改动必跑;全局限幅器彻底解决音频爆音(四轮修复);部署后 21 项验证清单逐项确认。

交互友好:所有按钮统一黑底白 SVG 线 + hover 变灰风格;触键 <16ms 视觉+听觉双反馈;移动端 40px 触摸目标符合 Apple HIG 标准。

并发稳定:gunicorn 4 workers 充分利用 4 核;音频转录单线程防 OOM,并发任务返回 409;MIDI 解析 + 声部分离内存缓存,固定曲库二次访问秒级返回。


八、TRAE 实践证明

  • 5700+ 条 AI 对话,178 次 commit,104 个源文件,23 个 Session ID,62 天Git周期
  • AI 是思考搭档而非代码生成器:与 AI 讨论算法方案、分析 bug 根因、验证测试结果
  • 开发方法论
    • 先分析再实现(重大功能先让 AI 列边界情况再写代码)
    • 改动必回归(AI 辅助编写分钟级 199 首并行回归脚本)
    • 铁律文档化(踩坑后写入项目规则,AI 后续自动遵守)
  • 迭代速度:声部分离 16 方案(A→P),P 方案从分析→设计→实现→验证仅用 2 天;音源爆音四轮修复 1 天内解决
  • 开发关键步骤截图

截图1:声部分离P方案的确立

截图2:弹奏模式音频爆音问题解决

截图3:手机多平台显示问题修正

  • 关键任务对话的 Session ID
    • Session ID 1:声部分离P方案的确立

      .538112599531664:e23ee180b78d73f023f78a9d3b873f40_6a61f4df50a68b9068ef8b1e.6a6ab394bcf3e09a51c9dfd3.6a6ab3928f577e479c8151bc:Trae CN.T(2026/7/30 10:14:44)

    • Session ID 2:弹奏模式音频爆音问题解决

      .538112599531664:13ee71fc3e23818c3416abd352579720_6a6769513f19edd1950b9551.6a67716c3f19edd1950b95ed.6a67716bd5c4368c7ea2a052:Trae CN.T(2026/7/27 22:55:40)

    • Session ID 3:手机多平台显示问题修正

      .538112599531664:5922e10b8ac2981cd725478b3b6dfc5e_6a65c6d60357f0819d3daa95.6a6616930357f0819d3db858.6a661692d3d5c5e1a69ad946:Trae CN.T(2026/7/26 22:15:47)


九、开发历程

阶段 时间 比重 核心产出 特征
git 前探索 2/15~5/30(3.5 个月) ≈15% 声部分离基础框架(A/B/C/D 方案)、前端基础 UI、76 首回归集 搭框架、试方向,产出多为后续替代
初赛攻坚 5/30~6/28(30 天) ≈30% F/H/L/K/M 方案、弹奏引擎、伪音过滤、演示版架构 算法核心+弹奏引擎定型
复赛爆发 6/28~7/31(33 天) ≈55% P 方案超越 HMM、199 首测试集、音轨映射、135 首曲库、首页重构、产品三形态、性能/安全 亮点集中爆发,产品化完成

git 前虽然占 3.5 个月,但权重仅 15%——早期产出大部分被后续替代;初赛+复赛 63 天产出 85% 权重,是项目价值的核心载体。

阶段 时间 关键成果
算法攻坚 5/30~6/7 A→N 方案迭代,回归集建立
弹奏引擎 6/14~6/21 弹性模式 5 条规则,爆音四轮修复
多平台 6/22~7/4 产品三形态共享架构,逐机型适配
评审版打磨 7/5~7/28 135 首曲库 + 音高图重设计 + 性能优化
声部分离突破 7/29~7/30 P 方案 199 首全面超越 HMM基线

十、踩坑举例

坑 1:转录 MIDI 声部分离前后端不一致

前端显示 F4 归右手,后端回归测试显示归左手。根因:前端默认开启伪音过滤(删除 52 个伪音后结果改变),后端未做过滤。解决fake_note_filter.py 精确移植前端 11 条过滤逻辑,两端差异 0 个音符。教训:所见即所测——前端 displayedNotes 是唯一真相源。

坑 2:音源原声爆音——四轮才修干净

弹奏模式段落切换时出现刺耳爆音。根因是 Web Audio 图中 gain 节点的瞬间跳变。四轮修复:fadeOut 旧段 → fadeIn 起始值硬编码 0 → 入口检测 + 软停 → 双重守卫 + 全局 limiterNode 限幅器兜底。教训:爆音的根因永远是 gain 瞬变。

坑 3:iPhone zoom 坐标错位——弹奏时音键全错

iPhone 390px 竖屏弹奏时,点击的音和实际发声的音完全对不上。根因:JS 计算的 zoom≈0.49,但 CSS zoom:1 !important 覆盖了 JS 值。解决:CSS 变量 --app-zoom:1 !important 同步 JS/CSS。教训:CSS zoom 和 JS zoom 不是同一个东西。

坑 4:JS 混淆导致 Tone.js deepMerge 无限递归

生产构建后页面白屏,控制台报 Maximum call stack size exceeded。根因:JS 混淆器的 controlFlowFlattening 把 Tone.js 的 deepMerge 改写成无限递归。解决:关闭 controlFlowFlattening 选项。教训:混淆器不是无害的。


十一、社会价值

  • 降低钢琴学习门槛:相当于永远耐心的免费陪练,你弹一只手它弹另一只手
  • 让经典音乐"可参与":没有钢琴基础的人也能"参与"演奏巴赫——按任意键,系统补全另一只手
  • 音乐教育公平化:没有钢琴的人,任何有手机或电脑的人都能体验弹琴
  • 曲库无限扩展:内置 135 首公版曲目,但支持载入任意 MIDI 文件、任意钢琴音频(自动转录为 MIDI)——任何钢琴曲都能成为自用练习学习的材料
  • 智能辅助音乐分析:高准确率的声部分离引擎(测试集1 F1=0.9942)可用于音乐教学法研究、乐谱数字化

十二、商业计划与产品愿景

两步走商业计划

第一步:轻量化商用版本——推广与用户培养

在当前版本基础上,剔除音频转录功能(规避版权与算力门槛),保留其他所有功能,且保留对转录 MIDI 的伪音过滤预处理——用户即使用其他工具转录音频为 MIDI,导入后仍能享受伪音过滤+声部分离的完整体验。形成轻量化、完全可商用的版本,同步推出三端:

  • Web 版:零安装、全平台即开即用
  • 移动端单机版:手机/平板随时随地弹
  • 电脑端单机版:Windows音符编辑鼠标操作便捷,文件操作方便

目标:以零门槛体验快速获取用户,培养"弹奏式听音乐"的使用习惯。

第二步:寻求商业合作——重新定义音乐播放器

寻求与主流音乐播放器的深度合作,将极意钢琴的弹奏模式植入播放器生态:

  • 声部分离引擎自动从曲库 MIDI 中提取旋律/伴奏声部,播放器声部可视化
  • 用户听钢琴曲时一键切换到"弹奏模式",开启弹奏
  • 音乐播放器从"被动听"升级为"主动弹"——重新定义音乐播放器的交互方式

长期愿景

极意钢琴不只是钢琴工具——它代表一种新的音乐互动方式

  1. 给原声弹伴奏:将流行歌曲伴奏钢琴化,弹奏模式下用原声做音源,实现"给歌手弹伴奏"
  2. 多乐器弹奏:配器选择扩展到吉他、竖琴、琵琶等击拨弦乐器,用键盘或触屏即可弹奏不同乐器

焕新升级项

感谢导师锐评,七条建议让极意钢琴变得更完整:

  1. 新增阳主题:在原适合夜晚的深色背景阴主题UI外,新增适合白天的浅色背景阳主题UI
  2. 新增竖版钢琴音瀑布流:在原横版钢琴音高图外,新增竖版钢琴音瀑布流,配合钢琴键盘可直观看音符在琴上的位置
  3. 新增按键特效:对应阴阳主题UI,按键分别赋予冰火特效,按键过程增加模拟钢琴琴键按下的反馈动效,对钢琴横竖版音高图均支持
  4. 新增按键过渡效果:按键色条随时间逐渐变化,已按键和未按键音符鲜明区分
  5. 新增历史播放入口
  6. 新增首页播放进度条
  7. 新增加载MIDI进度条提示

新增“Jump!”模式 (入口:弹奏模式-点击右上角右数第二个横版图标一次切换到Jump!)

2 个赞

怪不得我的钢琴早早出局了