语音/音乐分离综述

语音分离

——其实是鸡尾酒会效应,但是任意信号分离难度比较大。语音和噪音分离-enc,音乐分离,语音和语音之间分离,大概分这几种吧。其实严格来说还需要搭配声学事件检测之类的来进行,但是此处假定信号成分已知。
——然后语音分离常见的是两个人分离,任意说话人数量的分离也是可以的,但是三个人以上的难度陡增。一般可分为单通道和多通道
——多通道可能会用到额外的麦克风阵列辅助,也可能是每个通道做单通道分离。当然也可以是先单通道预分离再结合。
——分离问题属于欠定问题,很适合用深度学习来解决。

传统方法的语音分离需要引入多通道信息进行分析,单通道属于难点。传统方法往往要求噪声具有一定的平稳性,有传统的滤波方法,也有听觉场景分析的方法。听觉场景分析是根据心理声学来对人耳听觉特性进行组合,从而区分语音和干扰噪声的方法,听觉场景分析对噪声的平稳性没什么要求,但是要准确的检测得到语音的基音。
盲源分离的方法有独立成分分析,非负矩阵分解。独立成分分析要假设源信号彼此的独立性,然后通过计算使得各个信号独立性最大从而实现分离。<但是实际上源信号不可能相互独立。>独立成分分析要求麦克风数量大于等于需要分离的声源数。欠定分析的话就是找各个源活跃的时间,排除不活跃的源,从而减少需要估计的数量,把欠定转换为非欠定,从而实现分离。

非负矩阵分解其实类似于神经网络<浅层版>,有监督和无监督,先有监督训练,再无监督分解。但是非平稳噪声情况下分离接过比较差。

基于深度学习的方法主流的是有监督学习,常用帧级别的特征,常见的有基音特征<鲁棒性较强>,和别的特征搭配很适合提高分离模型效果。但是分离信号中如果混有噪音,那估计准确基音会比较难,此外清音没有谐波结构,难以用基音特征处理,因此语音分离任务中很少单独用。
后面发展了很久,最后常用的就是幅度谱,相位谱重建比较困难,也影响没那么大。然后实际应用中幅度谱要略好于对数幅度谱<语音信号集中于中低频>

然后目标函数也是发展了很久,傅里叶mask和soft mask的分离效果比较好。加复数当然效果更好,但是可能会比较费劲儿。但是这个mask只是中间过程,还是最后的信号才是真正需要关注的。<但是这个mask训练只能选目标,比较固定。>
所以有人将mask于分离训练过程结合,网络自行学习合适的mask以得到最好的分离幅度谱,再转换回信号,得到更好的训练结果。
当然,也可以直接估计重建目标幅度谱,但是跳过mask这一步骤,网络的学习难度会更大,而且得到的频谱并不完全等于原信号的频谱。
此外还存在一个标签置换问题。<说话人无关的分离的难点。>即,判断输出信号的归属,常用的有聚类和置换不变的训练方法。置换不便通过匹配输出均方误差,取最小得到输出。<其实按理来说是第一次判断出来属于哪个说话人就不变了,所以初始的匹配比较重要。但是输入音频信号长度其实未知,然后说话人并不恒定为固定两个人,可能一开始AB对话,然后是BC对话,所以实际上还是得一直判断的。此外也很难保证一开始得到的说话人顺序就是后面的说话人顺序,本质说话人无关,网络里如何排列也没办法确定>然后facebook吧好像是,提出说话人特征向量<x-vector啥的>嵌进网络里,然后这样子也可以避免判断。<不过没开源>

目前最常用的输入如果是幅度谱重建,那就是短时傅里叶频谱,成本低。
如果是时域端到端,那就是自己学习得到的变换,不知道啥谱,用卷积学就完事儿了。最后再用反卷积还原得到原信号。这样子得到的输出时延短,质量高,但是问题是计算量。
然后gan也有,但是问题在于,不知道有几个说话人,也许可以一个目标说话人搭配几个干扰说话人?
但是分离强调的是两个说话人的信号都想要,不然就是说话人提取+降噪了jpg。那就先提取目标人的信息然后处理就完事儿了。这个难搞的地方在于混在一起的两个语音都是想要的。虽然这种场景比较少吧……
然后网络现在主要是全卷积形式为主,多尺度卷积是常用的形式,倒不如说unet自从提出来就在各个领域大火。

然后时域信号太长了,一般采用编解码器结构处理:encoder-net-decoder。先通过encoder把输入时域信号转换成提取出的特征,然后进入网络,经过学习输出对应的mask,两者相乘,然后再经过decoder最后输出结果

