使用spleeter分离人声和伴奏

使用spleeter分离人声和伴奏

spleeter简介与安装

什么是spleeter?

Spleeter是一个使用Python编写并使用了Tensorflow的带有预训练模型的Deezer源分离库。

原文

Spleeter is Deezer source separation library with pretrained models written in Python and uses Tensorflow.

另一种理解:Spleeter是一个分离库!它基于Deezer源,带有预训练模型,用Python编写,并且使用了Tensorflow。

我看到这句话的时候,有两个不懂:

  • 1、什么是Deezer?答:它是法国最大的音乐网站!这是官网,所以我的理解,Deezer源的意思是,它是使用Deezer这个网站里的音乐作为音源来训练这个库的;
  • 2、什么是Tensorflow?答:它是一个开源的端到端的机器学习框架。主要使用C++和Python编写,所以前面说的训练也是因为它是基于机器学习的;

总结:Spleeter是一个用来分离音乐中的各种声音的工具,比如音乐中有人声、伴奏声,而伴奏声又有可能有鼓声、钢琴声、贝斯声等等,最常见的,就是把一首歌的人声和伴奏分离出两个音频文件,一个是伴奏,一个是干声!

安装Spleeter

由于spleeter是python写的,所以其实它就是一个python包,或者说是一个python模块,我们可以在Python包库里搜索到spleeter,所以我们安装的时候用python的包管理器pip来安装即可。

修改python包安装源(目前测试的清华大学的比较快)

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

升级一下pip

python -m pip install --upgrade pip

安装spleeter

pip install spleeter

pip安装的包在哪儿呢?我们可以在终端输入python然后回车,进入python执行环境,然后执行以下命令来查看,一般最后一行带有site-packages的就是python包的安装目录

>>> import sys
>>> print("\n".join(sys.path))
>>> exit()

比如,我的python包安装目录在这

/usr/local/lib/python3.9/site-packages

另一种查看spleeter安装到哪里的方法

# 查看已经安装了哪些包
pip list

# 查看包信息,包括安装在哪儿
pip show spleeter

windows安装注意事项

spleeter是依赖ffmpeg的,所以如果是windows,必须把ffmpeg加入到环境变量中(虽然它是ffmpeg.exe,但我们用的时候还是可以ffmpeg,不用.exe,当然加了也可以),否则spleeter无法识别到ffmpeg,就无法使用。

因为如果单独使用ffmpeg,不加入环境变量也是能用的(只要路径对了就能用),只是现在spleeter要用它,就必须要加入到环境变量中才能被spleeter识别到。

另外在windows中目前(2022-03-15)发现python3.8.10可以用,但更高版本的python无法安装spleeter,因为spleeter依赖于tensorflow,而目前(2022-03-15)tensorflow可能不支持更高的版本。

使用spleeter

准备要分离的音频

Spleeter最典型的就是从一首歌中分离出人声和伴奏,假如你想快速制作伴奏或者消除背景声,就可以用spleeter。

所以,首先我们要有一个音乐文件,如果你是视频,那么先用ffmpeg把音频从视频里分离出来

ffmpeg -i /path/to/input.mp4 -vn -c:a aac /path/to/audio.aac

由于mp4里的音频是aac编码,所以我就直接分离成aac文件了,当然你也可以分离为mp3

ffmpeg -i /path/to/input.mp4 -vn -c:a libmp3lame -aq 2 /path/to/audio.mp3

得到音频文件后,就可以开始使用spleeter对这个音频文件进行分离了。后来发现根本不需要先转音频,直接对视频进行分离,一样可以,它会自动抽里面的音频。

准备预训练模型

前面说过spleeter是带有预训练模型的,也就是说,开发者已经拿Deezer网站上的音乐对spleeter进行进训练,spleeter通过这个训练,已经“知道”哪些是人唱的声音、哪些是伴奏、哪些是钢琴声、哪些是贝斯声、哪些是鼓声。

Spleeter自带三种预训练模型:

  • 1、人声&伴奏声分离模型(2 stems,分离出两个音轨);
  • 2、鼓声、贝斯声及其它声分离模型(4 stems,分离出4个音轨);
  • 3、鼓声、贝斯声、钢琴声及其它声分离模型(5 stems,分离出5个音轨);

训练模型是一个文件夹里有很多文件,它的文件结构如下

pretrained_models
└── 2stems
    ├── checkpoint
    ├── model.data-00000-of-00001
    ├── model.index
    └── model.meta

使用spleeter时,必须保证该模型在当前目录下,如果当前目录下不存在,它一般会自动下载,但有时候可能因为网络问题下载失败,所以我建议事先下载好。

预训练模型下载地址:github release,下载好要解压出来。

注意:模型解压出来后,它文件夹名称只是2stems(或4stems/5stems),也就是说,你要自己新建一个pretrained_models文件夹,并把这个2stems(或4stems/5stems)文件夹放到里面,而且必须保证pretrained_models文件夹在你执行命令的目录下,否则它无法检测到。

开始使用spleeter

在开始使用之前,记得当前文件夹下必须有预训练模型,具体请看准备预训练模型

我们这里只举例使用第一个模型,也就是分离人声和伴奏,命令如下

# 单个文件
spleeter separate -o /path/to/output/dir/ -p spleeter:2stems /path/to/如愿.mp3

