【五分钟会,半小时懂】人声分离Demucs

简介: 【五分钟会,半小时懂】人声分离Demucs

Demucs介绍

       Demucs是Facebook开源的声音分离模型,简单易用,结构简单,现在很多应用都以Demucs作为baseline进行优化。

       Demucs提供了Demucs和Convs - tasnet作为backbone的实现,在MusDB数据集上进行了预训练。预训练模型可以分离鼓、贝斯、人声和其它,超过了以前基于波形或光谱图的方法。下面是官方给出的对比图,可以看出Demucs is SOTA!所以我们下面主要使用Demucs作为backbone,并简单介绍它的原理。

Model Domain Extra data? Overall SDR MOS Quality MOS Contamination
Open-Unmix spectrogram no 5.3 3.0 3.3
D3Net spectrogram no 6.0 - -
Wave-U-Net waveform no 3.2 - -
Demucs (this) waveform no 6.3 3.2 3.3
Conv-Tasnet (this) waveform no 5.7 2.9 3.4
Demucs (this) waveform 150 songs 6.8 - -
Conv-Tasnet (this) waveform 150 songs 6.3 - -
MMDenseLSTM spectrogram 804 songs 6.0 - -
D3Net spectrogram 1.5k songs 6.7 - -
Spleeter spectrogram 25k songs 5.9 - -

Demucs的使用

       方法一:如果没有python环境,简单,我打了一个包。

链接:https://pan.baidu.com/s/1J-PkILFEoMyC2_S1rBsTMA 

提取码:j9it

       windows下解压缩,将要分离的文件放在separate/data/input目录,双击separate1.exe,等待。。。结果就会放在separate/data/output/demucs[音频文件名]/目录中,会生成4个文件,其中vocals.wav是人声。

       方法二:如果有Python环境,也很简单。先安装依赖,依赖如下:

       diffq>=0.1

       lameenc>=1.2

       julius>=0.2.3

       numpy

       torch>=1.8.1

      torchaudio>=0.8

       tqdm

       1.安装

pip install demucs

     2.分离一个音频试试,就用cpu吧,执行下面命令

python -m demucs.separate [PATH_TO_AUDIO_FILE] -o [PATH_TO_OUT_DIR] --name demucs --mp3 -d cpu

       3.结果存在目录demucs/demucs/separated/demucs/[音频文件名]/,会生成4个文件,其中vocals.wav是人声。

        Demucs的基本使用就介绍完成了,是不是很简单,如果只是单纯想使用的小伙伴,到这里就可以结束了,如果想深入研究的小伙伴,咱们继续。

Demucs原理

源码下载:https://github.com/facebookresearch/demucs/

       上面是官方提供的模型结构图,如果看不太明白可以看下面我画的那个,Demucs的结构并不复杂,一句话就能概括:Demucs基于U-Net卷积架构,Encoder和Decoder之间加入了BiLSTM。


       U-Net卷积架构,灵感来自Wave-U-Net和SING,Decoder的Upsampling使用反卷积,整个模型在channel膨胀的Conv1d之后使用GLU激活函数。


Encoder的Downsampling单元:经过两个Conv1d,第一个使channel扩大到out_c大小、width缩为Input的1/4,后接一个ReLu;第二个使channel扩大到out_c的2倍、width不变,后接一个GLU,GLU使channel数变为1/2(具体为什么下面说),也就是out_c的大小。整个Downsampling的输出是channel根据需要变为out_c、width变为Input的1/4。

20210908110432710.png

Dencoder的Upsampling单元:由一个Conv1d和一个反卷积组成,第一个Conv1d使channel扩大到in_c的2倍、width(因为是一维卷积,没有height)不变,后接一个GLU,GLU使channel数变为1/2,也就是in_c的大小;第二个反卷积使channel扩大到out_c的大小、width扩大到Input是4倍,后接一个ReLu。整个Upsampling的输出是channel根据需要变为out_c、width变为Input的4倍。


20210908110444759.png

     GLU(门控线性单元Gated linear units)激活函数

       GLU出自2016年的论文Language Modeling with Gated Convolutional Networks,链接:https://arxiv.org/abs/1612.08083v1,论文原意是在处理语言任务时利用多层的CNN结构代替传统的RNN结构,从而解决RNN不能并行的问题,引入了这一激活函数。

表达式为:f(X) = (X * W + b) * O(X * V + c)

Relu激活单元:(X * W + b),加上一个Sigmoid激活单元:O(X * V + c),构成的gate unit,就构成了GLU单元。

       在pytorch中有nn.GLU的门控线性激活函数,实现类似下面,可以看到输入被分成两份,一份线性变换一份sigmoid,然后做乘法,所以Input的width减半:

class GLU(nn.Module):
    def __init__(self):
        super(GLU, self).__init__()
 
    def forward(self, x):
        nc = x.size(1)
        assert nc % 2 == 0, 'channels dont divide 2!'
        nc = int(nc/2)
        return x[:, :nc] * torch.sigmoid(x[:, nc:])

        对GLU感兴趣的小伙伴可以去看一下论文,下面看一下模型的整体结构,并不复杂,而且保持了U-Net的美感。


        Input是2通道,我参考的预训练模型的depth=6,也就是Downsampling和Upsampling都是6次,每次channel变换2倍,width变化4倍。可以看到,模型就是U-Net中间加了一个LSTM,为了做残差使用了一个center_trim方法对齐size。输出channel=8,因为四种声音,每种声音2通道。


        损失函数默认l1Loss,当然也可以选择mse,值得一提的是loss中加了一项:可微量化因子。它是通过在训练过程中在模型参数中加入独立的伪量化噪声,以近似量化算子的效果。其实就是一个惩罚项,主要作用是通过降低参数精度,达到压缩模型的目的,据说DiffQ将一个16层的transforme压缩了8倍,相当于4位精度,而只损失了0.5个点,当然训练时也可以设置diffq=0不使用这个功能。