然后主要需要解决整体特征和局部特征的问题。整体特征提取的好,局部特征拉跨x,反过来也不行。所以就是浅层网络需要人多努力,找好特征,深层网络人少费事儿,但是计算量大。
典型的特征-短时幅度谱,其实是把信号的相位丢掉,只取变换后实数部分,在学习完了之后将得到的幅度谱和原信号相位混合-得到时域信号。
当然,encoder有不少种形式,decoder对应的有不少种形式,最省事的就是全都通过网络学习完成,其次傅里叶变换,gammatone变换还有sinc编码。不过sinc主要针对的是语音识别,为了减少冗余编码,低频倾注更多关注<即滤波器数量>,但是吧,sinc和gamatone都没有解码器结构,只能反卷积。只能说是有助于输入端关注语音信号吧。

Luo大佬提出了不少新颖好用的分离方面的结构,<后拜读jpg 补>

然后吧,网络结构那就多元化了……有没有用谁也不知道。目前公认有用的那必然是卷积和transfomer了。一个纯卷积,一个是纯自注意力。自注意力有利于捕捉长序列信息,卷积适合于捕捉短序列信息。各有好处吧。

然后以下就摘自Luo的端到端声源分离研究进展辽:
最先被提出的方法为TasNet模型,该模型使用Encoder提取语音二维特征,随后通过Separation估计说话人mask,最后通过Decoder实现二维特征到语音波形的转换从而得到分离语音。
在这里插入图片描述

由于Decoder存在无法完美重构的问题,因此对于TasNet的深入探究和修改也得到了很多新的研究结果。在下述Two-step separation中,首先单独训练Encoder以及Decoder以期其能引入更少的失真。随后固定Encoder和Decoder只训练Separation,该训练方法可提升分离上限。
此外我们希望Encoder能够更关注低中频部分,因此提出了Multi-phase Gammatone filterbank,相较于随机初始化学习,该方法可得到更好的频率响应分布。
在这里插入图片描述
此外还有对训练目标和训练任务上的一些探索。Wavesplit引入说话人特征进行分离。该模型首先在一个固定时间窗内计算说话人向量,然后通过聚类计算出全局向量。之后将说话人信息送入分离网络得到分离结果。
在这里插入图片描述

DPRNN在这里插入图片描述MulCat DPRNN通过同时优化分离和说话人识别两个目标实现更好的说话人分离,此外该网络能够实现5-6人的分离,因此该网络是一个很好的设计。

以上介绍的网络目标均为将所有源分离出来,但在一些情况下一些源不具备很明显的被分离的意义,如智能音箱场景,因此说话人提取也具有十分重要的研究意义。

SpEx/SpEx+联合TasNet和说话人提取网络,从而只输出一个说话人的mask,实现声源提取的工作。
在这里插入图片描述
多通道语音分离:
相较于单通道,多通道语音可得到更多的空间信息,从而进一步辅助语音分离。目前多通道端到端语音分离研究主要集中在两个方向:神经网络波束形成以及单通道模型向多通道扩展。基于输出的神经网络波束形成方法主要有DeepBeam和Beam-TasNet方法。

DeepBeam使用时域多通道维纳滤波,先选择一个参考麦克风,通过训练单通道增强网络对该麦克风信号进行预增强得到更加干净语音的信息,并利用该信息作为维纳滤波的目标,对其他麦克风解最优维纳滤波解得到最优滤波器参数。——<维纳滤波后补>

Beam-TasNet方法通过时域频域结合的方法。首先通过多通道TasNet分离得到预分离语音,随后通过分离语音估计频域上的MVDR权重,并作用于混合语音中得到分离语音。该方法通过时域方法隐式地进行了相位估计,并利用了空间特征得到分离语音。此外时域方法loss函数存在静音段消除过于激进的问题从而导致听感上的不友好。
在这里插入图片描述

而MVDR方法可对整句话进行滤波,对某一声源消除能力略低但失真较少,因此Beam-TasNet 中也考虑了如何将二者的长处在后处理步骤中进行结合,以得到更好的性能。
此外基于神经网络的波束形成主要工作有Neural network adaptive beamforming(NAB),Filter-and-sum Network(FaSNet)。

