使用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来安装即可。

安装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?

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

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

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

后来发现根本不需要先转音频,直接对视频进行分离,一样可以,它会自动抽里面的音频。

由于mp4里的音频是aac编码,所以我就直接分离成aac文件了,当然你也可以分离mp3,只不过这样就要转码

ffmpeg -i /path/to/input.mp4 -vn -acodec libmp3lame -aq 2 /path/to/audio.mp3

得到音频文件后,就可以开始使用spleeter对这个音频文件进行分离了。

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

Spleeter自带三种预训练模型:

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

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

spleeter separate /path/to/audio.aac -p spleeter:2stems -o /path/to/output/dir/

网上很多教程可能这么写

python -m spleeter separate /path/to/audio.aac -p spleeter:2stems -o /path/to/output/dir/

由于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也是可以的。

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

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

2stems、4stems、5stems这三种模型其实也是需要下载的,当你执行命令后,它会自动下载到你执行命令的当前目录下,它的结构是这样的

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

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

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

accompaniment.wav
vocals.wav

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


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

如下图(我是macOS,我用的ScreenFlow),第一条轨道是原音乐(从视频中分离的那个音乐),第二条轨道是spleeter分离出来的伴奏
Screen Shot 2021-10-16 at 01.41.17
相信大家看的出来,第一条轨道中的几个小段被我剪掉了,代替它的是第二条轨道中的伴奏,也许被我前掉的部分就是有其它声音(说话、咳嗽,不小心碰到东西等),而替换成伴奏文件中对应的声音,就没这个问题了。而第一条轨道正常的部分,对应的第二条轨道的伴奏就被我删除了,因为第一条轨道本身就是伴奏和人声一起的。


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

# 转成aac
ffmpeg -i /path/to/input.wmv -c:a aac -b:a 320k /path/to/output.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/accompaniment.aac -c:v copy /path/to/output.mp4

注意:不需要事先把视频文件中的声音去掉,因为该命令会直接替换视频中原来的音轨。

可能出现的问题

这个报错是因为你在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实现视频人声过滤

打赏
订阅评论
提醒
guest

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

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

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

使用spleeter分离人声和伴奏