大家好,我是烤鸭:

   最近在搞新项目,遇到相关的技术了,做一个关于人声分离的技术分享。从框架分析到实际使用对比。还有demo调用和软件使用示例。

简介

先上豆包给的回答:

想要开箱即用、质量与功能均衡:选UVR5 GUI;需要极速与低门槛:选Spleeter;追求极致音质与灵活配置:选Demucs。三者均开源,可根据场景组合使用。

人声分离开源项目与模型推荐 (2025)

1️⃣ 最佳综合选择:Ultimate Vocal Remover 5 (UVR5)
  • GitHubhttps://github.com/Anjok07/ultimatevocalremovergui
  • 特点:集多引擎于一体,支持MDX-NetDemucsVR Architecture等,分离质量高,社区评价可超越部分商业软件
  • 易用性:⭐⭐⭐⭐⭐ 图形界面,一键式操作,无需编程
  • 平台:Windows、macOS、Linux 全支持
  • 安装:
    • Windows:下载.exe安装包,一路下一步
    • macOS:下载.dmg,拖动到 Applications
    • Linux:按文档安装依赖后运行
  • 优势:
    • 内置多模型,可一键切换与参数微调
    • 支持人声、伴奏、鼓、贝斯等多音轨分离
    • 可输出高保真音频 (最高192kHz/24bit)
  • 适用人群:音乐爱好者、内容创作者、音频编辑者
2️⃣ 最佳轻量级与快速处理:Spleeter (Deezer 开源)
  • GitHubhttps://github.com/deezer/spleeter (⭐️26.7k)

  • 特点:轻量高效,Deezer 出品,支持2/4/5 音轨分离

  • 易用性:⭐⭐⭐⭐☆ 安装简单,命令行友好,有图形界面版本

  • 安装:

  • bash运行

    pip install spleeter
    
  • 基本使用:

    bash运行

    spleeter separate -p spleeter:2stems -o output_folder input_audio.mp3
    
  • 优势:

    • 处理速度快,CPU 也能流畅运行,适合大批量处理
    • 资源需求低,适合低配置设备
    • 有 Python 库接口,便于集成到项目
  • 适用人群:需要快速分离人声 / 伴奏、批量处理音频的用户

3️⃣ 最佳音质与专业级处理:Demucs (Meta AI 开源)
  • GitHubhttps://github.com/facebookresearch/demucs (⭐️8.8k)

  • 特点:基于Wave-U-Net与混合 Transformer,音质在多项评测中领先,适合复杂编曲

  • 易用性:⭐⭐⭐⭐ 命令行或图形界面,需一定 Python 基础

  • 安装:

    bash运行

    pip install demucs
    
  • 基本使用:

    bash运行

    demucs --two-stems=vocals input_audio.mp3
    
  • 优势:

    • 分离质量极高,SDR (信号失真比) 显著领先,人声更纯净
    • 支持4/5 音轨分离,乐器分离更精准
    • 可在 Colab 免费 GPU 环境运行,无需本地高配
  • 注意:高质量模型 (如htdemucs_ft) 对硬件要求高,建议8GB + 显存 GPU

  • 适用人群:音乐制作人、音频工程师、对音质要求极高的用户

功能对比速查表

特性 UVR5 Spleeter Demucs
分离质量 ★★★★★ ★★★★ ★★★★★
处理速度 ★★★★ ★★★★★ ★★★(高配 GPU 下★★★★)
资源需求 中 - 高 (视模型而定) 低 - 中 高 (高质量模型)
安装难度 ★★ ★★
界面 GUI (推荐) CLI/Python API CLI/GUI (第三方)
模型数量 多种 (集成 MDX、Demucs 等) 3 种 (2/4/5 stems) 多种 (含量化模型)
多轨支持 支持 (人声 + 乐器) 2/4/5 stems 4/5 stems
开源协议 MIT MIT MIT