NAB方法通过将多通道信号拼接送入神经网络估计得到每个通道的滤波器系数,并作用于每个通道的原始信号可得到增强信号。该方法类似于Filter-and-Sum Beamformer。
在这里插入图片描述
FaSNet则侧重于多通道间信息共享以联合优化多通道时域滤波器。
在这里插入图片描述
而对于单通道向多通道扩展的方向,目前主要的方法是对单通道信号加入多通道信息作为模型输入以及直接将多通道信号作为模型输入。Multi-channel TasNet通过将单通道信息拼入IPD进行联合训练,或直接使用二维卷积估计通道间特征插值进行联合训练。Multi-channel Wave-U-Net则是将多通道信号拼接送入Wave-U-Net,因此只需将模型的输入通道数改为信号的通道数即可。
在这里插入图片描述

展望

如何得知混合音频中有多少说话人?在会议或讨论场景中两人同时说话的占比一般最高只为30%左右,大多数时间为一个人甚至没有人说话。

因此如何使用一个分离模型保证在不同说话人数量情况下都能保持较稳定性能是一个比较挑战的问题。目前在尝试的方法有多说话人活动检测以及说话人识别等,还可设计不同的训练目标以匹配不同的说话人个数。长时间语音分离。如何保证在1-10min甚至1h的语音能够一致保证分离的稳定性?目前已有LibriCSS数据集面向此应用场景

  1. 单通道与多通道语音分离的各自应用场景有什么不同,多通道有什么具体优势吗?

对于应用场景,主要是设备上的区分,有些设备只有一个麦克风因此就只能做单通道语音分离。多通道由于有多路麦克风数据因此可以获得更多的信息,输入的信息越多我们能提取的信息也就越多,比如多通道中IPD等信息是可以直接帮助性能提升的。
另外从传统上,多通道可以实现beamforming,它的泛化能力和鲁棒性非常强,因此相比于单通道有比较大的优势。

  1. 多通道的评估指标该怎么计算,因为源文件和混合音频文件有多个通道,分离结果该怎样像单通道一样进行比对呢?

由于多通道大部分还是用于语音识别,所以可以使用语音识别的指标词错误率(Word Error Rate, WER)进行对比;另外还可以从主观听觉上进行比较,使用平均主观意见分(Mean Opinion Score, MOS)。

端到端则相对更容易一点,可以直接计算网络的输出和目标声源之间的指标,包括频域指标和时域指标。整体上来讲,目前对于可以广泛应用到端到端和非端到端的指标仍需研究。

  1. 目前的语音分离还有哪些不足还需完善才能落地商用,现在有online(实时的)语音分离的研究吗?

目前智能家居、耳机和麦克风等都用到了很多分离降噪的研究。Online主要取决于模型设计,目前,可以在实时性和性能上进行研究。

  1. 这些方法可以用来单通道语音降噪吗,如果可以的话实时性上和rnnoise算法相比怎么样,模型大小和速度和效果上如何?

分离模型都可以用来做降噪,模型的大小和速度上需要进行权衡,和rnnoise进行对比的话还需要确定模型的参数大小,单看模型的话是无法分析这件事的。

  1. Audio-Visual Speech Separation的研究进展如何?围栏研究热点集中在哪?

我们举一个Audio-Visual研究的例子,我们对于Audio和Visual各有一个处理模块,之后会有一个将Audio和Visual处理结果融合起来的模块,然后再去做一个分离,这是Audio-Visual整体的框架。未来的研究方向主要是前文提到的一些挑战。

  1. 基于深度学习的降噪,什么样的代价函数效果最好?

这个问题分两个方面,首先看你的任务目标是什么,如果目标任务是识别的话,si-snr和具体词错误率不一定是线性的,所以我们不能说某个loss在任务上绝对比另一个更好,但如果我们评价指标和训练指标相同,那我们使用评价指标作为loss肯定是最好的。irm对相位没有建模,因此irm在某些情况下不是很好,但是对于Perceptual evaluation of speech quality(PESQ)指标表现较好,可以减少语音的失真。

  1. 近期的研究大多偏向时域分离,那时域分离效果为什么优于频域效果呢?以后的发展方向

主要是相位信息的建模、频域oracle mask的性能上限另外是使用的特征上来回优化出一个较好的特征。以后的发展方向是其他各种模型的一些设计,多模态、多通道以及其他前文提到的挑战。

  1. Source separation和speaker-diarization在技术实现上有什么联系吗,我在做speaker-diarization任务,能借鉴source separation的什么思路?

传统的speaker-diarization一个假设是说话人之间独立无重叠。但如果我们说话人之间有重叠,那么不可避免的会用到分离,今年开始的做端到端的speaker-diarization的工作,speaker-diarization可以当作是一个粗粒度的source separation,因此很多source separation的框架都可以用到speaker-diarization中。这是一个比较重要的task。

  1. 当输入音频存在混响时,对于Si-SNR loss是否需要修正?

