4.1 语音分离 Speech Separation

点击查看【bilibili】

鸡尾酒会效应:人可以无视嘈杂的环境,专注于你想听的那个人的声音资讯

语音分离 Speech Separation:让机器像人一样,能把它想听的声音资讯从嘈杂的环境中抽取出来

语音分离分为两类: 4 语音分离Speech Separation - 图1本节课专注于语者分离 Speaker Separation

4.1.1 语者分离 Speaker Separation

语者分离 Speaker Separation:即将一段混合了多个语者(以及环境音)的语音分离成各个语者的声音

  • 语者分离的输入和输出长度相同,因此不需要用 Seq2Seq 模型(杀鸡焉用牛刀)

image.png
本节课的关注点(设定):

  • 假设只包含两个语者(可以轻松拓展到多个语者)
  • 假设只有单一麦克风,即只输入一段声音讯号
  • 假设是语者独立的 Speaker independent:即训练和测试是完全不同的语者

训练数据:成对的训练数据

  • 很容易收集到单一语者的声音讯号,再两两结合,即可得到成对的训练资料

image.png

4.1.1.1 评估方法

设模型分离出的的语者 A 的语音为 4 语音分离Speech Separation - 图4,对应的真实的语者 A 的语音(ground truth)为 4 语音分离Speech Separation - 图5 ,则模型的训练目标是让 4 语音分离Speech Separation - 图64 语音分离Speech Separation - 图7 越接近越好

几种评估指标:

  • SNR (Signal-to-noise ratio):4 语音分离Speech Separation - 图8
    • SNR 的值越大,说明模型效果越好
    • 并不适用于语者分离,存在两个问题:
      • 4 语音分离Speech Separation - 图94 语音分离Speech Separation - 图10 实际上听起来很像,说明模型效果好,但如果 4 语音分离Speech Separation - 图11 声音较小,E 就会较大,使得 SNR 的值较小
      • ② 如果模型的输出 4 语音分离Speech Separation - 图12 质量很差,但直接把它的音量变大,E 就会变小,SNR 的值就会变大,尽管模型能力并没有得到改善

image.png

  • SI-SDR / SI-SNR (Scale invariant signal-to-distortion ratio):4 语音分离Speech Separation - 图14
    • 是现在文献上常用的评估语者分离好坏的标准
    • 4 语音分离Speech Separation - 图154 语音分离Speech Separation - 图16 越平行,则 SI-SDR 的值越大,说明模型效果越好

image.png

  • SI-SDR improvement:是文献上常见的一种使用 SI-SDR 的方式
    • 计算混合语音与真实的单个语者语音(ground truth)的 SI-SDR,再计算模型分离出来的语音和 ground truth 的 SI-SDR,两者的差值代表了经过语者分离后 SI-SDR 值的提升
    • 通常是正的,因为分离后一般肯定 SI-SDR 有提升,即与 ground-truth(单个语者的真实语音)更像

image.png

  • PSEQ:评估语音质量
  • STOI:计算可理解程度

4.1.1.2 排列问题 Permutation Issue

  • 为了实现语者分离的训练,训练资料中包含了很多语者,那么对于每对训练资料,在评估模型输出的时候,ground truth 的两个语者的语音如何排列?
  • 如果每对训练资料中包含两个语者的语音,那么就有两种摆放 ground truth 的方式,但不知道哪一种是对的。
  • 因此,早期的时候,无法使用 deep learning 解决语者独立的语者分离问题,只能解语者不独立的语者分离问题。

image.png

两种解决办法: 4 语音分离Speech Separation - 图20

4.2 深度聚类 Deep Clustering

深度聚类 Deep Clustering:16年,是最早用深度学习解决语者独立的语者分离问题的模型

  • 想法:语音转换 VC》) 是输入一段声音讯号,输出一段很不一样的声音讯号;但语者分离的输入和输出其实很像,输出只是输入减去一些东西,因此不需要一个 general model 来做语者分离
  • 深度聚类就是不直接产生新的声音讯号,而是产生 Mask:
    • 设计一个 Mask Generation 网络,输入混合的语音讯号 X,输出两个 Mask:M1、M2
      • Mask 矩阵的大小和输入相同
      • Mask 矩阵的值可以是二元的也可以是连续的
    • 两个 Mask 矩阵 M1、M2 分别与 X1、X2点乘(element-wise product),得到两段语者分离的声音讯号 X1、X2

image.png

4.2.1 IBM (Idea Binary Mask)

  • 训练数据是有 ground truth 的,也就是两个语者单独的语音讯号,将这两个声音讯号分别转换成两个矩阵(蓝矩阵 & 红矩阵)
  • 比较这两个矩阵每一格谁的值大,来得到 Mask 矩阵(Mask 矩阵的大小和输入、输出相同)
    • 如果某一格蓝矩阵的值大于红矩阵的值,那么蓝色语者的 Mask 矩阵该格就填 1,红色语者的 Mask 矩阵该格就填 0;反之亦然
    • 将两个 Mask 矩阵与输入矩阵点乘,分别得到两个输出矩阵,就是两个语者分离后的语音讯号

