Speech Separation
- 鸡尾酒会效应: Humans can focus on the voice produced by a single speaker in a crowded and noisy environments.

Speech Separation
- Speech Enhancement: speech-nonspeech separation (de-noising) (将人说话的声音从噪声中分离)
 - Speaker Separation: multi-speaker talking (将多个人说话的音频分离开来)

Speaker Separation

下面的讨论主要关注 Two speakers、Single microphone,并且数据集保证 Speaker independent (training and testing speakers are completely different)
- Input and output have the same length. Seq2seq is not needed
Training Data
- Training Data: It is easy to generate training data.

Evaluation
Signal-to-noise ratio (SNR)

S
N
R
=
10
log
?
10
∥
X
^
∥
2
∥
E
∥
2
S N R=10 \log _{10} \frac{\|\hat{X}\|^{2}}{\|E\|^{2}}
SNR=10log10?∥E∥2∥X^∥2?
X
X
X is speech signal (vector) here
- 可见,
∣
∣
E
∣
∣
||E||
∣∣E∣∣ 越小,SNR 越大
缺陷
- Case 1:
X
?
X^*
X? 和
X
^
\hat X
X^ 其实声音完全相同,只是声音大小不同,但
E
E
E 却很大
 - Case 2: Simply larger the output can increase SNR

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

SISDR
?
=
10
log
?
10
∥
X
T
∥
2
∥
X
E
∥
2
\operatorname{SISDR}=10 \log _{10} \frac{\left\|X_{T}\right\|^{2}}{\left\|X_{E}\right\|^{2}}
SISDR=10log10?∥XE?∥2∥XT?∥2?
- 可见,
X
?
X^*
X? 与
X
^
\hat X
X^ 越平行,SISDR 越大
SI-SDR 解决了之前提到的 SNR 的两个缺陷
- (1)
SISDR
=
10
log
?
10
∥
X
T
∥
2
∥
X
E
∥
2
=
+
∞
\text{SISDR}=10 \log _{10} \frac{\left\|X_{T}\right\|^{2}}{\left\|X_{E}\right\|^{2}}=+\infty
SISDR=10log10?∥XE?∥2∥XT?∥2?=+∞
 - (2)
SISDR
=
10
log
?
10
∥
X
T
∥
2
∥
X
E
∥
2
=
10
log
?
10
∥
k
X
T
∥
2
∥
k
X
E
∥
2
\text{SISDR}=10 \log _{10} \frac{\left\|X_{T}\right\|^{2}}{\left\|X_{E}\right\|^{2}}=10 \log _{10} \frac{\left\|kX_{T}\right\|^{2}}{\left\|kX_{E}\right\|^{2}}
SISDR=10log10?∥XE?∥2∥XT?∥2?=10log10?∥kXE?∥2∥kXT?∥2? (the same) 
SI-SDR improvement

- 分别对 Mixed audio 和模型分离出的声音信号计算 SI-SDR,再计算它们的差值
SI-SDR?improvement
:
SI-SDR
i
=
SI-SDR
2
?
SI-SDR
1
\text{SI-SDR improvement}: \text{SI-SDR}_i = \text{SI-SDR}_2 - \text{SI-SDR}_1
SI-SDR?improvement:SI-SDRi?=SI-SDR2??SI-SDR1?
More…
- Perceptual Evaluation of Speech Quality (PESQ) was designed to evaluate the quality, and the score ranges from -0.5 to 4.5.
- Short-Time Objective Intelligibility (STOI) was designed to compute intelligibility (声音的可理解程度), and the score ranges from 0 to 1.
Permutation Issue
- 有了训练数据和评估方法,看起来我们可以直接训练一个模型,只需要最小化生成向量与 Ground-truth 的 L1 / L2 误差或者最大化 SI-SDR 即可
 - 但事情并没有那么简单,混合音频包含两段音频,我们模型的第一个分支应该输出红色音频还是蓝色音频呢?也就是按怎样的顺序摆放正确答案呢 (Permutation Issue)?
如果数据集里只有红色和蓝色这两种音频,那么我们只需要固定一种就好,但问题是数据集里有很多不同的 speaker,如果我们仍然对每两个 speaker 固定一个输出顺序,模型训练就可能产生问题,例如下图中,我们规定模型第一个分支输出红色和黄色音频,第二个分支输出蓝色和绿色音频,但蓝色、绿色音频对应的性别是不同的,红色、黄色音频对应的性别也是不同的,在训练时模型就会被要求在输入一段混合男女声时有时在第一分支输出男声 (黄绿),有时在第一分支输出女声 (红蓝),这可能会给模型训练带来问题,我们更想要第一个分支固定输出男声,第二个分支固定生成女声,因此想到先对音频按性别进行分类 而有的男声可能会比较高亢,有的女声可能会比较低沉,此时我们又想按音调进行分类。但其实分类标准有很多,例如性别、声调、声音大小,怎么才能正确选择分类标准呢?一个好的方法是 Deep Clustering,它使得 Deep learning 可以被用于 Speaker independent 的情况
Deep Clustering
Masking
- Speeker Separation 其实就是由一个矩阵
X
X
X 生成另外两个矩阵
X
1
,
X
2
X_1,X_2
X1?,X2?
但
X
1
,
X
2
X_1,X_2
X1?,X2? 其实与
X
X
X 是很相似的,因此可以简化一下模型的结构,只训练一个 Mask Generator,生成两个掩码矩阵分别与
X
X
X 作逐元素乘来得到
X
1
,
X
2
X_1,X_2
X1?,X2? (Mask can be binary or continuous) 
Ideal Binary Mask (IBM)

