ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SOME命令行推理详解:如何快速把演唱音频转成MIDI文件(附长音频自动切分原理)

2026/8/23 16:46:17 拓冰建站 浏览量
SOME命令行推理详解:如何快速把演唱音频转成MIDI文件(附长音频自动切分原理) SOME命令行推理详解如何快速把演唱音频转成MIDI文件附长音频自动切分原理【免费下载链接】SOMESOME: Singing-Oriented MIDI Extractor.项目地址: https://gitcode.com/gh_mirrors/so/SOMESOMESinging-Oriented MIDI Extractor面向演唱的MIDI提取器是一个开源的人声转MIDI工具只需一条命令行即可把演唱音频文件转成标准 MIDI 乐谱文件。它的速度极快——在 i5 12400 CPU 上比实时快 9 倍在 3080Ti GPU 上可达 300 倍实时——并且能输出带小数点的 MIDI 音高值天然适合 DiffSinger 的 variance 变调标注场景。本文带你从零跑通 SOME 命令行推理并讲透长音频自动切分的底层原理。为什么需要演唱专用MIDI提取器与通用哼唱转谱工具不同SOME 专为歌声设计 直接输出音符序列 时值生成.mid文件⚡ 推理速度远超实时长音频也无需等待 支持非整数 MIDI 值如60.3方便做音准偏差标注 资源友好仅 3 小时训练数据即可微调出不错的效果环境安装3步准备工作SOME 要求 Python 3.8建议用 Conda 或 venv 创建虚拟环境。第 1 步安装 PyTorch 2.1按官方指引选择你的系统与硬件版本。第 2 步安装其余依赖依赖清单见requirements.txtpip install -r requirements.txt第 3 步下载预训练权重。到项目的 Releases 页面下载 SOME 官方预训练模型并解压到任意目录可选地下载 RMVPE 音高预训练模型解压到pretrained/目录以获得更好的音高提取效果配置见configs/base.yaml中的pe与pe_ckpt字段。一键推理核心命令详解跑通推理只需一行命令python infer.py --model CKPT_PATH --wav WAV_PATH入口脚本为infer.py它会自动完成读取模型 → 加载音频 → 长音频切分 → 逐段推理 → 合成 MIDI 并保存默认保存为与音频同名的.mid文件。全部参数速查表运行python infer.py --help可查看帮助常用参数如下参数是否必填说明--model CKPT_PATH必填模型权重路径*.ckpt需与其同目录的config.yaml配合--wav WAV_PATH必填输入演唱音频*.wav--midi MIDI_PATH可选输出 MIDI 文件路径默认与音频同名.mid--tempo TEMPO可选输出 MIDI 的拍速BPM默认120一个完整示例python infer.py --model pretrained/some.ckpt --wav song.wav --midi song.mid --tempo 120运行结束后会打印MIDI file saved at: song.mid打开任意 MIDI 编辑器即可看到提取出的音符。长音频自动切分原理Slicer 是怎么工作的整首歌可能有几分钟直接整段喂给模型既费显存又容易丢失细节。SOME 的做法是先用能量检测把长音频按静音切成小段逐段推理再按时间偏移拼回一整条 MIDI 时间轴。核心实现位于utils/slicer2.py的Slicer类流程分三步① 计算 RMS 能量曲线音频先被切成若干小帧逐帧计算 RMS均方根能量得到一条音量曲线。② 按静音区间确定切分点能量低于-40 dB阈值的帧被判定为静音帧连续静音区间达到最短长度后就在其中最安静的点下刀切分参数max_sil_kept1000表示切分时最多保留 1000ms 的静音边沿避免把乐句切断。可以直观理解为Slicer 像一个剪音师只在几乎听不见的地方下剪刀并给每段录音记下一个时间偏移量offset。③ 按偏移量拼回完整乐谱各段推理结果音符、时值在utils/infer_utils.py的build_midi_file中按offset平移对齐再统一换算成 MIDI tick按tempo计拍最终写成一个.mid文件。由于切分点都在静音处拼接时音符不会被截断保证了乐谱的连续性。推理内部流程从波形到音符inference/me_infer.py中的MIDIExtractionInference展示了完整的三阶段流水线预处理 preprocess波形转成梅尔频谱作为网络输入参数来自configs/base.yaml的hop_size、win_size等前向推理 forward_model模型同时输出两个头——probs每帧音高落在 0~127 各 MIDI 值上的概率分布和bounds音符边界后处理 postprocessdecode_bounds_to_alignment把边界转成帧→音符的对应关系decode_gaussian_blurred_probs用高斯加权平均解码出带小数的 MIDI 音高并判定休止帧restdecode_note_sequence聚合出每个音符的音高、时长休止段自动丢弃。这也是 SOME 能输出非整数 MIDI 值的关键——对概率分布做加权平均而不是简单取最大值。进阶用法批量处理 DiffSinger 数据集如果你要为一个 DiffSinger 数据集含transcriptions.csv的wavs目录批量提取 MIDI可以使用batch_infer.pypython batch_infer.py --model CKPT_PATH --dataset RAW_DATA_DIR --overwrite它会遍历transcriptions.csv中每条录音提取 MIDI 序列后覆盖写回note_seq音符名如C4、rest和note_dur时长两列。常用参数--round_midi把音高取整为整数 MIDI 值--csv CSV_PATH指定输出 CSV 路径默认写回数据集内的transcriptions.csv--overwrite目标 CSV 已存在时必须加上否则报错保护原文件。⚠️ 覆盖前建议先备份transcriptions.csv。此外SOME 还提供 webui.py 的 Gradio 图形界面python webui.py --work_dir WORK_DIR适合不想敲命令的入门用户。常见问题速答Q1没有 GPU 能跑吗可以。推理自动检测 CUDA 不可用时回落到 CPU见inference/base_infer.py的设备选择逻辑实测 i5 12400 上速度约为实时的 9 倍几分钟的歌曲秒级出结果。Q2输出的 MIDI 为什么带小数SOME 采用概率分布加权解码保留亚半音级精度专为 DiffSinger variance 标注设计若只要标准乐谱可在批量模式加--round_midi取整。Q3输出 MIDI 的拍速是固定的是的--tempo只影响 MIDI 文件的时值换算默认 120 BPM不改变音符相对时长后期可在打歌软件里整体变速。Q4想换成自己训练的模型把自训练产出的*.ckpt与config.yaml放在同一目录推理命令中的--model指向 ckpt 即可——入口脚本会自动读取旁边的配置文件并路由到对应的推理类。小结需求命令参考文件单条音频转 MIDIpython infer.py --model ... --wav ...infer.py长音频切分逻辑静音能量切分 偏移拼接utils/slicer2.py、utils/infer_utils.py批量标注数据集python batch_infer.py --dataset ... --overwritebatch_infer.py图形界面python webui.py --work_dir ...webui.pySOME 用静音切分 逐段推理 偏移拼接的思路优雅解决了长音频问题让你一条命令就能把演唱音频变成可用的 MIDI 乐谱。装上依赖、备好权重现在就可以试一首歌【免费下载链接】SOMESOME: Singing-Oriented MIDI Extractor.项目地址: https://gitcode.com/gh_mirrors/so/SOME创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考