去年帮朋友筹备婚礼时遇到个棘手问题——新人想合唱《今天你要嫁给我》,但原版伴奏带有陶喆的人声,直接使用会影响演唱效果。当时试了七八个在线分离工具,要么效果稀烂,要么要等半小时排队。这件事让我意识到:一个能离线运行、效果靠谱的人声伴奏分离工具,绝对是音乐爱好者的刚需。
这个工具的核心价值在于三点:
测试过三种主流技术路线:
最终选择Spleeter的4 stems模型(人声/鼓/贝斯/其他),实测发现:
为达到离线使用目标,采用Docker容器化方案:
dockerfile复制FROM tensorflow/tensorflow:2.4.0-gpu
RUN pip install spleeter==2.3.0 ffmpeg-python
ENTRYPOINT ["spleeter"]
关键配置参数:
-B 256 控制内存占用(8G设备可降为128)-o /output 指定输出目录--filename_format {instrument}.{codec} 自定义输出文件名安装Docker Desktop:
softwareupdate --install-rosetta下载预训练模型:
bash复制docker pull researchdeezer/spleeter:latest
mkdir -p ~/spleeter/pretrained_models
wget -P ~/spleeter/pretrained_models https://github.com/deezer/spleeter/releases/download/v1.4.0/4stems.tar.gz
以周杰伦《晴天》为例:
bash复制# 将MP3文件放入input文件夹
docker run --rm -v ~/spleeter/input:/input -v ~/spleeter/output:/output researchdeezer/spleeter separate -p spleeter:4stems -o /output /input/晴天.mp3
生成文件结构:
code复制output/
晴天/
vocals.wav
accompaniment.wav
drums.wav
bass.wav
关键技巧:用Audacity对accompaniment.wav做+3dB增益补偿,可消除分离后的音量衰减
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 输出杂音大 | 原曲比特率低于192kbps | 用iZotope RX做降噪后处理 |
| 人声残留 | 歌曲有复杂和声 | 改用5stems模型重新分离 |
| 处理卡死 | 内存不足 | 添加-B 128参数降低batch size |
对于专业级需求:
bash复制docker run ... spleeter separate \
--mwf \ # 启用幅度加权中值滤波
--stft_backend tensorflow \ # 改用TF计算频谱
--codec flac # 输出无损格式
实测发现:
制作升降调伴奏的完整流程:
bash复制sox accompaniment.wav output.wav pitch +200 # 升2个半音
借助Virtual Audio Cable实现:
python复制import sounddevice as sd
from spleeter.separator import Separator
separator = Separator('spleeter:4stems')
def callback(indata, frames, time, status):
sources = separator.separate(indata)
sd.play(sources['accompaniment'])
with sd.Stream(callback=callback):
input("Press Enter to stop")
实测延迟控制在800ms内(需RTX显卡支持)
这个方案最大的惊喜是处理老歌效果超出预期,最近用1987年的《冬天里的一把火》测试,居然能干净分离出费翔的人声。不过要注意对于电子音乐,底鼓有时会被误判为人声低频部分,这时需要用EQ切掉80Hz以下频段再重新处理。