Demucs:拥有超万星标的音乐音源分离工具

Demucs 是 Meta AI 开发的混合频谱图与波形音源分离模型,兼容 Ultimate Vocal Remover、RVC、GPT-SoVITS。涵盖 Demucs 教程、Demucs 与 UVR 对比、Demucs Docker 部署以及生产环境基准测试。

  • MIT
  • 更新于 2026-05-19

把一首混音完成的歌曲拆分成独立的乐器音轨——人声、鼓、贝斯以及其他乐器——过去需要原始的多轨录音室文件才能做到。深度学习模型学会了如何"反混音"已经制作完成的音频之后,这一切发生了改变。如今,音乐人、制作人和开发者用这类工具来制作卡拉 OK 伴奏、提取采样、准备混音素材,以及搭建语音转换流程。在众多开源方案中,有一个模型主导了这个话题:Demucs,Meta 的混合 Transformer 架构模型,在 GitHub 上拥有超过 1 万个 star,并且在 MUSDB18-HQ 数据集的基准测试中排名靠前。

本指南将带你了解 Demucs 是什么、它的工作原理、如何在本地安装、它与 Spleeter 及 Ultimate Vocal Remover 相比表现如何,以及如何把它整合进真实的生产工作流程中。

Demucs 是什么? #

Demucs(Deep Extractor for Music Sources)是由 Meta AI Research 开发的开源音乐音源分离模型。它接收一段立体声混音作为输入,输出分离出来的各条"音轨"(stems)——通常是人声、鼓、贝斯,以及一条包含吉他、键盘和其余乐器的"其他"音轨。

该项目位于 GitHub 上的 facebookresearch/demucs,已经积累了超过 10100 个 star 和 1500 个 fork。这个仓库已于 2025 年 1 月 1 日被 Meta 存档,但原作者 Alexandre Defossez 仍在 adefossez/demucs 维护着一个活跃的分支。最新的稳定版本是 v4.1.0,整个项目采用 MIT 许可证。

Demucs 与早期工具的不同之处在于它的混合方式:它同时在时域(原始波形)和频域(频谱图)中处理音频,然后融合两种表示。这种双域处理保留了纯频谱图方法会丢失的相位信息,从而带来更干净的分离效果,减少金属感伪影。

Demucs 的工作原理 #

架构概览 #

当前这一代 Demucs——正式名称为 Hybrid Transformer Demucs(HTDemucs)——建立在一个 U-Net 卷积主干之上,并增加了 Transformer 层。整个架构在概念上分为三个阶段:

  1. 编码器:输入的波形会同时经过一个时域编码器(1D 卷积)和一个频域编码器(STFT 之后接 2D 卷积)。这种双重编码既能捕捉细粒度的时间细节,也能捕捉谐波的频率结构。

  2. Transformer 瓶颈层:U-Net 最深的几层使用一个跨域 Transformer 编码器,在每个域内部使用自注意力,在跨域之间使用交叉注意力。这个机制建模了长距离依赖关系——这对于分离例如跨越多个小节的人声旋律和音高相近的吉他声部来说至关重要。

  3. 解码器:独立的解码器在两个域中分别重建每一个音源(鼓、贝斯、其他、人声),再由一个融合层把这些输出组合成最终分离出的波形。

Demucs 架构图

可用模型 #

Demucs 提供多个预训练模型,针对不同的速度/质量取舍进行了优化:

模型音轨数显存SDR(MUSDB)使用场景
htdemucs4约 5.2 GB7.1 dB默认模型,速度与质量的最佳平衡
htdemucs_ft4约 7.8 GB7.8 dB最高质量,速度约慢 4 倍
htdemucs_6s6约 6.5 GB6.8 dB吉他 + 钢琴分离
mdx_extra_q4约 3.0 GB6.5 dB低显存系统

htdemucs_ft 模型在 MUSDB18-HQ 上的整体 SDR 达到 7.8 dB,各音源的分项数据大约为:人声 8.5 dB,贝斯 7.5 dB,鼓 8.9 dB,“其他"类别 6.2 dB。作为参考,0 dB 意味着相比原始混音没有任何分离效果的提升。

安装与配置 #

前置条件 #

在安装 Demucs 之前,先确认你的环境:

# Python 3.8+ required
python --version

# FFmpeg must be installed
ffmpeg -version

# (Optional) NVIDIA GPU with CUDA 11.8+ for acceleration
nvidia-smi

方式一:pip 安装(最快) #

让 Demucs 跑起来最简单的方法:

