后处理模块目标:用于人声音乐分离的场景
增加这个模块的初衷是:尽可能抑制空白vocal部分的残留,只后处理vocal,不处理伴奏
1.例:
可以看到vocal本身是空白的地方,模型并没有完全输出空白
2.也有paper里边提到对空白部分vocal的抑制效果,不过它使用MHE(MINIMUM HYPERSPHERICAL ENERGY),相当于是在loss上加了一个regularization,并不是后处理:
其实抑制的并不是特别明显:
图片来自:[1]. IMPROVING SINGING VOICE SEPARATION WITH THEWAVE-U-NET USING MINIMUM HYPERSPHERICAL ENERGY Joaquin Perez-Lapillo, Oleksandr Galkin, Tillman Weyde Department of Computer Science City, University of London {joaquin.perez-lapillo,oleksandr.galkin,t.e.weyde}@city.ac.uk.
后处理方法可行性探索
•频域人声音乐分离任务中vocal mask可视化
首先我发现输出的vocal mask,在有无音乐的地方有较为明显的特征
一些可视化的mask(.png):
举例来看:
可以看到分离网络分出了伴奏和人声部分,但是不敢把没有vocal的地方mask完全输出0
基于以上观察,我认为一个后处理模块可以做到以下两点:
1.把已经分出来的伴奏完全抑制
2.把未能分出来的乐器尽量抑制
•实验设置
示意图如下:
•右侧是熟悉的分离网络,左侧是新加的一个后处理的网络,两个网络同步训练
•实验主要是变更Posterior handling module(绿色的模块,后续简称PHM),这个模块是生成一个对mask的mask(图中红线,后续简称Mmask),然后乘到原本的vocal mask上边
•整体思路
实验初期使用传统方法:
•方案一:手动提取mask特征
•方案二:使用vad检测vocal边界,抑制边界外部分
以上两种方法比较有效,既然手动提取特征可行,那么使用深度学习方法应该会更好,故而设计:
•方案三:生成Mmask的深度学习模型
•具体方案描述
方案一:手动提取特征
○第一步:截取mask的低频(freq.bin的下1/4),在纵轴上加和,并除以最大值(归一化)
○第二步:将上一步结果进行平滑,可以前向平滑,后向平滑,也可以两个方向都看,如下为后向平滑结果,但是后向的话容易导致vocal的尾音被抑制:
○第三步:将上一步结果经过一个**函数s,得到s(Mmask),s函数为sigmoid的变体:
▪s(x) = 1/(1+e^(a*(x-b))),将[0,1]之间的Mmask进行处理
▪之所以不用阶跃函数是为了防止人声和音乐的分界过于突然
▪例如a = 100,b = 0.1
4294967295.得到Mmask的值如下:
○第四步:对Mmask中小于特定长度的抑制部分进行去除,减少误抑制率
○第五步:mask = mask*Mmask,原本的mask一部分被抑制,另外一部分保持不变
•效果
○可以比较有效的抑制(下图:西原健一郎_-_Serendipity_vocal):
musdb-test10
•缺点:
○在人声的结束拖尾音的地方容易被截断
○由于方法单一,人声也容易被误抑制
•具体实现:
方案二:使用vad检测vocal边界
1.下图的第一个图代表vad预测的vocal区域平滑后的结果,1为歌唱声,0为非歌唱声
2.下图的第二个图代表根据vad预测进行后处理后的歌唱声
虽然也管用,但是也存在问题和方案一同样的误抑制和尾音截断问题
方案三(预计使用的):深度学习方法
生成mmask的结构(即PHM):(一维卷积->BN->Relu)*->sigmoid
实验分析:
•首先在小数据集上进行了实验,在训练初期可以达到抑制效果(小数据集上过拟合后后处理就作用不大了):
比如: ,虽然效果不是特别理想,但是伴奏部分确实被抑制了一部分
•由于后处理模块要尽可能的多遇到误分类到vocal的伴奏(才能达到训练目的),故而推测这个模块在数据量增加或模型泛化能力强的时候(都不容易过拟合)可以显现出来优势
•Mmask相当于将原本的分离任务转化为了分类任务,而且是在分离任务提取出的特征之上进行的
效果:
•当前还没有达到预期的理想效果,分析是vocal中空白占比太低,导致PHM倾向于都输出1(保留原本mask的值)
○预期解决方案:手动在数据中加入空白vocal
存在问题:
•效果如何表示,量化的问题