image.png

  • 训练:上面提到的 Mask 称为 Idea Binary Mask,即理想二元 Mask,这在训练时是能得到的,因为有 ground truth,就可以让模型产生的 Mask 去逼近 ground truth 得到的 Mask,据得到了理想的 Mask
  • 测试/推理:但在测试阶段没有 ground truth,就出现了一个问题:没法得到 Idea Binary Mask

  • 问题

4.2.2 深度聚类的运作方式

深度聚类的工作流程(框架)如下:

  • Embedding Generation:是深度聚类中唯一能训练的网络结构
    • 输入一段混合的声音讯号:是一个长为 T,高为 D 的矩阵
    • 输出长为 T,高为 D,深为 A 的立方体,即把输入矩阵的每个格子都扩展成一个向量
  • K-means Clustering:一般是固定的,没法 train(后来的研究也可以 train)。将向量分成 K 群
    • Embedding Generation 的输出相当于 T×D 个向量,输入给 K-means Clustering
    • 输出将这 T×D 个向量分为了 K 群,这里 K=2,即两个语者
  • 根据分群结果产生 Binary Mask
  • 将 Mask 分别与输入矩阵点乘,就分离出了不同语者的声音讯号

image.png

4.2.3 深度聚类的训练

真正需要训练的只有 Embedding Generation,其学习目标为:

  • ① 对于输入矩阵中代表不同语者的格子,希望它们经过 Embedding Generation 扩张成的向量的距离越大越好
    • 这样代表不同语者的向量经过 K-means Clustering 后才会被分到不同的 clusters,最终 Mask 矩阵中这两个格子的值才会不同
  • ② 对于输入矩阵中代表相同语者的格子,希望它们经过 Embedding Generation 扩张成的向量的距离越小越好
    • 这样代表不同语者的向量经过 K-means Clustering 后才会被分到相同的 clusters,最终 Mask 矩阵中这两个格子的值才会相同

image.png

训练效果:实验结果表明训练是有效的。而且神奇的是,训练时做的是两个语者的语者分离,但在测试时,将 K-means Clustering 的 K 值改为 3,就能做 3 个语者的分离了

缺点不是 End-to-End 的

4.3 置换不变训练 PIT (Permutation Invariant Training)

PIT:真正有办法实现 End-to-End 训练的方法

  • 想法:假设已经有一个语者分离的模型,参数为 4 语音分离Speech Separation - 图25。这样我们就知道怎样安排 ground truth 的排列:以两个语者有两种排列情况为例,两种排列都算一下 loss,看看哪个的 loss 比较小,就代表哪个排列更合适
  • 但是,我们需要先知道怎么排列,才能训练出一个语者分离的模型
    • 陷入了“鸡生蛋、蛋生鸡”的问题

image.png

PIT 的做法(解决上述问题):

  • ① 初始,随机安排 ground trurh 的排列,基于此训练语者分离网络,更新模型参数
  • ② 用训练好的模型重新决定标签的排列,基于此重新训练语者分离网络,更新模型参数
  • ③ 循环迭代第 ② 步,直到收敛

训练效果:前期排列不稳定,但最终会收敛,即模型是 work 的
image.png

4.4 TasNet (Time-domain Audio Separation Network)

点击查看【bilibili】
TasNet:一个端到端的语者分离模型,19年提出

  • 输入输出:输入和输出直接是声音讯号的 sample(采样),直接是原始的 waveform(声波),没有抽 acoustic feature
    • 输入:是一串非常长的数值,也可以仍当作向量序列,即每个向量的维度为 1
    • 输出:同输入,不过 K 个语者就输出 K 个序列
  • 包含几个模块:
    • Encoder:输入 Mixed audio,输出 Feature map 矩阵
    • Separator:输入 Feature map 矩阵,输出 2 个 Mask
    • Decoder:输入:两个 Mask 和 Feature map 分别做点乘;输出:语者分离的语音
  • 训练时需要用到 PIT

image.png
image.png

4.4.1 Encoder & Decoder

  • Encoder:是一个 linear transform,即一个 16×512 的矩阵
  • Decoder:是一个 linear transform,即一个 512×16的矩阵
  • Encoder 和 Decoder 不需要绑定成互为 inverse,实验表明 inverse 效果反而不好
  • Encoder输出的 512 维的向量不需要都为正值

image.png

将 Encoder 的权重参数可视化:
image.png

4.4.2 Separator

一个简化的 Separator 的示例:

  • 输入:encoder 的输出
  • 输出:两个 mask
    • 实验验证,两个 mask 的同一位置不需要和为 1

image.png

实际的 separator 要深得多,CNN 的 d 从 1、2、4、8 一直到 128,再从头开始循环,反复多次(一般重复 3-4 次,次数是一个超参数)

image.png

之所以用的 CNN,而不是 LSTM,是因为 LSTM 有点敏感,就一定要从句子开头读起,否则就崩掉,不稳定,波动大

4.5 More

  • 语者数量未知:实际上一段混合语音中语者数量是不固定的,未知的
    • 参考论文:Recursive speech separation for unknown number of speakers
    • 方法:每次只分离一个人的声音讯号(网络自己决定抽哪个人的声音讯号),迭代
    • 问题:不知道有几个语者,不知道走到什么时候停下来?
    • 答:走到剩余部分只剩下杂讯,没有人的声音就可以停下来

image.png

image.png

  • 面向任务的优化:针对不同的任务、以及是给机器听还是给人听,可以制定不同的训练目标

image.png

image.png