# Create a virtual environment
python -m venv demucs-env
source demucs-env/bin/activate  # Linux/macOS
# demucs-env\Scripts\activate   # Windows

# Install Demucs
pip install -U demucs

# Verify installation
demucs --help

方式二:Conda + GPU 支持(推荐) #

如果需要 GPU 加速的推理和训练:

# Clone the repository
git clone https://github.com/adefossez/demucs.git
cd demucs

# Create environment from official spec
conda env update -f environment-cuda.yml
conda activate demucs

# Install in development mode
pip install -e .

# Verify GPU is detected
python -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}')"

方式三:Docker(最干净的隔离方式) #

若要实现可复现、无依赖冲突的部署:

# Dockerfile
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime

RUN pip install -U demucs

WORKDIR /audio
ENTRYPOINT ["demucs"]

构建并运行:

docker build -t demucs .
docker run --gpus all -v $(pwd):/audio demucs song.mp3

Docker Compose(用于批处理服务):

version: '3.8'

services:
  demucs:
    build: .
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    volumes:
      - ./input:/audio/input:ro
      - ./output:/audio/output
    command: ["-n", "htdemucs_ft", "--mp3", "-o", "/audio/output", "/audio/input"]

首次分离运行 #

安装完成后,分离你的第一首曲目:

# Basic 4-stem separation with default model
demucs song.mp3

# Output goes to ./separated/htdemucs/song/
# Contains: drums.wav, bass.wav, other.wav, vocals.wav

# Use the fine-tuned model for better quality
demucs -n htdemucs_ft song.mp3

# Separate only vocals from instrumental
demucs --two-stems=vocals song.mp3

# Output as MP3 (smaller files)
demucs --mp3 --mp3-bitrate 320 song.mp3

验证模型下载和缓存 #

模型会在首次使用时自动下载。验证缓存内容:

# List downloaded models
ls ~/.cache/torch/hub/checkpoints/

# Expected output includes:
# htdemucs-*.th, htdemucs_ft-*.th

# Check which model will be used
demucs -n htdemucs_ft --help | grep "name"

# Quick test with a short audio file
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" test_tone.wav
demucs -n htdemucs test_tone.wav

与常用工具的集成 #

Ultimate Vocal Remover(UVR) #

Ultimate Vocal Remover 是 Demucs 最流行的图形界面前端。大多数制作人并不直接通过命令行使用 Demucs,而是选择 UVR,因为它把 Demucs 模型和其他架构打包在了一起,还加入了集成(ensemble)处理功能。

在 UVR 中的配置方法:

  1. 官方 GitHub 发布页下载 UVR5
  2. 在界面中选择 Process Method: “Demucs”
  3. 选择模型:V4 | htdemucs_ft
  4. 如果可用,启用 GPU Conversion
  5. 为获得最佳效果,使用 Ensemble Mode,将 htdemucs_ftMDX-Net 组合使用

UVR 的集成模式会并行运行多个模型并混合它们的输出,效果始终比单个模型更干净。代价是处理时间——集成模式的运行速度大约比单模型慢 3-5 倍。

RVC(基于检索的语音转换) #

RVC 流程通常会用 Demucs 作为预处理步骤,在提取语音之前先分离出人声:

import subprocess
import os

def preprocess_for_rvc(input_song, output_dir):
    """Extract clean vocals for RVC voice conversion."""
    os.makedirs(output_dir, exist_ok=True)

    # Step 1: Separate with Demucs
    subprocess.run([
        'demucs', '-n', 'htdemucs_ft',
        '--two-stems=vocals',
        '-o', output_dir,
        input_song
    ], check=True)

    # Step 2: Return path to isolated vocals
    base = os.path.splitext(os.path.basename(input_song))[0]
    vocals_path = os.path.join(
        output_dir, 'htdemucs_ft', base, 'vocals.wav'
    )
    return vocals_path

# Usage
vocals = preprocess_for_rvc('input.mp3', './separated')
# Feed vocals into RVC for voice conversion

GPT-SoVITS #

GPT-SoVITS 的语音克隆功能需要干净的参考音频。Demucs 可以在样本被送入 TTS 流程之前先去除背景音乐:

from demucs.api import Separator
import torchaudio

separator = Separator(model="htdemucs", device="cuda")

# Separate and extract vocals
origin, separated = separator.separate_audio_file("reference.mp3")
vocals = separated["vocals"]

# Save at 24kHz for GPT-SoVITS
torchaudio.save("clean_reference.wav", vocals, 24000)

Gradio 网页界面 #

如果想搭建一个自托管的分离服务:

import gradio as gr
from demucs.api import Separator

separator = Separator(model="htdemucs_ft")

