Demucs 音频分离部署指南:5分钟跑通,一首4分钟的歌分离只要2分钟
【免费下载链接】demucsCode for the paper Hybrid Spectrogram and Waveform Source Separation项目地址: https://gitcode.com/gh_mirrors/de/demucs
你肯定遇到过这种糟心事:好不容易从网上找到一首歌的伴奏,下载回来却发现里面还带着隐隐的鼓点和人声底噪。别急着去找那些收费的在线工具——Meta 开源的 Demucs(Hybrid Spectrogram and Waveform Source Separation 论文的官方代码)就能自己搞定这一切,而且完全免费、离线可用。它能一键把任意一首歌拆成鼓、贝斯、人声和"其他"四个音轨,分离质量常年霸榜 SDR 9.0 dB。这篇文章会带你从零装好它、跑通第一首歌,再通过几个关键参数把处理速度提上来,让一首 4 分钟的歌曲在 GPU 上 2 分钟内出成品。
上图是 Demucs v4(Hybrid Transformer)的模型架构:一条分支处理波形、一条分支处理频谱,中间用 Transformer 做跨域融合,这也是它比传统分离模型更干净的原因。
读完这篇文章,你会获得
- 5 分钟跑通第一首分离
- 选对模型不再纠结
- 显存不够一键化解
- 批量分离自动排队
- 八成报错自己会修
5分钟先跑通:先看到成果再谈优化
我懂你,装工具最怕装完不知道有没有用。所以咱们跳过所有铺垫,直接上手。
如果你只想用、不想研究代码,一条命令就够:
pip3 install --user -U demucs装完验证一下:
demucs --version能打印出版本号就说明装好了。接着随便找一首歌,直接开跑:
demucs -d cpu "你的歌曲.mp3"第一次运行会联网下载模型权重(htdemucs 是默认模型,约 80MB),之后就全是本地运行。命令跑完后,在separated/htdemucs/你的歌曲/目录下,你会看到四个文件:
drums.wav—— 纯鼓点bass.wav—— 纯贝斯vocals.wav—— 纯人声other.wav—— 其他配乐
到这一步,你已经完成了第一次音频分离。CPU 处理速度大概是歌曲时长的 1.5 倍,也就是一首 4 分钟的歌约 6 分钟出结果——别嫌慢,接下来告诉你怎么提速 3 倍以上。
小提示:如果你用的 Linux 是 Ubuntu,且系统自带 Python 版本过低(低于 3.8),安装方法见官方文档 docs/linux.md,里面给了用 Miniconda 兜底的方案。
核心能力拆解:按功能模块认识 Demucs
跑通之后,咱们按"功能"而不是按"步骤"来认识它。每个模块我都回答四个问题:是什么、何时用、怎么配、配错会怎样。
模块一:选模型——速度与质量的平衡木
模型是 Demucs 的灵魂。同一首歌,用不同模型跑,速度和干净程度天差地别。官方预置了 8 个模型,用-n参数切换:
demucs --list-models # 查看全部可用模型| 模型 | 定位 | 分离质量 | 速度 | 说明 |
|---|---|---|---|---|
mdx_q | 快速模式 | 中等 | 最快 | 量化压缩版,文件小,适合低配机器 |
mdx | 平衡模式 | 中高 | 较快 | MDX 挑战赛 Track A 冠军 |
htdemucs | 默认模型 | 高 | 中等 | v4 混合 Transformer 模型,默认就它 |
hdemucs_mmi | 经典 v3 | 高 | 中等 | 老牌 Hybrid Demucs 重训版 |
htdemucs_ft | 精细模式 | 最高 | 最慢(约 4 倍) | 微调版,追求极致质量再选它 |
htdemucs_6s | 六轨实验 | 看音源 | 较慢 | 额外拆出吉他、钢琴,钢琴目前效果一般 |
mdx_extra/mdx_extra_q | 最强阵容 | 最高 | 较慢 | 用大量额外数据训练,含测试集 |
怎么配:GPU 用户直接用默认htdemucs就很好;CPU 用户赶时间选mdx_q;做精修后期再上htdemucs_ft。
配错的后果:htdemucs_ft在 CPU 上跑一首歌可能要十几分钟,不是质量差,是你不该选它。模型定义和加载逻辑在 demucs/pretrained.py,想看每个模型的具体说明可以翻源码。
模块二:分离模式——四轨全拆还是只抠人声
默认情况下 Demucs 把歌拆成四个音轨。但很多时候你只想要人声(做卡拉OK)或只想要伴奏(做翻唱 remix),这时候用--two-stems就能只输出两个文件:
# 只分离人声 + 伴奏(卡拉OK模式) demucs -n htdemucs --two-stems=vocals "你的歌曲.mp3"vocals可以换成drums、bass、other任意一个音源。输出会变成vocals.wav和no_vocals.wav两个文件。
配错的后果:注意--two-stems只在输出时把其他音轨合并,它不会让你跑得更快或更省内存,因为内部仍然是完整分离后再合并的(源码里写的明明白白,见 demucs/separate.py)。
模块三:输出格式——WAV、MP3 还是 FLAC
默认输出是 16bit 的 WAV,44.1kHz 采样率,体积偏大。三个常用选项:
| 参数 | 作用 | 适用场景 |
|---|---|---|
--mp3+--mp3-bitrate 320 | 输出 MP3 | 手机随手听、传微信 |
--flac | 输出无损压缩 FLAC | 本地存储又不想损失音质 |
--float32/--int24 | 提升 WAV 位深 | 专业后期,避免精度损失 |
# 输出 320kbps 的 MP3 demucs --mp3 --mp3-bitrate 320 "你的歌曲.mp3" # 输出 FLAC demucs --flac "你的歌曲.mp3"还有个容易踩的坑叫"爆音"。分离出的音轨偶尔会超限(clipping),Demucs 默认用rescale自动缩放整体音量来规避,代价是各音轨之间的相对音量会变。如果你更想要原始响度,加--clip-mode clamp强制硬切。相关参数都在 demucs/separate.py 的get_parser()里,随手可查。
配错的后果:--mp3依赖 lameenc 库,--flac依赖 ffmpeg,缺依赖时命令会直接报错退出——所以下一节我们先把依赖补齐。
模块四:提速与省显存——性能的核心战场
这一节是全文的精华。四个参数用好了,处理速度提升 3 倍不是口号。
1. GPU 加速:-d cuda
默认情况下 Demucs 会优先用 CUDA(见 demucs/api.py 的Separator实现)。有 N 卡就显式指定:
nvidia-smi # 先确认驱动装好 demucs -d cuda "你的歌曲.mp3"2. 显存不足:--segment是你的救命稻草
显存不够是最常见的报错。原理很简单:Demucs 会把长音频切成一段一段处理,--segment 8就是每段 8 秒。段越短越省显存,但也可能略降质量。
| 你的显存 | 推荐配置 |
|---|---|
| 3GB | --segment 8 |
| 2GB | 再加环境变量PYTORCH_NO_CUDA_MEMORY_CACHING=1 |
| 4GB+ | 默认参数即可(约需 7GB 显存) |
PYTORCH_NO_CUDA_MEMORY_CACHING=1 demucs -d cuda --segment 8 "你的歌曲.mp3"注意:HTDemucs 系列的 Transformer 模型训练时最大分段是 7.8 秒,
--segment传超过 7 的值会直接报错拒绝运行,这是源码里写死的保护逻辑,别试图强行加大。
3. 并行处理:-j善用多核
-j 4表示同时用 4 个进程处理。多核 CPU 上提速明显,但它会把内存占用乘以同样的倍数——官方文档原话"be careful"。建议取 CPU 核心数的一半左右,别贪多。
4. 玄学提速:--shifts和--overlap
--shifts是官方论文里的"shift trick":对输入做随机平移、多次预测再取平均,能提升约 0.2 个点的 SDR,但速度会按倍数变慢。没 GPU 别开。
--overlap控制分段预测时的重叠率,默认 0.25,赶时间可以降到 0.1。
配错的后果:-j开满 +--shifts 10一起上,你的内存会被瞬间吃光直接 OOM 崩溃,这不是 bug,是参数用法问题。
模块五:输出位置与程序化调用
想控制文件放哪,用-o;想自定义文件名格式,用--filename:
demucs -o /data/separation --filename "{track}/{stem}.{ext}" "你的歌曲.mp3"模板里{track}是歌名、{stem}是音轨名、{ext}是扩展名。
如果你想把分离能力嵌进自己的程序,Demucs 给了两个入口。简单批量用separate.main:
import demucs.separate demucs.separate.main(["--mp3", "--two-stems", "vocals", "song.mp3"])要更细的控制就用Separator类(官方 API 文档在 docs/api.md):
from demucs.api import Separator separator = Separator(model="htdemucs", device="cuda", jobs=4) origin, separated = separator.separate_audio_file("song.mp3") separator.save_audio(separated["vocals"], "vocals.wav")一个完整实战:把 4 分钟 MP3 变成伴奏 + 人声
纸上谈兵结束,现在咱们串一遍完整流程。目标:把一首 4 分钟的 MP3 分离出高质量人声和伴奏,压缩成 MP3,全程可复现。
第 1 步:补齐依赖(约 2 分钟)
sudo apt update && sudo apt install -y ffmpeg为什么要 ffmpeg?从 torchaudio 0.12 开始,解码 MP3 必须有它,不装的话一跑 MP3 就报错。官方在 docs/linux.md 里专门强调过这一点。
第 2 步:跑分离(GPU 约 2 分钟,CPU 约 6 分钟)
demucs -d cuda --two-stems=vocals --mp3 --mp3-bitrate 320 "song.mp3"这一条命令同时干了三件事:用默认 htdemucs 模型分离、只保留人声+伴奏、输出成 320kbps 的 MP3。
第 3 步:验收产物
ls separated/htdemucs/song/ # 预期输出:no_vocals.mp3 vocals.mp3听到这,你已经拥有了一份可以放进播放器的纯伴奏。全程只用了 3 条命令,耗时取决于你的硬件——这就是 Demucs 的日常使用方式。
排错速查:9 种常见问题的三段式解法
| 报错现象 | 原因分析 | 解决动作 |
|---|---|---|
FFmpeg not found | 缺音频解码依赖 | sudo apt install ffmpeg重装 |
CUDA out of memory | 显存不够 | 加--segment 8;2GB 显存再加PYTORCH_NO_CUDA_MEMORY_CACHING=1 |
Model not found/ 下载失败 | 权重没下全 | 重跑一次让它断点续传;或手动下载模型放入~/.cache/demucs/ |
| 报"segment 太长"错误 | 超出模型训练分段上限 | HTDemucs 系列--segment最大只能到 7 |
File xxx does not exist | 路径带空格没加引号 | 把整个路径用双引号包起来:demucs "my song.mp3" |
| 分离结果爆音 | 输出超限触发削波 | 用默认rescale模式,或改--clip-mode clamp |
| 内存被吃光崩溃 | -j开太多,内存成倍增长 | 降到核心数的一半,比如 8 核机器用-j 4 |
| 分离速度极慢 | 在用htdemucs_ft或开了--shifts | 换mdx_q模型,或去掉--shifts |
| 人声里还有鼓点残留 | 模型选得太弱 | 换htdemucs或htdemucs_ft |
进阶玩法:从脚本到服务,按你的水平对号入座
入门级:批量分离脚本
一次性处理整个文件夹的歌,写个 5 行的 shell 脚本就够了:
#!/bin/bash INPUT_DIR="input" OUTPUT_DIR="separated" mkdir -p "$OUTPUT_DIR" for file in "$INPUT_DIR"/*.mp3; do [ -e "$file" ] || continue demucs -d cuda -j 4 --segment 8 -o "$OUTPUT_DIR" "$file" done经验之谈:内存别省着用、但也别同时堆太多任务,CPU 和显存各留三成余量,机器才不会罢工。
进阶级:用 Python API 写自己的批处理
Separator类支持传入callback回调,你可以在每个片段分离开始/结束时收到进度信息,随时中断任务。想给程序加个"断点续传"或"进度条",看 demucs/api.py 里的 Callback 说明,里面有完整的字段定义。
高手级:部署成常驻服务
需要长期稳定跑任务的话,可以把 Demucs 挂成 systemd 服务:
[Unit] Description=Demucs Audio Separation Service After=network.target [Service] User=yourname Environment="PYTORCH_NO_CUDA_MEMORY_CACHING=1" ExecStart=/usr/local/bin/demucs -d cuda -j 4 --segment 8 /watch/*.mp3 Restart=always [Install] WantedBy=multi-user.target保存到/etc/systemd/system/demucs.service,然后:
sudo systemctl daemon-reload sudo systemctl start demucs sudo systemctl enable demucs # 开机自启 sudo journalctl -u demucs -f # 实时看日志科研级:训练你自己的模型
普通玩法到此为止,但如果你想让 Demucs 更懂你的音乐品类,可以自己微调。训练入口和全套配置在 docs/training.md,里面有模型动物园(Model Zoo)、数据准备和评测方法。想快速改参数,改 conf/config.yaml 或 conf/variant/finetune.yaml 就行,后者是官方给的微调模板(4 个 epoch、学习率 6e-4)。想测性能瓶颈,用 tools/bench.py 跑基准,它能告诉你每段的耗时和显存峰值。
想深度参与开发,先把仓库克隆到本地:
git clone https://gitcode.com/gh_mirrors/de/demucs cd demucs pip install -r requirements.txt收尾:记住这几个操作就赢了
把整篇文章压成一张速查卡:
- 安装:
pip3 install --user -U demucs,缺 MP3 支持就装ffmpeg - 首跑:
demucs -d cpu 歌曲.mp3,产物在separated/htdemucs/歌曲/ - 提速:GPU 用
-d cuda,显存紧用--segment 8 - 抠人声:
--two-stems=vocals - 压体积:
--mp3 --mp3-bitrate 320 - 批处理:shell 循环或
Separator的 Python API
你现在缺的不是工具,是一首想分离的歌。去翻翻你的播放列表,跑起来的那一刻,你会回来感谢这 6 分钟。
【免费下载链接】demucsCode for the paper Hybrid Spectrogram and Waveform Source Separation项目地址: https://gitcode.com/gh_mirrors/de/demucs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考