Each audio is represented by its spectrogram.
- Ideal Binary Mask (IBM): 将两段声音的频谱图对应矩阵中的每个元素进行比较,如果一个矩阵的某一位置的元素比另一矩阵的相同位置元素更大,mask 就为 1,反之为 0。由此可以生成两段声音信号对应的 mask matrix,mask matrix 与混合声音频谱图对应矩阵进行逐元素相乘即可还原出原有声音 (效果还不错)
- 现在我们要做的就是让模型在给定混合音频的频谱图时,生成 IBM

Deep Clustering

- Deep Clustering: 先由混合音频
D
×
T
D\times T
D×T 的频谱图生成
D
×
T
×
A
D\times T\times A
D×T×A 的 Embedding matrix (为频谱图上的每一个点都生成一个 Embedding),然后再对这些 Embedding 进行 K-means 聚类,将它们分为两类,两类 vector 对应的位置就可以形成两个 Binary Mask
Deep Clustering – Training


- 在训练时,只需要根据真正的 IBM,使得 Embedding Generation 生成的向量满足 IBM 中不同元素对应的 Embedding 尽量远离,相同元素对应的 Embedding 相互靠近即可。这样之后的 K-means 聚类就能生成正确的 IBM
 - 值得注意的是:It is possible to train with two speakers, but test on three speakers (
K
=
3
K=3
K=3 during
k
k
k-means)! 这说明 Embedding Generation 成功捕捉到了声音信号频谱图的特征
- 虽然 Deep clustering 效果不错,但它还有一个缺憾:训练过程并不是 end-to-end 的
Permutation Invariant Training (PIT)
- Given a speaker separation model
θ
i
\theta^i
θi, we can determine the permutation (choose the permutation with smaller loss)
 - But we need permutation to train speaker separation model … 这似乎就成了一个鸡生蛋、蛋生鸡的问题
PIT
- PIT 用一个 loop 来解决上述问题,先随机初始化模型参数,然后根据这个随机初始化的参数对 label 的顺序进行排序,然后用这个顺序来训练模型。然后再用新的模型重新进行 label 排序,依次循环往复…

Results
TasNet – Time-domain Audio Separation Network
TasNet
- TasNet 特别的地方在于它是直接在时域中进行的,也就是输入、输出直接就是声音信号 (a 16-
d
d
d vector (2ms 的声音信号))。输入的时域信号首先通过 Encoder 变成一个 Feature map,这个 Encoder 的作用和傅里叶变换类似,但它是直接由模型学出来的。Separator 根据 Feature map 产生两个 Mask,Mask 与 Feature map 作逐元素相乘后再送入 Decoder 就得到了分离的时域声音信号,这里的 Decoder 就类似逆傅里叶变换

如果数据集是 Speaker independent 的,那么训练时就需要用到 PIT
Encoder and Decoder
- Encoder 和 Decoder 其实就是两个线性层,分别将 16 维的声音信号 vector 转成 512 维的 feature vector,再将 feature vector 重新转回声音信号

Separator
- Separator 的输入为 Encoder 的输出,也就是很多个 512-
d
d
d 的向量,每个向量都对应着 2ms 的声音信号。Separator 由若干层的 1-D conv 组成。每一个 1-D conv 层都由上一层输出的两个相邻 vector 得到一个新的 vector。如下图所示,经过若干 conv 层之后再加上 transform + sigmoid (sigmoid 保证 mask 的值在 0 ~ 1 之间,比较符合直觉),就能得到两个 mask,这两个 mask 分别与 Encoder 的输出相乘,结果输入 Decoder 后就能得到分离出的时域声音信号
 - 实际的 Separator 结构更加复杂一些,它的一个基础模块一直叠加到了
d
=
128
d=128
d=128,也就是输出的 mask vector 看到了 128 个输入声音向量
Separator 叠加了多个这样的基础模块,当叠加 3 个时,模型输出的 mask 考虑了 1.53s 的输入声音信号 
这里看视频没有看的特别明白,有时间再看看 paper 吧
Depthwise Separable Convolution
- TasNet 还使用了 Depthwise Separable Convolution 来轻量化网络 (Ref: youtube)
SepFormer - Attention is All You Need in Speech Separation
More …
Unknown number of speakers
- idea: recursively separating a speaker

Multiple Microphones

Visual Information
 
Task-oriented Optimization
Who would listen to the results of speech enhancement or speaker separation?

paper
- [Fu, et al., ICML’19] MetricGAN: Generative Adversarial Networks based Black-box Metric Scores Optimization for Speech Enhancement, ICML, 2019
- [Shon, et al., INTERSPEECH’19] VoiceID Loss: Speech Enhancement for Speaker Verification, INTERSPEECH, 2019
To learn more ……
References
|