def separate(audio_file, stem):
    origin, separated = separator.separate_audio_file(audio_file)
    output_path = f"{stem}.wav"
    separator.save_audio(separated[stem], output_path, samplerate=44100)
    return output_path

demo = gr.Interface(
    fn=separate,
    inputs=[
        gr.Audio(type="filepath", label="Upload Song"),
        gr.Dropdown(
            choices=["vocals", "drums", "bass", "other"],
            value="vocals",
            label="Stem"
        )
    ],
    outputs=gr.Audio(label="Isolated Stem"),
    title="Demucs Source Separation",
    description="Separate music into stems using Meta's Demucs model"
)

demo.launch(server_name="0.0.0.0", server_port=7860)

基准测试 / 真实使用场景 #

MUSDB18-HQ 基准测试结果 #

MUSDB18-HQ 是音乐音源分离领域的标准基准测试集,包含 150 首完整长度的歌曲及其对应的真实分离音轨。SDR(信噪失真比)越高,说明分离效果越干净。

模型整体 SDR人声贝斯其他速度(RTX 3090)
HTDemucs FT (v4)7.8 dB8.5 dB8.9 dB7.5 dB6.2 dB约 4 倍实时速度
HTDemucs (v4)7.1 dB7.8 dB8.2 dB6.9 dB5.6 dB约 16 倍实时速度
Hybrid Demucs (v3)7.7 dB8.1 dB8.5 dB7.2 dB5.9 dB约 12 倍实时速度
Spleeter 4stems5.9 dB6.3 dB6.8 dB5.4 dB4.2 dB约 100 倍实时速度
Open-Unmix5.3 dB6.2 dB5.9 dB4.7 dB4.2 dB约 80 倍实时速度

生产环境使用场景 #

卡拉 OK 伴奏生成--two-stems=vocals 选项通过直接混合鼓 + 贝斯 + 其他乐器、去掉人声轨来生成伴奏。一首 4 分钟的歌曲在 GPU 上不到 30 秒即可处理完成。

面向制作人的采样提取:从完整混音中分离出鼓点、贝斯线或旋律元素。htdemucs_6s 模型增加了吉他和钢琴的分离,不过这两条音轨的质量低于主要的四条音轨。

语音转换预处理:干净的人声提取是 RVC、GPT-SoVITS 等语音克隆流程的前提条件。相比纯频谱图方法,Demucs 生成的人声音轨串扰更少。

音频修复:档案管理人员使用 Demucs 分离历史录音,对各条音轨分别进行降噪处理,再重新混音。

处理时间参考 #

对于一首 44.1 kHz、4 分钟的立体声曲目:

硬件htdemucshtdemucs_fthtdemucs_6s
RTX 4080 GPU约 15 秒约 55 秒约 25 秒
RTX 3080 GPU约 20 秒约 75 秒约 35 秒
Apple M3(MPS)约 45 秒约 3 分钟约 70 秒
Intel i7-13700 CPU约 5 分钟约 18 分钟约 8 分钟

进阶用法 / 生产环境强化 #

用于自定义流程的 Python API #

如果需要编程化控制,可以绕开命令行,直接使用 Python API:

import torch
import torchaudio
from demucs.pretrained import get_model
from demucs.apply import apply_model

# Load model
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = get_model("htdemucs_ft")
model.to(device)
model.eval()

# Load audio
wav, sr = torchaudio.load("input.mp3")

# Ensure stereo
if wav.shape[0] == 1:
    wav = wav.repeat(2, 1)

# Add batch dimension
mix = wav.unsqueeze(0).to(device)

# Separate with optimized settings
with torch.no_grad():
    sources = apply_model(
        model,
        mix,
        shifts=1,       # Shift trick: higher = better, slower
        split=True,     # Process in chunks (required for long audio)
        overlap=0.25,   # Overlap between chunks
        segment=10,     # Segment length in seconds
        progress=True,
        device=device
    )[0]

# sources shape: (num_sources, channels, samples)
source_names = model.sources  # ['drums', 'bass', 'other', 'vocals']

# Save individual stems
for i, name in enumerate(source_names):
    torchaudio.save(f"{name}.wav", sources[i].cpu(), sr)

批处理流程 #

from pathlib import Path
import subprocess
import json