是需要修正的,对于输入音频存在混响的情况如何修正目前没有特别好的方法。有很多工作都在关注修改Si-SNR loss使其更好的反应分离的性能,并让其包含有用的信息。

  1. 单通道语音分离由于没有IPD/ISD等空间信息,智能做谱分析,那么说话人的声纹特征是否是重要的分离依据?训练集中不同说话人样本太少是否是跨数据集表现答复下降的主要原因?如果把speaker-diarization任务中的一些pre-train模块放到分离网络前辅助encode是否会有提升?

近期的一些模型,会在分离的时候直接加一个说话人识别的损失函数。或者是将说话人信息当作输入提供给网络,但是对于它是否是主要的分离依据,还需要更多的实验进行对比。

对于最后一个问题把diarization中pre-train的模块放到分离网络前辅助encode是一定会有提升的。speaker-diarization和source separation是互帮互助的关系。但是对于end2end模型由于处在较为早期的研究状态,具体的性能提升结果还需要更多研究。

  1. 干扰人声,混响和噪声,远场能不能一起处理?不同重叠率的泛化能力怎么提升?

直观讲可以,端到端的话可以将这些进行融合,但是一般这么做的效果并不会很好。这里包括三个问题——分离、降噪、去混响。一般来说端到端的程度越高泛化能力越差因此泛化能力也是一个比较大的问题。不同重叠率的泛化能力提升最简单的是通过不同比例的不同重叠率的数据,也可以加入speaker count(说话人数量检测),某些部分只有一个说话人,可以在这个部分不做分离,做一个动态的处理。

语音特征<音频特征>

语音信号是非平稳随机信号,不过具有一定的短时平稳性,因此适合采用stft分析。分帧后顺序进行特征提取,通过重叠分帧处理。
一般而言处理顺序是:分帧-加窗<加窗是因为语音信号没有强周期性,衔接处不连续,频谱泄露,加窗缓解>-stft得到语谱图
过去其实常用的是抽象度低的特征,比如幅度谱啦,基音啦,然后识别常用mfcc什么的。但是对于分离还是优先采用信息多的,不然损失很难重建。
然后是听觉gammatone滤波器代替fft提取特征,属于模拟人耳听觉特性的带通滤波器组,虽然有论文表示替代时域卷积后得到的结果更符合人的感知,但是感觉后面用的不多。

过零率

在这里插入图片描述
中心化处理即高通/低通滤掉直流
判断过零率的程序:

for(int i=0;i<frame_length;i++)//分帧统计过零率
{
   if(w(i)*w(i-1)<0) zeros_num++;//如果前后异号即过零
}

注意增益增加一般会先判断是否过零点,不然在峰值增益改变会产生比较明显的不连续。

短时能量

在这里插入图片描述

for(int i=0;i<frame_length;i++)//每帧能量
{   
   energy+=signal(i)*signal(i);
}
短时自相关

在这里插入图片描述

void xcorr_test(int *A,int A_length,int *B,int B_length,int *C)
{
     int i,j;
     int* result=C;
     for(i=0;i<A_length+B_length-1;i++)
     {
     	C[i]=0;
     	for(j=0;j<A_length;j++)
     	{
     	   if(j-i>=0&&j-i<B_length)
           { 
               result[i]+=A[i]*B[j-i] };
     	   }
     }
}
//调用的时候如果是卷积传进来的信号B就是原信号,如果是求相关,就在调用前先把信号翻转

在这里插入图片描述
注意,虽然公式相似,但是其实卷积和相关物理意义不同,并无联系

短时平均幅度差

在这里插入图片描述
这个反正就来统计
不过以上都是时域特性,其实还是得看时频域

在这里插入图片描述
在这里插入图片描述
加窗阶段后相邻两帧在端点处变化较大,需要平滑,比如进行插值处理,其实帧移的操作就是插值

语谱图

反正也就是fft,至于手写一个fft<后补,先用matlab现成的吧>
在这里插入图片描述
在这里插入图片描述

短时功率谱密度

在这里插入图片描述
在这里插入图片描述可以看出:功率谱密度与相关函数对应,而相关函数是统计信息,按前文提到的,它是建立在信号平稳的假设之上。如果信号不够平稳,周期图法的思路显然是不适用的,Welch就是对这一问题的改进。
在这里插入图片描述
对于短时功率谱密度:
周期图法针对的是平稳信号,而Welch虽然考虑了非平稳的特性,但分段的数量通常较小,每一段的长度较大,对音频信号而言,这也是不够的。音频信号对每一帧利用周期图法分析,这个就是短时功率谱密度的思路。通常为了防止一帧的信号不够平稳,每一帧也可以进一步利用Welch方法处理。
——代码c后补吧