最佳实践与建议

  • 入门用户:优先尝试UVR5 GUI,几乎零学习成本,直接拖拽即可获得高质量分离结果

  • 开发者 / 批处理:使用Spleeter,轻量、易集成,适合自动化流程

  • 音质发烧友:用Demucs的高质量模型 (如htdemucs_ft),搭配 GPU 获得专业级分离

  • 进阶技巧

    • 复杂音频可先用UVR5粗分离,再用Demucs精调
    • Spleeter适合快速预览,确定最佳参数后再用高质量模型处理
    • 处理长音频时,使用Demucs--segment参数分片处理,降低内存占用

总结

综合易用性、质量与功能,UVR5是当前最佳 “一键式” 选择;追求极致音质选Demucs;追求速度与低门槛选Spleeter。三者均开源,可按需组合使用,获得更全面的音频分离体验。

测试环境

  • Python 3.11 or greater
  • CUDA 12.8
  • windows 4070S 12G

实际测试

挨个测试下这些模型,参考视频如下:

https://www.xiaohongshu.com/explore/66e1712300000000120123a3
原地址打不开了,可以自己搜一下。
“工作累了的话,就来智己LS6” 第一条就是。
在这里插入图片描述

ffmpeg相关命令:

#音频分离
ffmpeg -y -i input.mp4 -vn 输入音频.mp3
#波形图
ffmpeg -i 输入音频.mp3 -filter_complex "showwavespic=draw=full:s=640x240" -frames:v 1 波形图.png
  • Demucs

  • UVR

  • spleeter

UVR为基础的项目:

项目:https://github.com/nomadkaraoke/python-audio-separator

提取音频:

docker run -it -v E:\data\docker\audio-separator:/workdir beveradb/audio-separator ls6.mp3

在这里插入图片描述

波形图看的话整体效果还是不错的,除了23秒左右的特效音和结尾部分唱歌开头部分,基本都过滤了。声音也比较明显。

在这里插入图片描述

项目:https://github.com/Eddycrack864/UVR5-UI

可以选择模型,进行分离,更像是接入了通配的UI端,而且支持Win和Linux一键部署。

在这里插入图片描述
在这里插入图片描述

Demucs为基础的项目:

https://github.com/facebookresearch/demucs

https://modelscope.cn/models/monetjoe/hdemucs_high_musdbhq

使用魔塔下载模型文件

modelscope download --model monetjoe/hdemucs_high_musdbhq --local_dir D:\\models\\modelscope\\monetjoe\\hdemucs_high_musdbhq

测试demo

import torch
import torchaudio
import soundfile as sf
import os
from utils import download

# -------------------------- 1. 配置参数(仅需改这2处!)--------------------------
MODEL_DIR = "D:\\models\\modelscope\\monetjoe\\hdemucs_high_musdbhq"  # 你的本地模型文件夹路径
OUTPUT_DIR = "/data/audios/outputs/"  # 结果保存目录(自动创建)


# -------------------------- 2. 加载预训练模型 --------------------------
def load_sep_model(model_dir):
    # 拼接权重文件路径(模型权重名固定为 hdemucs_high_musdbhq_only.pt)
    weight_path = os.path.join(model_dir, "hdemucs_high_musdbhq_only.pt")
    # 初始化HDemucs模型(分离目标:鼓、贝斯、其他乐器、人声)
    model = torchaudio.models.hdemucs_high(sources=["drums", "bass", "other", "vocals"])
    # 加载本地权重 + 切换推理模式
    model.load_state_dict(torch.load(weight_path, map_location="cuda"))  # 有GPU可改"cuda"
    model = model.to("cuda")  # 关键:将模型移至GPU
    model.eval()
    return model

