ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

本地AI音频源分离:用Demucs提取鼓声轨的完整实践

本地AI音频源分离:用Demucs提取鼓声轨的完整实践 这次我们不看大模型也不写 Web 服务来聊一个更“声音”的问题怎么把《杀死那个石家庄人》万能青年旅店的鼓声音轨单独抽出来。万能青年旅店这张录音室版本里的鼓组其实很有特点底鼓、军鼓、踩镲的层次干净克制没有太多花哨加花但每一下都压在编曲呼吸点上。很多鼓手、混音学习者、甚至做音色替换的短视频作者都想把这条鼓轨单独拿出去扒谱、对拍、练鼓、做 Remix或者单纯研究鼓组在整首歌里的空间位置。问题是官方没有放出过分轨网上流传的“鼓声音轨”来源不可控直接拿来用还有版权风险。站在目前这个时间点更稳妥也更技术化的做法是本地部署一个 AI 音频源分离工具从一首你拥有合法授权的整曲文件里把鼓声单独模拟分离出来。这篇文章就把这条链路完整走一遍环境准备、模型安装、抽出鼓声轨、导出结果、效果验证、批量处理以及 CPU/GPU 资源占用观察和改进方向。选《杀死那个石家庄人》当作演示曲目也比较典型。它不属于那种乐器糊成一团的重型摇滚鼓声的瞬态和中频乐器有一定重叠但没有到完全粘死的程度很适合作为第一次跑音频源分离的验证素材。下面直接开始。1. 这次要解决的问题官方没有鼓分轨怎么拿到可用鼓声轨在 DAW 里做混音的人都知道一首歌如果能拿到原始分轨处理和练习效率会高很多。鼓手想单独听底鼓、军鼓、踩镲的节奏混音师想把鼓组重新压一遍Remix 作者想把原曲鼓组摘走替换成自己的鼓组——这些都依赖“鼓声音轨”的存在。但大部分商用歌曲不会发布分轨尤其是老作品。你对一首成品歌只有两个选择找别人已经做好的“鼓覆盖”或“乐器分离版”来源和音质不可控。自己动手用 AI 源分离模型把鼓声从混音里拆出来。第二个方案更可控。你输入的是自己合法拥有的高质量整曲输出的是鼓、贝斯、人声、其他乐器这样分类好的分轨文件。整个过程在本地完成不需要上传任何东西到别人的服务器。拆出来的鼓声音轨虽然做不到官方录音分轨那种绝对干净但只要歌曲本身质量足够、分离参数得当用来扒谱、跟练、做风格参考已经绰绰有余。2. 音源分离工具选型与核心能力速览音频源分离的工具不止一个常见的有 Demucs、Spleeter、UVR5、iZotope RX 等。这里优先推荐 Demucs原因是它开源、持续维护、命令行和 Python 接口都比较好接社区资料也多。能力项说明项目类型开源深度学习音频源分离工具主要功能将混合音频分离为人声、鼓、贝斯、其他乐器等音轨适合平台Windows / Linux / macOS支持命令行和 Python 调用GPU 依赖可选有 NVIDIA 显卡可以加速推理无 GPU 也能用 CPU 跑启动方式命令行或者 Python 脚本无固定 WebUI是否支持批量任务支持可在命令行传入多个文件或用脚本遍历目录是否提供 API提供 Python API可嵌入自己的处理流程输出格式WAV 分轨文件主要应用场景扒谱、混音练习、音频研究、Remix 素材准备、曲库结构分析工具选型结论如果只要一条能用的鼓声轨Demucs 默认的 htdemucs 模型就够。如果你更在意人声干净度还可以在后处理阶段再用 UVR5 做一次精修但成本会更高。3. 分离原理简述鼓声为什么能拆出来音频源分离本质上是一个监督学习问题。训练阶段模型见过大量“混音 对应分轨”的成对数据学会从频谱和波形中判断哪些声音成分属于鼓组。推理阶段模型把输入的整曲当成一个多通道信号输出一组分离后的音轨。鼓声在混合音频里有几个容易被模型识别的特征打击乐器瞬态强军鼓、底鼓、踩镲都有明显的突发能量。鼓声不是连续音高型声源它更多表现为短时冲击频谱结构和个人声、弦乐不一样。底鼓和贝斯虽然都在低频段但底鼓的瞬态更短、更不规律模型可以依赖时间包络区分两者。不过分离不是无损还原。原曲里鼓声和贝斯、吉他在某些频段会重叠模型只能根据统计规律估算。这也是为什么分离结果偶尔会有“贝斯漏进鼓轨”“鼓声有点闷”的情况属于正常现象可以通过切换模型和调整参数来改善。4. 环境准备本地部署音频源分离依赖在跑 Demucs 之前先把环境确认清楚。下面是一套通用检查清单具体版本号请以你安装时的实际环境为准。4.1 系统与 PythonDemucs 需要 Python 3.8 以上版本。建议新建一个虚拟环境避免和系统 Python 包冲突python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate4.2 安装 Demucs 与解码依赖Demucs 本身依赖 PyTorch处理音频还需要 ffmpeg 作为解码后端。安装命令pip install --upgrade pip pip install demucsffmpeg 需要单独安装。macOS 可以用 Homebrewbrew install ffmpegUbuntu/Debian 使用 aptsudo apt update sudo apt install ffmpegWindows 上建议直接下载 ffmpeg 可执行文件并加入 PATH或者用包管理器安装。没有 ffmpeg 时程序可能能启动但遇到 mp3、flac 等压缩格式会解析失败。4.3 验证基础环境安装完成后先跑一次版本检查demucs --help能正常打印帮助信息说明命令行入口已经可用。Python 端验证可以执行import demucs print(demucs.__version__)5. 用 Demucs 提取《杀死那个石家庄人》的鼓声轨核心操作很简单准备一首合法授权的整曲文件然后执行 Demucs 分离命令。5.1 准备输入文件把原始音乐文件放到一个单独目录里例如input/。文件名不要带特殊字符方便命令行处理。假设输入文件是input/杀死那个石家庄人.flac如果只有 mp3Demucs 也能处理但建议尽量使用 flac 或 wav 这类无损格式减少解码损失。5.2 只提取鼓声轨如果你只需要鼓声不想要人声、贝斯、其他乐器可以用--two-stemsdrums参数把整个任务简化为两分类鼓声和非鼓声。demucs --two-stemsdrums input/杀死那个石家庄人.flac -o output执行后分离结果会写到output/htdemucs/杀死那个石家庄人/drums.wav output/htdemucs/杀死那个石家庄人/no_drums.wavdrums.wav就是鼓声音轨no_drums.wav是去掉鼓声后的其他部分。如果你需要保留人声、贝斯、鼓、其他四轨完整分轨可以去掉这个参数运行默认的 htdemucs 模型。5.3 保留全部四轨demucs input/杀死那个石家庄人.flac -o output输出目录会多出几个文件output/htdemucs/杀死那个石家庄人/bass.wav output/htdemucs/杀死那个石家庄人/drums.wav output/htdemucs/杀死那个石家庄人/other.wav output/htdemucs/杀死那个石家庄人/vocals.wavvocals.wav不是我们这次的主角但如果你以后要做伴奏提取它同样有用。5.4 用 CPU 跑机器上没有独立显卡时可以在命令里显式指定 CPUdemucs --two-stemsdrums -d cpu input/杀死那个石家庄人.flac -o outputCPU 推理速度明显慢于 GPU但胜在兼容性高。老笔记本也能跑只是处理几分钟的歌曲需要更长等待时间。5.5 提高分离质量如果第一次跑完发现鼓轨里人声残留明显可以增加随机位移次数demucs --two-stemsdrums --shifts2 input/杀死那个石家庄人.flac -o output--shifts会让模型在输入波形的时间偏移上做多次推理再把结果平均通常能减少边界伪影和残留。代价是推理时间翻倍或者更多。6. 批量提取多首歌曲的鼓声轨单曲提取只是入门实际使用时更多情况是处理整个文件夹的素材。Demucs 命令行本身就支持传入多个文件。在 bash 里可以把目录下所有音频文件一次性传进去find input_dir -name *.flac -exec demucs --two-stemsdrums {} -o output_dir \;如果感觉find -exec太绕可以直接写一个 Python 批量脚本。下面的脚本会遍历raw_songs目录下的音频文件每隔 5 秒打印一次进度import subprocess from pathlib import Path input_dir Path(raw_songs) output_dir Path(separated_outputs) output_dir.mkdir(exist_okTrue) audio_exts {.mp3, .wav, .flac, .m4a, .ogg} files [p for p in input_dir.iterdir() if p.suffix.lower() in audio_exts] for idx, song in enumerate(files, start1): print(f[{idx}/{len(files)}] start: {song.name}) result subprocess.run( [ demucs, --two-stemsdrums, -d, cpu, -o, str(output_dir), str(song) ], capture_outputTrue, textTrue ) if result.returncode ! 0: print(f[{idx}/{len(files)}] fail: {song.name}) print(result.stderr) else: print(f[{idx}/{len(files)}] done: {song.name})批量任务大概率会部分失败建议在脚本里记录失败日志不要直接跳过所有报错。失败的原因通常是文件损坏、编码不支持或磁盘空间不足。7. 通过 Python API 把鼓声轨接入自己的处理流程命令行适合人工操作但当你想把分离能力嵌入到一个更大的自动化工具里时直接用 Python API 更合适。下面是一段通用调用示例可以按实际 Demucs 版本调整import torch from pathlib import Path from demucs.pretrained import get_model from demucs.apply import apply_model from demucs.audio import AudioFile, save_audio # 加载模型 model get_model(htdemucs) model.eval() device cuda if torch.cuda.is_available() else cpu model.to(device) # 选择模型采样率的分轨结果 input_path input/杀死那个石家庄人.flac out_dir Path(api_output) out_dir.mkdir(exist_okTrue) # 读取、重采样、归一化 wav AudioFile(input_path).read( streams0, sampleratemodel.samplerate, channelsmodel.audio_channels ) ref wav.mean(0) wav (wav - ref.mean()) / ref.std() with torch.no_grad(): sources apply_model( model, wav[None], devicedevice, shifts1 )[0] # 恢复幅值尺度 sources sources * ref.std() ref.mean() # 保存鼓声轨和其他轨道 stem_names model.sources for name, source in zip(stem_names, sources): save_audio( source.cpu(), str(out_dir / f{name}.wav), sampleratemodel.samplerate ) print(fsave: {name}.wav)这段代码的核心逻辑是加载模型 → 读取音频 → 归一化 → 推理 → 反归一化 → 保存。输出文件里会包含 vocals、drums、bass、other 四个轨道。如果你的模型是htdemucsmodel.sources列表通常是[drums, bass, other, vocals]的顺序可以直接把它当轨道名用。调用前建议先确认一下当前版本 API 是否有变化因为 Demucs 内部接口偶尔会调整。8. 功能测试与效果验证鼓声轨够不够干净跑完分离只是第一步怎么判断这条鼓声轨能不能用需要做几项基础验证。8.1 整体听感测试直接播放drums.wav重点听两件事底鼓和军鼓的弹性是否保留。人声、贝斯是否明显漏进鼓轨。正常的鼓声轨应该能听到完整的鼓组瞬态即使某些段落有一段吉他泛音残留只要不干扰节奏判断就不影响扒谱和跟练。8.2 波形检查把生成的drums.wav拖进 Audacity、DAW 或任何音频编辑器。鼓声轨的波形应该呈现密集的瞬态尖峰每个尖峰对应一次底鼓或军鼓击打。如果波形中间出现持续较长的连续能量段大概率是漏进来的贝斯或人声。8.3 频谱检查在 Audacity 里切换到频谱图视图比较原曲和drums.wav鼓声主要集中在低频冲击区和军鼓的中频噪声区。如果频谱图里出现连续结构的强中频段说明有残留音乐成分。人声的特点是有明显共振峰和字词间隔如果鼓轨频谱里出现规律的中频条带需要处理残留。8.4 音频“减法”测试这是一个比较容易操作的验证思路把原曲和鼓声轨对齐后将原曲波形与drums.wav进行反相叠加理论上会听到“去掉鼓声”的伴奏。如果减法后的音频里还能明显听到鼓点说明鼓轨提取并不完整。这种验证需要你有音轨对齐能力但对混音学习者来说能顺手练习一次素材减法处理也是不错的额外收获。9. 资源占用与性能调优方向这一段不需要抄别人给出的固定数字因为不同机器的表现差异很大。更合理的做法是观察自己机器上的实际指标然后通过参数调优。9.1 如何观察显存占用推理过程中可以用nvidia-smi实时观察显存占用watch -n 1 nvidia-smiWindows 上可以直接在任务管理器性能页看 GPU 专用显存。显存占用会随音频长度、--segment分段长度、模型参数量变化。如果你的显卡显存偏低优先尝试调低分段长度而不是直接换显卡。9.2 调低分段长度降低显存压力Demucs 推理时会按固定长度切片处理长音频。显存不足时可以显式设置--segment参数demucs --two-stemsdrums --segment 7 input/杀死那个石家庄人.flac -o output分段越短单次送入 GPU 的音频越小显存压力越小。代价是上下文信息减少分离衔接可能变差。分段太短会让鼓声在断点附近出现可闻瑕疵所以不建议调到 3 秒以下。9.3 CPU 推理优化CPU 模式下容易出现“跑得很慢但 CPU 占用没拉满”的情况。可以先确认 PyTorch 是否开启了多线程import torch torch.set_num_threads(8)在推理脚本里手动设置线程数能明显提高处理器利用率。需要根据本机 CPU 核心数量调整不要直接把数字写到 64。9.4 输出文件体积控制Demucs 默认输出 WAV数据量比较大。如果只是练习扒谱可以用 ffmpeg 把鼓声轨压缩成质量足够高的音频ffmpeg -i output/htdemucs/杀死那个石家庄人/drums.wav -c:a aac -b:a 320k drums_compressed.m4a处理前建议保留 WAV 版本因为后续如果要继续做混音或批量处理无损格式更可靠。10. 常见问题与排查方法问题现象可能原因排查方式解决方案安装后提示 command not foundPython 虚拟环境未激活或包安装位置不在 PATH检查pip show demucs确认当前 shell 环境激活虚拟环境后重试或改用python -m demucs读取 mp3 / flac 文件失败ffmpeg 未安装或未加入 PATH执行ffmpeg -version安装 ffmpeg 后重启终端CUDA 不可用显卡驱动、CUDA 版本和 PyTorch 版本不匹配查看torch.cuda.is_available()输出按实际环境重装匹配版本的 PyTorch显存不足推理中断显卡显存较小或音频分段过长观察 nvidia-smi 的占用峰值降低--segment参数或改用 CPU 模式输出目录为空输入文件路径包含特殊字符或音频文件损坏先处理一个正常命名的测试文件重命名文件、确认音频可正常播放鼓轨里人声残留明显分离模型精度有限或原曲电平太高尝试--shifts 2或换更高质量的输入文件用后处理软件做一次频率裁剪批量任务卡住某个音频文件损坏或推理进程异常挂起给脚本加入超时机制跳过坏文件记录日志后继续处理输出鼓轨听起来闷分离后缺少高频泛音用频谱图观察高频滚降视情况做轻度 EQ 补偿如果问题集中在模型加载阶段最稳妥的办法是先跑一个 10 秒的 wav 测试文件排除“音频文件本身有问题”的干扰再切回完整歌曲。11. 使用边界与版权合规提醒在动手分离前需要先把一条原则讲清楚你只应该处理自己合法获得、有权处理的录音文件。个人的学习、扒谱、混音练习和内部研究相对安全但这条边界不能无限外扩。以下几点特别留意不要将分离出的鼓声轨直接上传到流媒体平台伪装成官方分轨。不要用分离结果制作新的音乐作品后商用除非你确认已经获得录音版权方和词曲版权方授权。如果你是在别人乐队作品上做练习或二次创作公开发布前要标注素材来源并获得必要许可。涉及你身边乐队录制但尚未授权的录音时也要先确认录音所有者的意愿。音频分离技术本身是中性工具它大量应用于音乐教育、无障碍听感辅助、混音修复等正当场景。使用边界在一次一次操作中体现而不是工具决定的。12. 后续可以继续深入的方向用 Demucs 成功抽出鼓声轨之后你会发现“把音频拆开”这个能力可以做很多扩展用同样的流程提取人声轨搭建一个简单的卡拉 OK 伴奏生成服务。把多个音频文件的分离任务接入队列系统用 GPU 服务统一处理。把分离后的鼓轨做节奏分析自动识别 BPM 和节拍位置输出鼓谱基础信息。在 DAW 里把分离出的鼓轨和自己录制的鼓轨做对比分析实录与参考混音之间的差异。下次当你遇到任何“想要单独某条音轨却没有分轨”的问题时不要急着去找不靠谱的音频资源。把本地模型启动一条命令可能比想象中更快。如果你手头刚好有这首《杀死那个石家庄人》的合法高质量录音可以直接按上面的命令跑一遍结果就是你的第一条 AI 分离鼓声轨。
返回列表