# 同时处理多个文件
spleeter separate -o /path/to/output/dir/ -p spleeter:2stems /path/to/如愿.mp3 /path/to/aaa.mp3 /path/to/bbb.mp3

-p spleeter:2stems中的-p表示指定参数(p是params的意思),spleeter:2stems就是-p指定的参数,表示使用两音轨的预训练模型,如果你要使用4音轨或5音轨的,只要把数字2改成4或5就好了(当然你的预训练模型必须存在当前文件夹下)。

-o表示指定输出目录,o是output首字母。既然提到了o是输出,那就不得不提一下对应的输入,也就是-i(input),我们在命令中没有看到-i,但是网上有些命令会在separate后加个-i,其实这是老版本才这么用的,新版本已经把这个参数去掉了,如果你加了-i会报错。

2stems是模型名称,具体请看:准备预训练模型

使用spleeter的另一种写法

以上命名网上很多教程可能这么写

python -m spleeter separate -o /path/to/output/dir/ -p spleeter:2stems /path/to/如愿.mp3

由于spleeter本质上是python的一个模块,而pytnon -m xxx正是表示运行python的某个模块,所以这样的写法是没错的。

但由于我是macOS,macOS下pip直接把spleeter安装到了/usr/local/bin/spleeter里了,所以我们可以直接用spleeter命令(本质上它是一个python入口文件而不是二进制文件,你可以vim /usr/local/bin/spleeter打开看看,Linux应该也是这样的,不过我没试过不确定),当然如果你用传统写法python -m spleeter也是可以的。

其实windows一般也可以直接写spleeter,如果报错,那就用python -m spleeter的方式就行(因为在windows直接写有时候可能会有bug,特别是用第三方程序调用它的时候)。

生成分离文件

以上命令,不管是哪种写法,执行完成后,它会在-o指定的目录下生成一个文件夹,文件夹的名称,就是你的音频文件的名称,里面包含两个文件

accompaniment.wav
vocals.wav

accompaniment就是伴奏的意思,而vocals是人声的意思。

分离音频后可能要做的事

删除指定时间段的人声(或背景音)

如果你只是想去除某些声音(比如在间奏时不小心咳了一下,或者说话了),你可以用剪辑软件拼一下。

如下图(我是macOS,我用的ScreenFlow),第一条轨道是spleeter分离出来的伴奏,第二条轨道是人声(即从视频中分离的那个歌声)
image.jpg

从上图可以看到,人声中被我截取了一段,因为那段不小声咳了一下。

替换视频中的声音

如果你想把分离出的伴奏再添加到视频里,要先转换成aac编码

# 转成aac
ffmpeg -i /path/to/input.wmv -c:a aac -b:a 320k /path/to/output.aac

# 这里顺便提一下怎么转mp3,但视频中的音频要用aac不要用mp3
ffmpeg -i /path/to/input.wmv -acodec libmp3lame -aq 2 /path/to/output.mp3

然后再合并到mp4中

ffmpeg -i /path/to/input.mp4 -i /path/to/output.aac -c copy -map 0:v:0 -map 1:a:0 /path/to/output.mp4

解释:

  • 1、用两个-i分别输入一个视频和一个音频,-c copy表示原样复制视频和音频,不对它们进行处理。注意:还可以写成-c:v copy表示只复制视频(v:video),-c:a copy表示只复制音频(a:audio);
  • 2、-map用于从输入文件中选择轨道给输出文件,比如-map 0:v:0,意思是选择第一个(0)输入文件中的视频轨(v)中的第一轨(0),即:v左边的0表示第一个-i(程序中都是从0开始,所以编号0都代表第一,同理编号1代表第二),v右边的0,代表视频轨中的第0轨(视频轨可以有多条,但一般都只有一条);
  • 3、由第2点,我们很容易知道-map 1:a:0就是选择第二个-i文件中的音频轨(a:audio)中的第0轨;
  • 4、由前面2、3点可知,第一个-map选择的是输入文件中的视频轨,第二个-map选择的是输入文件中的音频轨,那么输出文件中的,第一条轨道就是视频轨(第一个-map),第二条轨道就是音频轨(第二个-map)。

可能出现的报错

报错一:这个报错是因为你在separate后面加了-i,而-i是老版本才有的,新版本已经去掉,所以报错

Usage: __main__.py separate [OPTIONS] FILES...
Try '__main__.py separate --help' for help.

Error: Missing argument 'FILES...'.

报错二:这个报错是由于你当前目录下没有训练模型造成的

ValueError: Can't load save_path when it is None 

特别可能出现在它自动下载的时候,被你control+C中断了,再次执行它就不会自动下载而是报这个错,你把当前目录下的pretrained_models目录删掉再执行再次执行,应该就会再次自动下载了,实在不行可以自己去github release里手动下载解压出来(要滚动下面才有)。

但要注意,下载解压后,它文件夹名称只是2stems,也就是说,你要自己新建一个pretrained_models文件夹,并把这个2stems文件夹放到里面,而且必须保证pretrained_models文件夹在你执行命令的目录下,否则它无法检测到。

因为自动下载的目录结果是这样的

pretrained_models
└── 2stems
    ├── checkpoint
    ├── model.data-00000-of-00001
    ├── model.index
    └── model.meta

参考:
python语音特征提取之使用ffmpeg与spleeter实现视频人声过滤
在线分离网站:moises

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

使用spleeter分离人声和伴奏