——后面还有几个特征,直接看原blog吧,对应C程序和其余内容后补

语音质量评价

对于分离来说,质量评价常用主客观打分。主观就是mos分了,这个得广泛试听采集,实际研究的时候常用的还是客观指标。
客观指标对比的一般是纯净信号,所以得先有个可以比较的东西,也常用来作为训练目标。典型的客观指标有
STOI,表示短时可懂度,主要对比纯净语音和分离后的语音之间的短时间内语音包络的相似程度,取值为[0,1],值越接近1,表示质量越好。
SDR
语音失真度,是近年来常用的语音领域的客观评测指标,衡量的是分离后信号的失真程度。
在这里插入图片描述

假设信号是如下形式表示,源s*矩阵A+噪声=接收到的信号x在这里插入图片描述
那么可以把x分解成下面几个成分
在这里插入图片描述
然后这几个的计算公式分别为
在这里插入图片描述
SDR代表信号失真大小,SIR代表抑制信号干扰能力,SAR代表对于引入噪声的抑制程度
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以直接根据定义做,源码还挺麻烦的-不过这程序<后补>
然后分帧加窗做,做出来分别有取平均和直接取中位数的方式。
注意,先log再中位数≠先中位数再log,同理于平均
GitHub上的开源分离评价工具包是先log再中位数的。
总之三个指标值越大质量越好。然后也可以作为分离的目标,但是受到幅度影响大。此外注意小信号影响贼大,需要排除掉,也有可能两个信号并不相关算出来的指标还很高。都有可能,所以吧,属于是参考性指标。信号质量好这些指标好,信号质量差,这些指标不一定差。
文献来自:

Vincent E, Gribonval R, Févotte C. Performance measurement in blind audio source separation[J]. IEEE transactions on audio, speech, and language processing, 2006, 14(4): 1462-1469.

然后还有SI-SNR(SI-SDR),尺度不变的信噪比:
计算的时候就可以把除了目标信号的之外的都当成噪声,starget和上面的计算方法一致。
SI-SDR
在这里插入图片描述

常用数据集

语音方面一般就是librispeech了,还有wsj0啥子的不过这个要付费,难搞
有别人混合好的librimix
当然也可以自己混合,如何混合也可以发论文了,有论文表明语音分离中用于训练网络的语音之间的overlap程度还会影响最后的结果的
然后当然每个部分单拎出来都可以,pit最简单的版本就是暴力全排列,但是有简化版本/一句话级别的upit
然后还有训练的数据的采样率,长度,数据量,是否加噪,优化方法,每个批次输入信号的数据量,学习率啥的——<后补>
编码器的卷积核大小,步长,对于unet还有下采样深度(即几次下采样),卷积核个数啥的影响——卷积核小一般训练慢,输入信息更多;步长一般去核的一半;然后下采样次数多,损失大×,次数少,感受野浅×;卷积核数量增加,即输入的特征维度增加,但是无用信息也会变多。

音乐分离

音乐分离与语音分离的不同之处在于不存在置换问题,因为……不同乐器的差别太大了。ABCDt通道就是会顺序输出几种不同的乐器,但由于音乐采样率普遍高于语音,因此会存在建模长序列及不同频带信息捕捉的问题。
Music separation采用progressive learning方法,从低至高分采样率处理,并通过元学习(meta-learning)的方法,对不同声源类型进行网络参数调整。
在这里插入图片描述
如果跳出音频,多模态信息亦可辅助语音分离。例如视频会议场景下,我们可以通过视频信息检测说话人特征,并分离该说话人语音。Audio-visual separation通过图像分析网络对嘴唇运动特征提取,送入TasNet模块,从而辅助音频分离任务。
在这里插入图片描述

语音分离的最终目标为Universal separation,即广义语音分离。Universal sound separation通过声学事件检测,提取声学事件特征,从而辅助广义声源分离。

------<不同损失函数-后补>
——<常见网络结构-后补>
——<不同的归一化方式-后补>
——<不同的注意力机制-后补>
深度学习是大坑啊

程序借鉴的blog:https://www.cnblogs.com/xingshansi/p/6815217.html
相关卷积的解释:https://blog.csdn.net/jin930404/article/details/109024092
关于研究:https://baijiahao.baidu.com/s?id=1675349089525645592&wfr=spider&for=pc

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值