用Demucs本地提取带和声伴奏:AI人声分离与工程化实践
2026/9/24 23:42:17 网站建设 项目流程

喜欢听 Epik High、宋旻浩、Simon Dominic 合作曲的朋友,应该都搜过类似的关键词:“Epik High 宋旻浩 Simon - No, Thank 带和声伴奏”。搜这个词的人,通常不是想听原曲,而是想拿一段能用于翻唱、Reaction 视频、现场演出、编曲学习或者混音练习的伴奏,而且最好还保留一部分背景和声,听感上不会太干。

但现实是,这类“带和声伴奏”的现成资源非常少,能找到的大多是网友私自提取的,音质不稳定,而且存在版权风险。更稳妥、更可控的方式,是自己用本地 AI 人声分离工具从正版音频里提取伴奏。这篇文章不提供任何盗版下载渠道,重点讲清楚:怎么用开源工具做高分离质量的人声去除,怎么尽量保留和声轨,怎么批量处理,怎么通过命令行和接口把这件事工程化。

文章会围绕四个核心环节展开:人声分离工具选型、本地部署环境准备、伴奏提取与和声保留测试、批量任务与接口封装。如果你手里正好有合法获取的音频文件,可以直接照着流程跑一遍。

1. 核心能力速览

先把这类“伴奏提取 + 和声保留”任务的核心能力项列出来。

能力项说明
任务类型AI 音频人声分离、伴奏提取、和声保留
常用开源工具Demucs、UVR5 / UVR、MDX-Net、Spleeter
适用模型htdemucs、htdemucs_ft、MDX23C、UVR-MDX-NET 系列
分离轨数2 轨(人声 / 伴奏)、4 轨(鼓 / 贝斯 / 其他 / 人声)、6 轨(更细分乐器)
硬件要求CPU 可运行,NVIDIA GPU + CUDA 加速效果更佳
显存占用视模型、音频时长、分段参数而定,没有统一固定值
启动方式命令行、Python 库、UVR 图形界面、自制 API 服务
是否支持 APIDemucs 本身无 HTTP 接口,可自行封装 FastAPI
是否支持批量任务支持文件夹批量处理
输出格式WAV、FLAC、MP3(需转码)
适合场景翻唱伴奏制作、混音练习、编曲分析、现场音源处理

这里要注意,不要被“AI 人声分离”几个字吓到。现在的开源模型已经相当成熟,普通消费级显卡就能跑,CPU 慢慢跑也能出结果,只是时间问题。

2. 适用场景与使用边界

先明确这个方案适合谁,不适合谁。

适合的人群:

  • 翻唱作者:想快速拿到干净的伴奏,尤其想要带一点和声的版本。
  • 混音学习者:想拆开人声、鼓、贝斯、其他乐器,逐轨分析混音方式。
  • 现场音源处理者:对现场录音做去噪、人声分离、伴奏提取。
  • 批量音频处理需求方:比如视频创作者需要对多段素材做统一处理。

不适合的场景:

  • 需要直接拿别人分离好的人声、伴奏做商用发行,一定要确认版权授权。
  • 对输出质量要求极高、必须使用分轨母带的专业录音室场景,AI 分离只能做辅助。
  • 试图通过分离工具“去掉”正版歌曲中受版权保护的人声并重新发布,这仍然属于对原录音的修改使用,需要获得授权。

关于版权问题必须强调:文章里所有操作都应当基于你已经合法获取的音频文件。如果你只有流媒体平台的试听权限,本地分离出来的伴奏只能用于个人学习、练习和合理使用范围内的二次创作,不能直接上传到平台作为原创内容、不能商用、不能二次分发。涉及人脸、声音、音乐版权的场景,一律要确认授权。

3. 环境准备与前置条件

在开始之前,先检查环境。

3.1 操作系统与基础环境

  • Windows 10/11、Ubuntu 20.04 及以上、macOS 均可运行。
  • 建议使用 Python 3.9 到 3.11 版本,避免依赖冲突。
  • 需要安装 FFmpeg,因为 Demucs 音频解码依赖它。

Ubuntu 安装 FFmpeg:

sudo apt update sudo apt install ffmpeg

Windows 推荐使用 winget 安装:

winget install Gyan.FFmpeg

检查是否安装成功:

ffmpeg -version

3.2 Python 虚拟环境

强烈建议创建虚拟环境,不要把依赖装进系统 Python。

python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activate

3.3 显卡与 CUDA

Demucs 支持 CPU 推理,但速度慢很多。如果有 NVIDIA 显卡,建议提前配置 CUDA 版 PyTorch。

先用nvidia-smi看驱动和 CUDA 版本:

nvidia-smi

然后根据本机 CUDA 版本安装对应 PyTorch。安装方式以 PyTorch 官网为准,例如:

pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu121

这里的cu121需要根据你的 CUDA 版本和 PyTorch 官方适配情况替换。

3.4 音频文件准备

输入的音频建议使用 WAV 或 FLAC 这类无损格式,采样率 44.1kHz、位深 16bit 或 24bit。不要直接拿低码率 MP3 做分离,否则人声和乐器在压缩过程中已经混入难以修复的伪影。

4. 安装部署与启动方式

这里以 Demucs 为主,UVR5 作为补充方案介绍。

4.1 安装 Demucs

在虚拟环境中执行:

pip install demucs

安装完成后,验证命令行可用:

demucs --help

首次运行会自动下载模型权重到~/.cache/torch/hub/checkpoints,需要联网,模型文件通常几百 MB,具体大小以实际下载为准。

4.2 使用 UVR5 图形界面

如果不想碰命令行,可以找 UVR(Ultimate Vocal Remover)的整合包。它提供了图形界面,适合一次性操作单个音频文件。

通用使用流程:

  1. 打开 UVR 的启动程序。
  2. 选择输入音频文件。
  3. 选择人声分离模型,比如 MDX-Net 或 UVR-MDX-NET 系列。
  4. 设置输出目录。
  5. 点击 Process 开始分离。

UVR5 的优点是模型选择丰富、可视化程度高,缺点是批量处理能力和自动化程度不如 Demucs 命令行。

4.3 对比结论

从工程化角度看,Demucs 更适合脚本化和批量处理,UVR5 更适合手动精细化调参。下面所有自动化示例都以 Demucs 为主。

5. 功能测试与效果验证

以“Epik High 宋旻浩 Simon - No, Thank 带和声伴奏”这个需求为例。假设你已经有合法获取的 WAV 音频文件No_Thank_You.wav,目标有两个:

  • 去掉主唱人声,得到纯伴奏。
  • 在伴奏里尽量保留背景和声。

5.1 基础分离:去掉主唱人声

Demucs 最简单的用法:

demucs --two-stems vocals -o output "No_Thank_You.wav"

--two-stems vocals表示把音频分成两轨:vocals.wavno_vocals.wav。其中no_vocals.wav就是去除主唱的伴奏。

判断成功的标准:

  • 人声是否明显消失。
  • 鼓、贝斯、合成器、钢琴等乐器是否完整。
  • 听感上有没有明显的金属声、水声、伪影。

这一步做完,你得到的是“无人声伴奏”。但很多说唱和声复杂,主唱可能被完全去掉,和声也会跟着被削掉一部分,听起来会比较空。

5.2 进阶需求:尽量保留和声

“带和声伴奏”比“纯伴奏”难在:和声往往和主唱一起被归入 vocals stem。不同的分离模型对和声的处理策略不同,有的把和声当做人声跟着一起去掉,有的会把一部分和声留在 other stem 里。

要把和声保留下来,常见的做法有两种。

做法一:使用 4-stem 或 6-stem 分离,再手动混合。

执行 4-stem 分离:

demucs -n htdemucs -o output "No_Thank_You.wav"

输出目录下会得到drums.wavbass.wavother.wavvocals.wav四个文件。

先检查每个轨道的听感:

  • 如果背景和声被分进了other.wav,可以直接把drums + bass + other混合成伴奏,这样和声就自然保留在伴奏里了。
  • 如果背景和声被分进了vocals.wav,就需要进一步处理。可以把vocals.wav再丢给其他分离模型,尝试分离“主唱”和“伴唱”。这一步效果不稳定,需要多试几个模型。

做法二:使用 UVR 的和声保留模型。

UVR 中有部分模型专为卡拉 OK、和声保留场景设计。这类模型在分离时会把和声尽量保留在伴奏轨道中。具体模型效果因歌曲而异,没有百分百成功的方案。

操作上,你在 UVR 界面里选择 MDX-Net 模型,将输出模式设定为“保留和声”或“保留背景人声”相关模式,然后处理同一个文件,对比输出结果。

5.3 混音:把分离结果组合成需要的伴奏

如果最终你决定把other.wav中的和声与纯伴奏合并,可以用 FFmpeg 完成。

先把三个乐器轨混合成基础伴奏:

ffmpeg -i drums.wav -i bass.wav -i other.wav -filter_complex amix=inputs=3:normalize=0 -ac 2 output_instrumental.wav

再把和声轨以较低音量混合进去:

ffmpeg -i output_instrumental.wav -i harmony.wav -filter_complex "[0:a][1:a]amix=inputs=2:normalize=0:duration=first,volume=1.0" final_accompaniment.wav

这里的harmony.wav是你在第 5.2 步中分离出来的和声轨。音量比例需要根据实际试听调整。