def audio_separate(audio_path:str):
    # 1. 加载模型
    print("加载模型...")
    model = load_sep_model(MODEL_DIR)

    # 2. 加载并预处理音频(统一采样率44100Hz、转单通道、加batch维度)
    # 2. 加载并预处理音频(只保留重采样,删除转单通道的步骤)
    print(f"处理音频 网络地址:{audio_path}")
    local_path = audio_path
    file_uuid = ""
    # 下载远程音频到本地
    if audio_path and audio_path.startswith("http"):
        local_path,file_uuid = download(audio_path)
    print(f"处理音频:{local_path}, file_uuid:{file_uuid}")
    waveform, sr = torchaudio.load(local_path)
    # 重采样(模型只认44100Hz)
    # 重采样后添加通道数处理
    if sr != 44100:
        waveform = torchaudio.transforms.Resample(sr, 44100)(waveform)

    # 新增:如果是单通道,转换为2通道(复制单通道数据到两个通道)
    if waveform.shape[0] == 1:
        waveform = torch.cat([waveform, waveform], dim=0)  # 形状从[1, length]变为[2, length]

    # 加batch维度
    waveform = waveform.unsqueeze(0).to("cuda")

    # 3. 执行分离(禁用梯度加速)
    print("正在分离...")
    with torch.no_grad():
        separated = model(waveform)  # 输出shape:[1,4,1,音频长度](4对应4个源)

    # 4. 保存结果
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    # 提取人声
    vocals_filename = f"{file_uuid}-vocals.wav"
    vocals = separated[0, 3, 0].cpu().numpy()  # 先cpu()移至CPU,再转numpy
    sf.write(os.path.join(OUTPUT_DIR, vocals_filename), vocals, 44100)
    print(f"已保存:{os.path.join(OUTPUT_DIR, vocals_filename)}")

    # 合并非人声(drums + bass + other)
    bgms_filename = f"{file_uuid}-bgms.wav"
    non_vocals = separated[0, 0, 0].cpu().numpy() + separated[0, 1, 0].cpu().numpy() + separated[0, 2, 0].cpu().numpy()
    sf.write(os.path.join(OUTPUT_DIR, bgms_filename), non_vocals, 44100)
    print(f"已保存:{os.path.join(OUTPUT_DIR, bgms_filename)}")

    print(f"\n分离完成!结果在:{os.path.abspath(OUTPUT_DIR)}")
    return {
        "vocals": vocals_filename,
        "bgms": bgms_filename
    }


if __name__ == "__main__":
    audio_separate("D:\\xxx\\ls6.mp3")

声音饱和度比UVR好一些,不过细节太差了,杂音很多,基本每句话都能听到背景音。

在这里插入图片描述

spleeter为基础的项目:

https://github.com/deezer/spleeter

调试也非常简单,本地需要ffmpeg

# install spleeter with pip
pip install spleeter
# 分离音频
spleeter separate -p spleeter:4stems -o output E:\\my\\my-blog\\大模型\\人声分离\\ls6.mp3

波形图也能看出来,采样点更多。整体效果听起来不太好,8秒和13秒的杂音未过滤,结尾的唱歌人声压缩过重,还不如不处理。

在这里插入图片描述

总结

很多声音的频率跟人声音差不多,比如场景杂音或者加的背景特效音,完全过滤还是比较难的,少不了二次手动处理。如果有固定的声音场景,可以考虑自己训练lora。

实际体验下来的话,跟豆包给的结论差不多。

追求准确率的用UVR或者Demucs,需要GPU。个人测试的话,感觉UVR更好一些,不过可能样本有关系,后来又测试了几个,这俩效果差不多。

资源不够的话,用spleeter。

文章参考

https://github.com/Eddycrack864/UVR5-UI

https://github.com/nomadkaraoke/python-audio-separator

https://github.com/deezer/spleeter

https://github.com/facebookresearch/demucs

https://github.com/charzy/Hybrid-Demucs-v3-

https://blog.csdn.net/gitblog_00669/article/details/151734608

https://blog.csdn.net/gitblog_00380/article/details/151549046

https://modelscope.cn/models/monetjoe/hdemucs_high_musdbhq

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