音频转MIDI一直是从音乐制作到自动伴奏、扒谱教学等场景中的核心需求。过去靠人工扒谱费时费力,而传统DAW自带的音频转MIDI功能往往对复音、噪声、滑音的处理不够理想。随着深度学习在音频领域的成熟,AI旋律提取已经能够从混合音频中分离出主旋律、估计每个音符的起始时间、音高和时值,并直接生成标准MIDI文件。下面这张图展示了AI从波形到MIDI事件的基本转化过程,后文会围绕这一路径展开详细拆解。

AI旋律提取的技术原理:从音频信号到MIDI音符
AI旋律提取的核心任务可以拆成三个子问题:音高检测、音符分割和节奏量化。音高检测解决的是每一帧音频中是否存在乐器或人声,以及其基频是多少。传统方法如自相关、YIN算法在单音场景下表现稳定,但遇到复音或混响时容易产生八度误差。现代AI方案通常采用卷积神经网络或Transformer对频谱图进行逐帧分析,输出一个多音高激活矩阵,再通过后处理连接成音符。
音符分割与节奏量化则决定了一个持续的音高序列如何被切成离散的MIDI事件。AI模型会在音高激活矩阵上应用峰值检测和阈值判断,同时结合节拍跟踪信息来对齐音符边界。一些端到端模型例如Spotify开源的Basic Pitch直接输出带有置信度的音符列表,不需要单独的节拍器输入。其核心创新在于使用谐波堆叠特征和专门设计的损失函数,对低音量、滑音和装饰音有更好的鲁棒性。
此外,音源分离往往是旋律提取的前置步骤。如果输入是一段完整的混音,直接做音高检测会受到鼓、贝斯等乐器的干扰。因此很多工具会先使用Demucs或Spleeter将音频分离成人声、鼓、贝斯和其他,然后只对分离出的主旋律音轨进行MIDI转换。这种级联方式虽然增加了计算量,但能显著提升提取的准确率和干净度。
主流工具与代码实现:Basic Pitch、Melodia与自定义管线
目前开源社区最常用的AI旋律提取工具是Basic Pitch,它由Spotify Audio Intelligence Lab开发,提供了Python库和命令行接口。安装只需执行pip install basic-pitch,然后调用模型就能把音频文件转成MIDI。下面是一段完整的Python示例,包括加载音频、推理和保存MIDI文件。
import librosa
from basic_pitch.inference import predict
from basic_pitch import ICASSP_2022_MODEL_PATH
# 加载音频,采样率统一为22050Hz
audio, sr = librosa.load('input.wav', sr=22050, mono=True)
# 使用Basic Pitch模型进行预测
model_output, midi_data, note_events = predict(
audio,
sr,
model_path=ICASSP_2022_MODEL_PATH,
onset_threshold=0.5, # 起始检测阈值,越低越敏感
frame_threshold=0.3, # 帧级音高置信度阈值
minimum_note_length=58, # 最短音符长度(毫秒)
minimum_frequency=80, # 最低检测频率(Hz)
maximum_frequency=2000, # 最高检测频率(Hz)
melodia_trick=True # 启用Melodia后处理技巧,减少八度错误
)
# 保存为MIDI文件
midi_data.write('output.mid')
print('提取完成,共生成音符事件:', len(note_events))
上述代码中的几个阈值参数直接影响提取质量。onset_threshold控制新音符被触发的敏感程度,如果设置过高会漏掉快速连奏,设置过低则可能把滑音切成多个音符。minimum_note_length用于过滤过短的杂音事件,在扒取人声旋律时建议设置在50到80毫秒之间。minimum_frequency和maximum_frequency可以限定检测范围,避免低音乐器干扰。
另一个常用的开源库是Melodia,它基于预训练的卷积神经网络,对单声道旋律提取很有效,但需要额外安装 vamp 插件体系。相比之下Basic Pitch的优势在于原生支持复音、置信度输出和更简单的Python接口。如果追求更细粒度的控制,也可以使用PyTorch搭建自定义管线,先用Demucs做音源分离,再对分离出的旋律轨应用CREPE或Pyin进行逐帧音高估计,最后通过动态规划把音高序列转化为MIDI事件。这种方式灵活性最高,但需要处理采样率对齐、帧到时间的映射以及噪音抑制等细节。
从提取结果到编曲实战:MIDI后处理与DAW集成
AI提取出的MIDI文件通常不能直接用于编曲,因为模型对音符边界和力度的判断仍然存在误差,尤其是对切分音、三连音和装饰音。拿到原始MIDI后,建议在DAW中先做量化处理。大多数宿主软件如Ableton Live、Logic Pro和Cubase都提供了量化到网格的功能,可以选择1/16或1/32的精度,并设置量化强度避免完全机械。同时需要检查MIDI音符的力度值,AI模型往往给所有音符统一的力度,这会让旋律听起来缺乏表情。手动调整力度曲线或使用DAW的人性化功能可以恢复演奏感。
另一个常见问题是音域和乐器的适配。AI提取的人声旋律音域可能超出MIDI键盘的显示范围,这时可以在钢琴卷帘中整体移调八度。如果希望把旋律分配给某种虚拟乐器,还需要考虑乐器的自然音域和演奏技法,比如弦乐需要连奏和弓法,管乐需要呼吸断句。这些信息无法从音频中自动恢复,需要编曲师根据音乐风格进行二次创作。
在自动化工作流中,可以把AI提取和DAW通过脚本连接起来。例如使用Python的mido库读取AI生成的MIDI,对音符进行转调、力度缩放或长度修改,然后再写回文件。下面这段代码演示了如何将所有音符提高一个八度并把力度乘以0.8,让旋律更柔和,适合作为背景铺底。
import mido
mid = mido.MidiFile('output.mid')
for track in mid.tracks:
for msg in track:
if msg.type == 'note_on' or msg.type == 'note_off':
# 提高一个八度(12个半音)
msg.note += 12
if msg.type == 'note_on':
# 力度降低,保留动态差异
msg.velocity = int(msg.velocity * 0.8)
mid.save('adjusted.mid')
print('后处理完成,已保存为 adjusted.mid')
对于批量处理多首歌曲或构建自动扒谱服务,可以将上述流程封装成命令行工具或微服务。输入音频文件,经过音源分离、旋律提取、MIDI后处理,最终输出可供下载的MIDI文件。在工程实现上需要注意内存占用和推理延迟,Basic Pitch在CPU上处理3分钟音频大约需要5到10秒,加上音源分离的时间会增加到半分钟左右。因此在高并发场景下可以考虑使用GPU推理和异步任务队列。
最后需要明确一点:AI旋律提取解决的是扒谱效率和初步音符识别问题,并不能完全替代有经验的编曲师。它输出的MIDI可以作为编曲的起点,用于快速生成和声、配器或采样替换,但真正有表现力的编曲仍然需要人工调整力度、时值和音色。随着模型对音乐结构的理解加深,未来有望直接从音频中提取出包含和弦、节奏型和装饰音在内的更完整音乐信息,届时AI与编曲工作流的结合会更加紧密。