5.4 效果验证清单

每次处理完,建议按这个清单检查:

  • 主唱是否被有效去除。
  • 和声是否保留在伴奏中。
  • 低频是否完整(Bass 和 Kick 是否丢失)。
  • 有没有明显伪影和破音。
  • 整曲时长是否与原始音频一致。
  • 左右声道是否正常,有没有单声道化导致的相位问题。

如果发现某一项不合格,优先调整模型和分段参数,不要急着换工具。

6. 接口 API 与批量任务

Demucs 本身不提供 HTTP API,但在批量处理和自动化场景中,可以通过 Python 脚本或自建服务解决。

6.1 命令行批量处理

Demucs 支持直接传入多个文件:

demucs --two-stems vocals -o output audio1.wav audio2.wav audio3.wav

也可以对目录下所有音频做循环处理,写一个 Python 脚本调用子进程:

import subprocess from pathlib import Path input_dir = Path("./input_audio") output_dir = Path("./output_audio") output_dir.mkdir(exist_ok=True) for audio_file in input_dir.glob("*.wav"): print(f"Processing: {audio_file.name}") subprocess.run( [ "demucs", "--two-stems", "vocals", "-o", str(output_dir), str(audio_file) ], check=True, ) print("All done.")

注意,这个脚本默认使用 CPU 或者当前环境已安装的 torch 默认设备。如果要强制使用 GPU,可以在调用前设置环境变量:

import os os.environ["CUDA_VISIBLE_DEVICES"] = "0"

6.2 用 FastAPI 封装 HTTP 接口

如果要把伴奏提取能力暴露成服务,给前端或第三方工具调用,可以用 FastAPI 包一层。

先安装依赖:

pip install fastapi uvicorn python-multipart

写一个最小接口:

import subprocess import tempfile import shutil from pathlib import Path from fastapi import FastAPI, UploadFile, File app = FastAPI() @app.post("/separate") async def separate(file: UploadFile = File(...)): with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: tmp.write(await file.read()) tmp_path = tmp.name output_dir = tempfile.mkdtemp() subprocess.run( [ "demucs", "--two-stems", "vocals", "-o", output_dir, tmp_path ], check=True, ) stem_dir = Path(output_dir) / "htdemucs" / Path(tmp_path).stem instrumental_path = stem_dir / "no_vocals.wav" vocal_path = stem_dir / "vocals.wav" return { "status": "ok", "instrumental": str(instrumental_path), "vocals": str(vocal_path), }

启动服务:

uvicorn app:app --host 127.0.0.1 --port 8000

用 curl 测试:

curl -X POST http://127.0.0.1:8000/separate \ -F "file=@No_Thank_You.wav"

这个接口只做演示,实际项目中需要增加异步任务队列、文件清理、鉴权、限流和磁盘空间检查,避免服务被大量任务打满。

6.3 批量任务建议

批量任务不要直接在 HTTP 请求里同步等待,建议用消息队列或简单任务表。例如:

  1. 接收任务后,把文件保存到pending目录。
  2. 后台 worker 扫描目录,逐个处理。
  3. 处理完成输出到done目录。
  4. 前端通过任务 ID 查询状态。

这样做的好处是任务失败可以单独重跑,不会因为一个坏文件卡住整批。

7. 资源占用与性能观察

人声分离是典型的计算密集型任务,资源占用主要看模型、音频时长和推理参数。

7.1 显存占用观察

在 GPU 推理时,可以用nvidia-smi实时观察显存占用:

nvidia-smi -l 1

不同模型和不同参数下显存占用差异很大,没有统一的“固定值”。更稳妥的判断是:先用自己的音频跑一次小片段,记录显存峰值,再决定批量任务并发数量。

7.2 CPU 与 GPU 推理差异

CPU 推理也能完成分离,但速度慢得多。一首 3 分钟的歌曲,GPU 可能几十秒到几分钟完成,CPU 可能需要几倍甚至十几倍时间。如果只是偶尔处理一两首歌,CPU 完全够用;如果要批量处理,建议至少准备一张支持 CUDA 的 NVIDIA 显卡。

7.3 影响性能的关键参数

  • 音频长度:越长越慢,显存占用也会上升。
  • 采样率:高采样率文件计算量更大。
  • 模型复杂度:MDX-Net 系列通常比轻量模型更慢。
  • 分段参数:Demucs 的--segment参数可以把长音频切成短段处理,降低显存峰值。如果遇到显存不足,可以调小 segment 长度。
  • 批处理大小:Demucs 中的--batch可以设置批次,过大容易爆显存。

如果显存不足,一个常见做法是降低分段长度,并关闭 PyTorch 的非必要缓存:

demucs --two-stems vocals --segment 9 -o output "No_Thank_You.wav"