def batch_separate(input_dir, output_dir, model="htdemucs"):
    """Process all audio files in a directory."""
    input_dir = Path(input_dir)
    output_dir = Path(output_dir)
    output_dir.mkdir(parents=True, exist_ok=True)

    audio_exts = {'.mp3', '.wav', '.flac', '.ogg', '.m4a'}
    files = [f for f in input_dir.iterdir() if f.suffix in audio_exts]

    # Process all files in a single Demucs invocation
    subprocess.run([
        'demucs', '-n', model,
        '-o', str(output_dir),
        '--mp3',
        '--mp3-bitrate', '320',
        *[str(f) for f in files]
    ], check=True)

    # Generate metadata manifest
    manifest = {}
    for f in files:
        base = f.stem
        stem_dir = output_dir / model / base
        manifest[base] = {
            'drums': str(stem_dir / 'drums.mp3'),
            'bass': str(stem_dir / 'bass.mp3'),
            'other': str(stem_dir / 'other.mp3'),
            'vocals': str(stem_dir / 'vocals.mp3'),
        }

    with open(output_dir / 'manifest.json', 'w') as fp:
        json.dump(manifest, fp, indent=2)

    return manifest

# Usage
batch_separate('./raw_songs/', './stems/', model='htdemucs_ft')

长音频文件的内存优化 #

Demucs 会把整个音频文件加载进 GPU 内存。对于时长较长的曲目或显存有限的情况:

# Force CPU offloading for large files
import os
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'

# Use smaller segments
sources = apply_model(
    model,
    mix,
    split=True,
    segment=7,      # Reduce from default ~10s to 7s
    overlap=0.1,    # Reduce overlap
    device=device
)[0]

监控与日志记录 #

import logging
import time

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('demucs')

def separate_with_metrics(input_path, output_dir):
    start = time.time()

    separator = Separator(model="htdemucs_ft", device="cuda")
    origin, separated = separator.separate_audio_file(input_path)

    duration = time.time() - start
    logger.info(f"Separated {input_path} in {duration:.1f}s")

    # Log per-stem levels
    for name, audio in separated.items():
        rms = torch.sqrt(torch.mean(audio ** 2)).item()
        logger.info(f"  {name}: RMS={rms:.4f}")

    return separated

与其他方案的对比 #

特性Demucs (v4)Ultimate Vocal RemoverSpleeterOpen-Unmix
架构混合波形 + 频谱图 + TransformerGUI 封装(多种后端)频谱图 U-Net频谱图 LSTM
MUSDB SDR7.8 dB (htdemucs_ft)不适用(使用 Demucs/MDX)5.9 dB5.3 dB
最大音轨数6(人声、鼓、贝斯、吉他、钢琴、其他)4(取决于模型)5(含 sides)4
需要 GPU推荐推荐可选可选
处理速度约 4-16 倍实时(GPU)约 3-10 倍实时(集成模式)约 100 倍实时约 80 倍实时
显存占用5-8 GB6-12 GB(集成模式)<2 GB<2 GB
活跃开发社区分支活跃已归档(2021)维护模式
许可证MITMITMITMIT
最适合追求质量优先的分离易用的 GUI + 集成模式快速批处理轻量级部署

该如何选择:当你需要最高的分离质量并且在搭建自动化流程时,直接使用 Demucs。当你想要图形界面、集成处理,并且不介意额外的搭建成本时,使用 UVR。只有在硬件受限、需要极致速度,或者在维护遗留代码时,才使用 Spleeter。Open-Unmix 依然适合教学用途以及资源受限的边缘部署场景。

局限性 / 客观评估 #

Demucs 并不是适合所有音频任务的工具。以下是它表现不佳的地方:

实时分离:即使是最快的 Demucs 模型(htdemucs),在 RTX 4080 上也只能达到约 16 倍实时的处理速度。这对于现场演出或实时流媒体应用来说远远不够快。像 Spleeter 或专门的 ONNX 导出方案更适合对延迟敏感的场景。

吉他和钢琴分离htdemucs_6s 模型尝试把吉他和钢琴作为独立音轨分离出来,但这两个音源的 SDR 明显低于主要的四条音轨。如果你的核心需求是分离出特定的吉他音轨,像 Basic Pitch 这样的专用转谱工具可能更合适。

高度压缩的母带:经过重度限幅、响度拉满的曲目(在现代 EDM 和流行音乐中很常见)会产生频率遮蔽,扰乱分离模型的判断。Demucs 在这类曲目上可能会产生伪影——旋绕的声音、跨音源串扰——而在动态范围更大的混音中不会出现这些问题。

模型体积htdemucs_ft 的模型体积约为 2 GB,比 Spleeter(约 150 MB)大一个数量级。这对边缘部署、移动应用以及对冷启动敏感的无服务器环境来说是个需要考虑的因素。

