课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1

参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html

备注:图片均来自于课件。

这次回顾P12至P13,这部分介绍了语音分离问题。

语音分离(Speech Separation)

例子:

鸡尾酒效应

鸡尾酒效应是指,在嘈杂的环境中,人类可以专注于单个语者发出的声音,语音分离的目标是让机器做到这点。

具体来说,语者分离问题可以分为两类:

  • 语音增强:语音,非语音分离(降噪)。
  • 语者分离:多人说话的场景。

这部分主要介绍语者分离。

语者分离

这部分只讨论特殊语者分离问题:

  • 假设输入和输出的长度相同。
  • 专注于两位语者。
  • 专注于单个麦克风。
  • 语者独立:训练和测试的语者完全不同。

图示:

数据收集

这部分成对的数据很容易收集,只要将两个语者的声音叠加即可:

评估方法

这部分介绍语者分离问题的评估方法,这里假设

  • 假设模型的输出为为$ X^{\star}$。
  • 正确答案为$\hat X$。

信噪比(SNR)

定义残差:

SNR定义为:

总体来说,我们希望$|E |$越小越好,所以$SNR$越大,模型的输出也好。

SNR有两个问题:

  • 如果$ X^{\star}$和$\hat X$平行,但是$ X^{\star}$强度较低,$|E |$会很大,$SNR$会很小;然而实际上$ X^{\star}$的效果是很好的。
  • 如果$ X^{\star}$和$\hat X$夹脚为锐角,那么只要简单增加$ X^{\star}$的强度,就会增加$SNR$,但实际上$ X^{\star}$的效果并没有变好。

图示:

Scale invariant signal-to-distortion ratio (SI-SDR)

为了改进之前的问题,提出了SI-SDR:

其中$X_T$是$X^{\star}$在$\hat X$上的投影,$X_E$是残差,和$SNR$一样,该指标越大,说明$X^{\star}$效果越好:

之前两个问题的解决:

  • 如果此时$ X^{\star}$和$\hat X$平行,那么$X_E=0$,${SISDR}=\infty$。

  • 输出长度大小不会改变该指标:

其他

其余的评估度量还有

  • PESQ
  • STOI

这部分从略。

语者分离问题的评估

计算分离前后,对同一个向量的$SI-SDR$之差:

问题

之前介绍的度量是可微分的,所以问题似乎解决了,但是有如下的问题:

我们并不知道$(X_1,X_2)$对应的是(男性,女性)还是(女性,男性),之所以无法事先指定顺序,是因为训练和测试的语者完全不同。

具体来说,假设我们有$k$个输出$a_1,\ldots, a_k$,我们有$k$类语者$s_1,\ldots,s_k$,现在的问题是没有确定的排列$p_i$,使得$a_{i}$对应$s_{p_i}$。

解决方法

为了解决之前的问题,有如下几种方法。

Masking

输入输出都可以理解为矩阵,所以问题描述如下:

注意到语者分离的特点是,输出和输入非常接近,所以有人提出生成两个Mask,然后直接和输入相乘即可:

这里的Mask可以是连续或者二进制的,基于该思路有多种方法。

IBM(Ideal Binary Mask)

首先将音频表示为频谱,假设两个语者对应的矩阵为$X_{1},X_2$,那么构造矩阵:

利用$X\odot M_i $近似$X_i$。

现在有了Mask标签,所以训练一个模型近似该标签即可:

该方法似乎没有解决之前的问题,但是现在输出的关系是相互依赖的。

Deep Clustering

首先从图示来理解:

具体来说:

  • $D\times T$的输入转换成$D\times T \times A$。
  • 对$D\times T$个向量做K-means。(这里$k=2$)
  • 然后由此产生Mask。

那么该方法如何训练呢(注意到标准的Mask是已知的),具体想法如下:

  • 训练Embedding Generation:
    • 不同语者的网格距离很远。
    • 同一语者的网格彼此靠近。

该方法的神奇之处在于,在训练时使用两个语者($k=2$),但测试时可以使用三个语者($k=3$)。

该方法的缺点是并不是端到端的,但实际效果很好。

PIT(Permutation Invariant Training)

之前的问题是没有确定的排列,那么现在从这点解决。

思路:

给定语者分离模型$\theta^i$,我们可以确定排列——选择Loss最小的排列;但是这样的问题是我们需要确定排列才能训练,而这事先是不知道的。

解决方法:

  • 随机初始化排列。
  • 训练网络。
  • 决定排列。
  • 返回步骤一。

注意到训练开始是非常不稳定的:

一般训练分为两个阶段:

  • 第一阶段训练一个基础模型。
  • 根据第一阶段的模型决定排列,然后重新训练模型。

TasNet(TasNet – Time-domain Audio Separation Network)

网络架构:

注意输入输出是音频,并不是声学特征。

Encoder和Decoder部分:

  • Encoder:线性变换,将16维的输入变成512维的输出。(作用类似傅立叶变换)
  • Decoder:线性变换,将512维的输入变成16维的输出。(作用类似傅立叶逆变换)

Separator:

多层一维卷积,最后一层作用sigmoid,然后生成两个Mask:

细节架构:

这样做的原因是,重复多次CNN可以看到更长的信息,例如重复3次,模型可以考虑1.53秒的信息。

此外模型中还使用了Depthwise Separable Convolution的技术,以此减少参数数量,链接如下:

https://www.bilibili.com/video/BV1yy4y1B7ny?p=5

一些实验结果

人们也将模型中卷积部分替换为RNN,效果对比(不难看出CNN的效果比RNN好):

横轴为起始位置。

完整的结果:

其他问题

语者数量未知

假设我们并不知道语者的数量,那么该如何解决呢?一个思路是每次分离一个语者:

该方法需要判断何时只剩下一个语者。

多麦克风

端到端训练:

基于任务的优化

根据不同的任务选择不同的度量,这部分只是一笔带过。

补充文献

  • Denoise Wavnet [Rethage, et al., ICASSP’18]
  • Chimera++ [Wang, et al., ICASSP’18]
  • Phase Reconstruction Model [Wang, et al., ICASSP’19]
  • Deep Complex U-Net: Complex masking [Choi, et al., ICLR’19]
  • Deep CASA: Make CASA great again! [Liu, et al., TASLP’19]
  • Wavesplit: state-of-the-art on benchmark corpus WSJ0-2mix [Zeghidour, et al., arXiv’20]