7.4 端口冲突与进程残留

自建 API 服务时,端口被占用是常见问题。先查端口占用:

Linux / macOS:

lsof -i :8000

Windows:

netstat -ano | findstr :8000

如果端口被占用,换一个端口启动即可。

8. 常见问题与排查方法

下面是实际操作中比较常见的几类问题。

问题现象可能原因排查方式解决方案
安装依赖失败Python 版本不匹配、pip 源问题查看报错日志升级到 Python 3.9-3.11,换 pip 源重装
运行时报错缺少 FFmpegFFmpeg 未安装或未加入 PATHffmpeg -version验证安装 FFmpeg 并配置系统环境变量
CUDA 不可用PyTorch 版本与驱动不匹配Python 中执行import torch; print(torch.cuda.is_available())安装匹配的 CUDA 版 PyTorch
显存不足音频太长或 segment 参数过大查看报错信息和显存占用调小--segment,减少并发
输出目录找不到结果文件模型首次下载失败或输入路径错误检查日志和缓存目录删除缓存重新下载,确认输入文件存在
分离后人声残留明显模型选择不合适对比不同模型结果换用 MDX-Net 系列或 UVR 专用模型
伴奏听起来有空洞感原曲混音本身人声过重试听 vocals 轨确认接受现状或做混音补偿处理
API 调用返回 500上传文件格式不对或后端处理超时查看服务日志统一输入格式,增加超时时间,加大队列等待
批量任务中途卡住某个文件损坏或格式异常添加日志逐文件排查给每个任务增加超时和失败重试

这里特别提醒:如果你对不同模型的效果不满意,不要只盯着一个模型调参。换一个模型重跑往往比反复调参更快。AI 人声分离的效果和歌曲风格、混音方式强相关,同一首歌在 A 模型上分离效果好,换一首歌可能 B 模型更合适。

9. 最佳实践与使用建议

结合人声分离和伴奏提取的实际项目,整理几条工程化建议。

第一,先做小片段测试,再跑全曲。处理完整首歌曲之前,先截取副歌和高潮部分测试模型效果,确认人声去除是否干净、和声保留是否合理,避免全曲跑完才发现效果不行。

第二,保留一套最小可运行配置。比如把输入目录、输出目录、模型名、segment 参数、batch 大小写到一个配置文件里,方便重复使用。

示例配置:

{ "input_dir": "./input_audio", "output_dir": "./output_audio", "model_name": "htdemucs", "two_stems": "vocals", "segment": 9, "batch": 4, "device": "cuda" }

第三,输入素材、模型文件、输出结果分目录管理。不要所有文件混在一个目录,批量处理时尤其明显。建议至少分成input/output/models/logs/四个目录。

第四,批量任务加日志和失败重试。每个文件处理前打一条日志,处理后打一条日志,失败时把错误信息单独记录。批量处理中某个文件失败不应该中断整批任务。

第五,接口服务要限制访问范围。如果自建 HTTP API,不要默认监听0.0.0.0,先绑定127.0.0.1,只有需要远程访问时才放开,并加 Token 或简单鉴权。

第六,涉及版权素材必须确认授权。你自己手上的音频能不能做分离、能不能公开使用,取决于你获取该音频时的协议和当地版权法规。不要以为“我本地跑了一下”就自动获得重新发布的授权。

第七,输出质量要复核。AI 分离结果不是百分百可靠。做正式发布前,戴上耳机全曲试听,重点检查:人声是否残留、和声是否保留、低频是否完整、是否有伪影。

10. 总结与下一步

回到最初的需求:想拿到“Epik High 宋旻浩 Simon - No, Thank 带和声伴奏”。最靠谱的路径不是等待现成资源,而是自己基于合法音频,用 Demucs 这类开源模型做人声分离,再用 4-stem 或 6-stem 结果手动混合出保留和声的伴奏版本。

最开始先验证的是两件事。第一,demucs --two-stems vocals能不能把你的目标音频人声干净地去干净。第二,4-stem 分离后,和声到底被分到了vocals还是other,这将决定后续用哪种方式保留和声。

最容易踩的坑有两个:一是直接用低码率 MP3 做分离,输出伪影严重;二是盲目追求“一个模型通吃所有歌曲”,没有针对具体歌曲做模型对比。

接下来可以继续扩展的方向也不少:把分离接口接入自己的视频剪辑流程、用批量脚本处理整张专辑、对不同风格的歌曲做模型效果对比,或者把分离出的和声轨单独用于编曲参考。

这套本地 AI 人声分离方案不复杂,但每一步都能明显影响最终效果。建议先拿一两首歌跑通流程,再根据实际听感调整模型和参数。收藏这篇文章,下次需要伴奏时直接照着操作即可。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询