上游仓库已归档:原始的 facebookresearch/demucs 仓库已被存档,不再维护。虽然 adefossez/demucs 仍然活跃,但其长期维护路线尚不明朗。在做依赖规划时需要把这一点考虑进去。

常见问题 #

问:运行 Demucs 需要什么硬件? 答:Demucs 可以在 CPU 上运行,但强烈建议使用显存 6GB 以上的 NVIDIA GPU。对于 htdemucs 模型,5.2 GB 显存已经足够。对于 htdemucs_ft,建议预留 8 GB。纯 CPU 处理也能工作,但一首 4 分钟的歌曲大约需要 5-20 分钟,而 GPU 处理不到一分钟。

问:Demucs 可以用于商业用途吗? 答:可以。Demucs 采用 MIT 许可证,允许不受限制地进行商业使用、修改和分发。分离出的音轨可以用于商业制作。需要注意的是,MIT 许可证只适用于代码和模型本身,不涉及你所处理音乐的版权。

问:为什么 Demucs 听起来比 Spleeter 效果更好? 答:Demucs 同时在时域和频域处理音频,保留了纯频谱图方法会丢弃的相位信息。它的 Transformer 层在建模长距离音乐依赖关系方面也比 Spleeter 的 U-Net 更出色。这带来的结果就是更少的伪影和更少的跨音源干扰。

问:如何高效处理一整张专辑? 答:把多个文件一次性传给单次 Demucs 调用:demucs -n htdemucs *.mp3。Demucs 会依次处理这些文件,但避免了重复加载模型的开销。若要追求最大吞吐量,可以在不同的 GPU 上运行多个 Demucs 实例,或者使用"进阶用法"章节中提供的批处理脚本。

问:Demucs 支持哪些音频格式? 答:Demucs 使用 FFmpeg 进行解码,使用 torchaudio 进行编码。输入格式:MP3、WAV、FLAC、OGG、M4A,以及任何 FFmpeg 支持的格式。输出格式:WAV(默认,16 位)、float32 WAV(--float32)、24 位 WAV(--int24),或 MP3(--mp3,可调节比特率)。

问:可以用自己的数据微调 Demucs 吗? 答:可以,但需要完整的训练流程。你需要为训练歌曲准备好分离好的音轨(格式与 MUSDB18-HQ 相同),然后使用 Dora 实验管理工具执行 dora run -d solver=htdemucs dset=your_dataset。大多数用户不需要这么做——预训练模型在各种曲风上的泛化能力已经很好。

问:htdemucshtdemucs_ft 有什么区别? 答:htdemucs_ft 针对每个音源分别进行了微调,使用了额外的训练数据,并默认启用了 shift 技巧。它在所有音源上的 SDR 提高了约 0.7 dB,但运行速度慢了约 4 倍,显存占用也多出 50%。快速迭代时使用 htdemucs,追求最终生产质量的输出时使用 htdemucs_ft

结论 #

截至 2026 年,Demucs 仍然是开源音乐音源分离领域的参考实现。它的混合 Transformer 架构在标准基准测试中比 Spleeter 高出 20%-40% 的分离质量,并且能干净利落地集成进语音转换流程、卡拉 OK 生成器和音频制作工具中。

对于搭建音频流程的开发者来说,Demucs 提供了文档完善的 Python API、Docker 支持,以及针对不同速度/质量取舍的多个模型版本。MIT 许可证消除了商业使用上的顾虑。主要需要注意的是硬件要求(强烈建议使用 GPU)、模型体积(约 2 GB),以及上游仓库已被存档的现状。

行动建议:用 pip install -U demucs 安装 Demucs,用 demucs -n htdemucs_ft song.mp3 在测试曲目上运行你的第一次分离,再用上文的 Python API 示例把它整合进你的流程。如果想要图形界面体验,下载 Ultimate Vocal Remover 并使用它的集成模式。

加入 dibi8.com 的 Telegram 群组,每周深度解读开源 AI 工具:https://t.me/dibi8channel

推荐主机与基础设施 #

在把上述任何工具部署到生产环境之前,你需要可靠的基础设施。以下是 dibi8 实际在用并推荐的两个选项:

  • DigitalOcean — 60 天内可获得 200 美元免费额度,覆盖 14 个以上全球节点。是独立开发者运行开源 AI 工具的默认选择。
  • HTStack — 香港 VPS,从中国大陆访问延迟低。这正是承载 dibi8.com 的同一家 IDC——经过生产环境的实战检验。

联盟链接——不会给你带来额外费用,但能帮助 dibi8.com 持续运营。

来源与延伸阅读 #

参考与来源 #

💬 留言讨论