DiffQ论文链接:https://arxiv.org/abs/2104.09987


        Demucs主要结构就介绍到这里,Demucs没有论文只有代码,其实还有很多细节需要自己发现,我也只是一个小学生,欢迎大家批评指正。

相关文章
|
7月前
|
人工智能 搜索推荐 物联网
InstantID:一张照片,无需训练,秒级个人写真生成
InstantID 是由InstantX项目组推出的一种SOTA的tuning-free方法,只需单个图像即可实现 ID 保留生成,并支持各种下游任务。
|
编解码 移动开发 视频直播
一文详解 m3u8 视频格式与分析视频秒开优化
秒开指的是,一秒内成功加载的播放数/播放总数。本意是想对比一下m3u8与mp4视频格式,并了解m3u8格式优缺点,以确定一个大概优化方向。但对m3u8做简单了解后,觉的m3u8可能是一个优化方向。
11250 4
一文详解 m3u8 视频格式与分析视频秒开优化
|
4月前
|
人工智能 算法
你试过一秒钟出现在世界各地的感觉吗?使用一键人像抠图换背景,让你拥有任意门
准备人像与背景图,访问ModelScope一键抠图换背景工具。上传人像至位置1,背景至位置2。点击按钮稍候,AI快速生成新图,将人像无缝融合至新背景中。体验高效便捷,算法智能精准,边缘处理细腻无痕,支持多样背景选择,输出质量高,适合多种应用场景。
|
7月前
|
前端开发 定位技术 SEO
基于WordPress开发的高颜值的自适应主题,支持白天与黑夜模式
环境要求 WordPress >=6.0PHP >=7.4 主题特性 支持白天与暗黑模式 全局无刷新加载 支持博客、CMS、企业三种布局 内置 WP 优化策略 内置前台用户中心 支持 QQ / Github / Gitee / 微博登录 支持缩略图伪静态 全局顶部滚动公告 图形及极验验证码支持 自定义 SMTP 支持 一键全站变灰 网页压缩成一行 后台防恶意登录 内置出色的 SEO 功能 评论 ajax 加载 文章点赞、打赏、海报生成、分享 Twemoji 集成 丰富的广告位 丰富的小工具 自动百度链接提交 众多页面模板(读者墙 / 归档 / 书籍推荐 / 站点导航 / 标签 / 站点地图
73 5
|
传感器 机器学习/深度学习 算法
能抓取玻璃碎片、水下透明物,清华提出通用型透明物体抓取框架,成功率极高
能抓取玻璃碎片、水下透明物,清华提出通用型透明物体抓取框架,成功率极高
150 0
|
7月前
|
机器学习/深度学习 人工智能 算法
免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
在音视频领域,把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有原始工程文件的情况下,将其还原和分离是一件很有难度的事情。 言及背景音人声分离技术,就不能不提Spleeter,它是一种用于音频源分离(音乐分离)的开源深度学习算法,由Deezer研究团队开发。使用的是一个性能取向的音源分离算法,并且为用户提供了已经预训练好的模型,能够开箱即用,这也是Spleeter泛用性高的原因之一,关于Spleeter,请移步:[人工智能AI库Spleeter免费人声和背景音乐分离实践(Python3.10)](https://v3u.cn/a_id_305),这里
免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
|
7月前
|
机器学习/深度学习 API 计算机视觉
视觉智能平台常见问题之使用智能分镜功能拆分镜头丢失部分镜头如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
111 0
|
XML 编解码 数据格式
下载哨兵2号大气校正后L2A级数据的方法
本文介绍在Sentinel哨兵遥感影像数据官网中,下载已经经过大气校正的Sentinel-2 L2A级遥感影像产品的方法~
383 1
下载哨兵2号大气校正后L2A级数据的方法
|
TensorFlow 算法框架/工具 C++
Python实现音唱人声(歌声)伴奏分离
这篇博客针对《Python实现音唱人声(歌声)伴奏分离》编写代码,功能包括了人声(歌声)-伴奏分离。运用Spleeter库进对音频文件编辑。
460 0
Python实现音唱人声(歌声)伴奏分离
|
机器学习/深度学习 存储 人工智能
【OpenVI-视觉评价系列之MOS评价实战篇】手机存储不够用,清理照片太痛苦?MOS评价帮你挑选“垃圾”照片
MOS(Mean Opinion Score)是一种常用的主观质量评价方法,常用于视频、图像等多媒体领域中的质量评价。MOS视觉评价通常是通过让受试者观看视频/图像,对视频的清晰度、锐度、颜色饱和度、运动模糊、噪声等方面进行评价。然而,MOS视觉评价也存在一些局限,例如需要大量的受试者,评估时间较长等。因此,近年来,研究者们也开始探索使用客观评价方法来替代或补充MOS视觉评价。
525 2
【OpenVI-视觉评价系列之MOS评价实战篇】手机存储不够用,清理照片太痛苦?MOS评价帮你挑选“垃圾”照片