NeuralNote 终极拆解:AI 音频转 MIDI 的完整流水线与调参避坑实战

发布时间:2026/8/21 17:09:33
NeuralNote 终极拆解:AI 音频转 MIDI 的完整流水线与调参避坑实战 NeuralNote 终极拆解AI 音频转 MIDI 的完整流水线与调参避坑实战【免费下载链接】NeuralNoteAudio Plugin for Audio to MIDI transcription using deep learning.项目地址: https://gitcode.com/gh_mirrors/ne/NeuralNoteNeuralNote 是一款基于深度学习的音频转 MIDI 开源插件能把钢琴、吉他、人声等任意录音一键变成可编辑的 MIDI 音符。这篇深度解析适合第一次接触 AI 转录的新手也适合想把结果调得更干净的进阶用户——我们不背概念只跟着一段音频走完从波形到钢琴卷帘的完整旅程顺便分享几个真实踩坑点。当你读完你会明白所谓AI 转录其实是四段可以逐级拧旋钮的流水线。为什么听音扒谱这么反人类 打开任何一个扒谱论坛最常见的求助格式都是求这首歌的钢琴谱有和弦最好。底下永远有人回自己听啊。可对普通玩家来说一段三分钟的钢琴曲人耳能抓住旋律却很难同时听清左手的分解和弦、踏板留下的混响、以及偶尔滑过去的装饰音。扒一首歌三小时其中两小时在反复拖进度条。这正是音频转 MIDI 工具存在的意义。而 NeuralNote 的特别之处在于它没有把转录当成一个黑盒魔法而是把整条流水线摊开给你看甚至允许你转动每个环节的旋钮。全文只围绕一个核心论点展开——转录质量 特征提取 × 模型推理 × 后处理整理 × 参数匹配哪一环掉链子结果都会听起来不对。第一站CQT 特征提取——把波形翻译成频谱草稿 音乐软件读到的音频本质上只是一串随时间变化的采样点。要让神经网络听懂得先把波形翻译成它熟悉的语言频谱。NeuralNote 在Lib/Model/Features.cpp里实现的是 Constant-Q 变换CQT。和常见的 FFT 相比CQT 的频率分辨率是对数的这更接近人类听觉我们能轻松分辨低音区的 50Hz 和 100Hz却很难分辨 5000Hz 和 5050Hz。CQT 正是按这种音乐性的尺度切分频率轴让模型把力气花在真正重要的分辨上。更妙的是特征计算本身也是一个神经网络工程直接加载Lib/ModelData/features_model.onnx用 ONNX Runtime 在 CPU 上完成。算出基频后系统还会把基频和它的各次谐波堆叠起来把单帧 264 个频点变成 8×264 的输入——这相当于提前告诉模型这个音听起来有一堆泛音但它们的老板是同一个基频。这一招大幅降低了后续模型识别音高的难度。第二站四个小模型如何分包干完一个大模型的活 Spotify 的 basic-pitch 原本是一个大号 CNN。NeuralNote 在Lib/Model/BasicPitchCNN.cpp和BasicPitchCNN.h里把它拆成了四个各司其职的小模型权重分别存放在Lib/ModelData/下的四个 JSON 文件里子模型负责内容轮廓 CNNcontour判断此刻有没有音在响音符 CNNnote判断是哪个音高、持续多久起始输入 CNNonset input先对轮廓与音符结果做一次特征融合起始输出 CNNonset output判断音符是否在这一刻新开始这种分包带来两个直接好处。其一每个子网络可以独立训练、单独替换其二模型变小后可以用 RTNeural 这种纯头文件的推理库在 CPU 上跑不必依赖 GPU。四个模型之间最麻烦的是时间对齐卷积天然会引入延迟所以代码里用环形缓冲区和 lookahead 参数轮廓 3 帧、音符 6 帧把各模型输出对齐到同一时刻。翻译成人话模型永远能偷看未来几帧预测自然更稳。值得一提的细节是音符模型的输出是 88 个值——正好对应钢琴的 88 个琴键。想研究模型结构的人直接打开 JSON 就能看到每一层的卷积核尺寸这是现成的 AI 学习素材。第三站概率变音符——后处理才是真正的老编辑 ✂️模型输出的不是音符而是三张概率图posteriorgram每一帧、每个音高上这里有音的可能性。把概率图整理成干净的事件列表靠的是Lib/Model/Notes.cpp里的一整套老编辑工序阈值过滤只有概率超过阈值默认 0.5的音高才被算作音符避免把残留混响当成新音起始点推断模型给的 onset 不够可靠时系统用音符概率的差分补出音头_inferredOnsets相当于听不清起音时靠音量突变来猜合并与切分同一音高、时间重叠的音符合并成一条mergeOverlappingNotesWithSamePitch过长的不自然音则按能量切开音高弯曲遇到滑音、揉弦系统沿轮廓概率的峰值给音符附加一串 bend 值一旦多个音符时间重叠就统一丢弃 benddropOverlappingPitchBends避免 MIDI 里出现互相打架的弯音数据。这里藏着一个非常好用的架构细节Notes::convert带有一个inNewAudio参数。意思是——神经网络只需对音频完整跑一次之后你拖敏感度、改阈值系统只重跑这套廉价的后处理绝不重算模型。所以界面上旋钮一拖、结果立刻刷新不是错觉而是刻意设计。面板上的三颗旋钮分别对应哪三个痛点 ️打开界面左侧 Transcription 面板有三颗旋钮默认值写在NeuralNote/Source/ParameterHelpers.h里。它们恰好对应后处理的三个痛点Note Sensibility默认 0.7决定多响才算一个音。实测中密集和弦段经常出现幽灵音——低八度的共振被当成实音写进谱面把这一项往下压一点谱面立刻干净不少Split Sensibility默认 0.5控制音符的合并与切分。偏低会把断断续续的同音连成一条长音偏高会把长音切开。钢琴踏板段落把它调低延音会更完整Min Note Duration默认 125ms范围 35–580ms一把剪刀剪掉所有短于阈值的碎音。木管和气声起音类录音会生成一堆几十毫秒的碎音把它拉到 150ms 以上基本能一次剪干净。这三颗旋钮没有万能值它们其实是在替你的录音回答三个问题单音旋律还是和弦织体有没有踏板气声重不重问题回答清楚了参数自然就定下来了。让 AI 结果入乡随俗两套量化机制怎么选 ⏱️AI 给出的是接近正确的音高和时值但音乐讲究规矩——要么落在调内要么卡在拍子上。NeuralNote 提供两层规整音阶量化Scale Quantize选定根音如 D和调式大调/小调把音符吸附到最近的有效音级上专治 AI 偶尔的半个音偏差时间量化Time Quantize按拍号、速度和时值网格如 1/8把音符起点与长度吸到网格上另有 Force力度参数控制吸得多紧。这里有个真实的踩坑点值得分享时间量化需要的拍号与速度有两种来源——录音时从 DAW 播放头实时读取加载文件时用文件信息推算。在TimeQuantizeOptions.cpp里甚至能看到一段注释专门绕开 Logic Pro 播放头位置错误的问题。所以如果你在某 DAW 里发现量化网格整体对不上先检查工程里的拍号速度设置而不是怀疑音符识别——很多量化不准其实不是 AI 的锅。从会用到会改一份给读者的自测清单 ✅读到这里你已经不是点一下转录的旁观者而是知道每一站发生了什么的人。离开之前不妨做一次自检你能解释为什么拖敏感度旋钮几乎不卡顿吗提示神经网络只跑一次音频里出现大量碎音时你第一反应调哪颗旋钮打开Lib/ModelData/下的 JSON你能认出哪一层是卷积、哪一层是激活函数吗量化结果整体偏前或偏后你会怎么修正如果第 1、2 题卡住了回看第三、五章如果第 3 题让你兴奋恭喜你已经有能力读Lib/Model/BasicPitchCNN.h里的模板参数了。想进一步动手项目自带Tests/目录CNN 测试、特征提取测试、性能基准clone 下来跑一遍测试是理解这套流水线最快的路径git clone --recurse-submodules --shallow-submodules https://gitcode.com/gh_mirrors/ne/NeuralNote下一次当你把一段录音拖进去、几秒后看到钢琴卷帘上整齐的音符时希望你想起的不是AI 真神奇而是哦是那四站流水线而每一站我都能按自己的需求拧一拧。【免费下载链接】NeuralNoteAudio Plugin for Audio to MIDI transcription using deep learning.项目地址: https://gitcode.com/gh_mirrors/ne/NeuralNote创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考