使用spleeter分离人声和伴奏
Table of Contents
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分离出来的伴奏,第二条轨道是人声(即从视频中分离的那个歌声)
从上图可以看到,人声中被我截取了一段,因为那段不小声咳了一下。
替换视频中的声音
如果你想把分离出的伴奏再添加到视频里,要先转换成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。