Chapter3-1_Speech Separation(Deep Clustering, PIT)

文章目录

  • 1 内容简述
  • 2 评价指标
    • 2.1 Signal-to-noise ratio (SNR)
    • 2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
    • 2.3 其他的评价指标
    • 3 Permutation Issue
  • 4 Deep Clustering
  • 5 PIT

本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。

下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。

文章索引:

上篇 - 2-2 CycleGAN and StarGAN

下篇 - 3-2 TasNet

总目录

1 内容简述

人在一个嘈杂的环境下听别人说话的时候,可以很神奇的抽取到说话人说话的信息,换而言之,也就是把说话人发出的声音和说话人之外的声音给分开了。而Speech Separation要做的事情,也就是把不同物体发出的声音给分开。

Speech Separation可以分为两大类:

  • Speech Enhancement
    把人的声音和其他的声音给分开来,也被称为denoising

  • Speaker Separation
    把不同人说话的声音分开来

本篇的着重点在于Speaker Separation,而且在讨论的时候,都以两个speakers单一麦克风的情况为例子。同时,要说明的是,用于训练和验证的声音数据来自于不同的speaker,也就是说,训练集是A,B,C,D说的,验证集是E,F说的,这样子。
ch3-1-1
Speaker Separation有一个特点,就是它的输入和输出的长度必然是一致的,所以可以不使用seq2seq的模型来解,用seq2seq的模型有一种杀鸡用牛刀的感觉。

Speaker Separation有一个好处就是,数据集很容易构造,我们只需要找一堆单个speaker的声音信号过来,然后两两合成一下,就可以了。

2 评价指标

2.1 Signal-to-noise ratio (SNR)

有一种评估模型输出质量的方法叫做SNR,SNR的目的是让模型的输出X∗X^*XX^\hat{X}X^越接近越好。SNR的计算公式如下所示

SNR=10log10∣∣X^∣∣2∣∣E∣∣2SNR=10 log_{10} \frac{||\hat{X}||^2}{||E||^2} SNR=10log10E2X^2

其中,X∗X^*XX^\hat{X}X^均为向量,且

E=X^−X∗E=\hat{X}-X^* E=X^X

不难看出,当EEE越大的时候,SNRSNRSNR就小,也就是SNRSNRSNR认为模型的结果越差,反之越好。
ch3-1-2
这种简单粗暴的评价方式,在面对声音的时候,会存在一个致命的问题。比如模型输出的X∗X^*XX^\hat{X}X^向量几乎是平行的,只不过X∗X^*X短了一点(音量小了一点),这个时候SNR却认为模型学的不好,这其实是不合理的,不我们只要把音量调大一点就可以了。

又比如说,模型输出的X∗X^*XX^\hat{X}X^偏差比较大,但是当X∗X^*X被调大了音量之后,这个SNRSNRSNR就认为模型变好了,这也是我们不希望看到的。

总而言之,SNRSNRSNR受音量大小的干扰太大。
ch3-1-3

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

另一种文献中常用的评价指标叫做SI-SDR,SI-SDR也被称为SI-SNR,知道这两个是同一个东西就可以了。SI-SDR的计算公式为

SISDR=10log10∣∣XT∣∣2∣∣XE∣∣2SISDR=10log_{10} \frac{||X_T||^2}{||X_E||^2} SISDR=10log10XE2XT2

其中

{XE=X∗−XTXT=X∗⋅X^∣∣X^∣∣2X^\left\{ \begin{aligned} X_E = X^* - X_T \\ X_T = \frac{X^* \cdot \hat{X}}{||\hat{X}||^2}\hat{X} \end{aligned} \right. XE=XXTXT=X^2XX^X^

这个评价指标就是在看X∗X^*XX^\hat{X}X^的平行程度,解决了SNR被音量大小干扰的问题。
ch3-1-4
而在实际使用的时候,我们看的,往往是SI-SDR的improvement。什么是improvement?比如我们要看下图中蓝色信号的improvement,那么我们就要先把输入mixed audio和蓝色信号的ground truth做一个SI-SDR得到SI-SDR1,然后再把蓝色信号对应的输出和蓝色信号的ground truth算一个SI-SDR2,再用SI-SDR2减去SI-SDR1来看这个增量。

为什么要这么做?因为有些时候,mixed audio的红色信号可能音量较低,这使得SI-SDR1本身就会比较大,SI-SDR2自然也就是大的,这个时候看增量improvement会更有意义。
ch3-1-5

2.3 其他的评价指标

除了SNR和SI-SDR之外,还有其他很多评价指标,比如用来评价输出声音质量的Perceptual evaluation of speech quality (PESQ),用来评价声音清晰度的short-time objective intelligibility (STOI)。这些评价指标都比较复杂,这里不多做介绍。

3 Permutation Issue

讲完了评价指标之后,我们就可以像正常了模型那样开始train了,我们的Loss就用L1或者L2或者SI-SDR都是可以的,SI-SDR是可以微分的。我们就输入一个mixed audio然后经过一个speaker Separation的model,出来一个X1X_1X1X2X_2X2,再算一下loss,然后反向传播,就结束了。真的就么就结束了吗?错错错

我们仔细来思考一下,输出X1X_1X1的这端和X2X_2X2的这端是连接着固定的weights的,为什么X1X_1X1一定是红色信号,X2X_2X2一定是蓝色信号。这两个不能换一下吗?加入我们又来了一个橙色信号,那这个橙色信号应该在哪个输出?仔细想一下,这样子网络是没法train起来的。这个其实就是Speech Separation中的Permutation Issue。

它不能像其他问题那样直接转变为一个可以直接train的神经网络。
ch3-1-6
那怎么办?下面来介绍一下Deep Clustering和PIT。

4 Deep Clustering

在介绍deep clustering之前,我们先来说一下其中用到的mask。由于Speech Separation只是对于输入声音信号的一个拆分,所以我们可以不生成声音信号,而是生成两个mask。这两个mask是互斥的,即M1=1−M2M_1 = 1 - M_2M1=1M2,mask中的值可以是binary的(0和1),也是可以是continuous的(0至1)。如果是binary的,X1X_1X1就是XXXM1M_1M1对应元素为1的元素的组合,即X1=M1⋅XX_1 = M_1 \cdot XX1=M1XX2X_2X2就是X−X1=M2⋅XX-X_1 = M_2 \cdot XXX1=M2X
ch3-17

这种binary的方式,显得非常简单粗暴,这样难道不会造成很多信息的丢失吗?不管你信不信,实际情况下,这种做法是work的。不过既然要把我们的训练目标变成一个mask,那在处理数据,生成label的时候,也有一些相应的操作。

如下图中,我们有蓝色的声音和红色的声音,然后合成了左上角红蓝结合的声音。蓝色和红色的矩阵表示声音信号转换之后得到的spectrogram,红蓝矩阵的shape是一样的,矩阵中每个元素之间比个大小,蓝的大的话,蓝色mask相应为止的值就是1,反之是0。红色的也是一样。mask就是用这种方式构造出来的。

然后用这种方式得到的mask在mixed audio上去取值,得到左下角的信号,这个信号的声音,和蓝色信号的声音,人听起来,是没什么区别的。这样的mask叫做Ideal Binary Mask (IBM)。
ch3-1-8

也就是说,我们的模型只要能学到这样的两个IBM,就可以实现Speech Separation了。那么,我们的模型就变成了下图这样。

c3-1-9
但是!到现在为止,我们仍旧没有解决Permutation Issue。别急,马上给你搞定。

先来说一下Deep Clustering的Inference的过程。我们的输入是一个代表mixed audio的D×TD \times TD×T的矩阵,经过一个Embedding的网络之后,生成了一个D×T×AD \times T \times AD×T×A的矩阵,这个AAA就是embedding之后的特征维度。然后,我们会对这个输出做k-means clustering,如果有2个说话人,就把cluster的个数设置为2即可,然后每个cluster就代表一个speaker的Ideal Binary Mask。是不是很机智!完美解决Permutation Issue。
ch3-1-10
不过这个东西训练该怎么train呢?k-means clustering是额外的算法,且不可导,要做loss的话,就要在D×T×AD \times T \times AD×T×A的这个矩阵上做文章。

我们是有Ideal Binary Mask这个label的,那么,我们呢就可以让mask上值一样的feature的距离越大越好,mask值上值不同的feature越远越好,这样的loss是可以做成可导的。
ch3-1-11
神奇的是,用2个speakers的声音mix的的数据和deep clustering模型train出来的结果,针对于3个speakers的输入,也是有效的!这真的是很了不起。

5 PIT

PIT是一种训练的方法,全称为Permutation Invariant Training。这种训练方式就可以end-to-end去训练,总体思想很直觉,就是我先随便假设一个speakers对应于输出的X1X_1X1X2X_2X2的顺序,稍微train几下,得到一个model。然后,下一次train的时候,我会算两次SI-SDR之类的评价指标,分别是红1,蓝2和蓝1,红2,然后把Loss小的那个作为排序,然后按这个顺序train下去。
ch3-1-12
每train一次,这个排序都可能会发生变化,所以刚开始的时候,是非常不稳定的,但只要这样train下去,最终,是可以收敛的。感觉这个真的要靠做实验做出来。
ch3-1-13
还有就是,PIT相比于按照某种方式,假定一个顺序的训练方式是要好一点的。
ch3-1-14

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Joi验证模块的使用

1. 安装 官网中文文档:https://joi.dev/api/?v12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm install 14.3.1注意:下载14.3.1,在npm install joi的时候默认下载的是最新版本 joi17.1.1,对于一些API高版本会舍弃从而出现…

穷养富养知乎见解

真正的“穷养”,应该是不惯着,让他知道要想得到需要付出,而不是让他认为就是没有,无论如何不能得到。真正的“富养”,应该是为他提供所有成长的条件和选择的权利,而不是一味的满足他的欲望,却不…

python导入模块以及类_python—模块导入和类

1.查询模块:按目录依次查找需要导入的模块,模块目录一般在:/usr/lib64/python2.7 In [2]: sys.path Out[2]: [, /usr/bin, /usr/lib64/python2.7/site-packages/MySQL_python-1.2.5-py2.7-linux-x86_64.egg, /usr/lib64/python27.zip, /usr/l…

Chapter3-2_Speech Separation(TasNet)

文章目录1 TasNet总体架构2 Encoder和Decoder3 Separator4 TasNet回顾5 More5.1 Unknown number of speakers5.2 Multiple microphones5.3 Visual information本文为李弘毅老师【Speech Separation - TasNet】的课程笔记,课程视频youtube地址,点这里&…

Node 中的开发环境与生产环境 和 使用Morgan打印请求信息

一、什么是开发环境与生产环境 环境,就是指项目运行的地方,当项目处于开发阶段,项目运行在开发人员的电脑上,项目所处的环境就是开发环境。当项目开发完成以后,要将项目放到真实的网站服务器电脑中运行,项…

【转】java单例模式的实现

感觉总结得很好,分享一下,原文:http://blog.csdn.net/shiqining888/article/details/51405932 转载于:https://www.cnblogs.com/just84/p/5499228.html

Chapter4-1_Speech_Synthesis(Tacotron)

文章目录1 TTS before End-to-end2 Tacotron2.1 Encoder2.2 Attention2.3 Decoder2.4 Post processing3 How good is Tacotron?本文为李弘毅老师【Speech Synthesis - Tacotron】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中…

python基础编码规范_Python语言的基本语法和编码规范.doc

Python 语言的基本语法和编码规范 Python 编程教程教师 : 工作 :Python 语言的基本语法和编码标 准课程描述本章将介绍 Python 语言的基本语法和编码标准,重点介 绍 Python 语言的基本知识,如数据类型、运算符、常量、变量、表 达式和常用语句&#xff0…

第三方模块config的使用

作用:允许开发人员将不同运行环境下的应用配置信息抽离到单独的文件中,模块内部自动判断当前应用的运行环境, 并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动…

ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)

以Floyd解法为主的练习题六道 ZOJ2027-Travelling Fee //可免去一条线路中直接连接两城市的最大旅行费用&#xff0c;求最小总旅行费用 //Time:0Ms Memory:604K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using nam…

Chapter4-2_Speech_Synthesis(More than Tacotron)

文章目录1 Mispronunciation2 More information for Encoder3 Attention4 Fast Speech and DurIAN5 Dual Learning5 Controllable TTSSpeaker EmbeddingGST-TacotronTwo-stage Training本文为李弘毅老师【Speech Synthesis - More than Tacotron】的课程笔记&#xff0c;课程视…

art-template模板引擎详解

1. 模板引擎 art-template中文文档&#xff1a;https://www.kancloud.cn/lanju/art-template/1500276 1.1 Ajax 项目中存在的问题 数据和HTML字符串拼接导致代码混乱&#xff0c;拼接容易出错&#xff0c;增加修改难度。 业务逻辑和用户界面混合&#xff0c;代码不易维护。 …

python3语法糖_Python笔记3:语法糖

运算 数字运算 运算会根据结果自动判断结果是int还是float 用到除法的时候&#xff0c;结果自动输出为float 双斜杠//得到的结果是int 取模(余数)还是% >>> 22 4 >>> 50-5*6 20 >>> (50-5*6)/4 5.0 >>> 8/5 1.6 >>> 5.0/1.6 3.12…

【代码笔记】iOS-清除图片缓存UIActionSheet

一&#xff0c;效果图。 二&#xff0c;代码。 RootViewController.m //点击任何处出现sheet -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UIActionSheet * sheet [[UIActionSheet alloc] initWithTitle:"确定要清空图片缓存&#xff1f;" d…

Chapter5_Speaker_Verification

文章目录1 Task Introduction2 模型架构3 模型介绍3.1 i-vector3.2 d-vector3.3 x-vector3.4 more4 End to End本文为李弘毅老师【Speaker Verification】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自于李宏毅…

python如何读取字典的关键字_python提取字典key列表的方法

python提取字典key列表的方法 更新时间&#xff1a;2015年07月11日 12:04:48 作者&#xff1a;企鹅不笨 这篇文章主要介绍了python提取字典key列表的方法,涉及Python中keys方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了python提取字典key列表的方法…

使用express搭建服务器获取MySQL数据库数据

一、原始的mysql查询方法 先安装mysql cnpm install mysql --save 引入这个db.js之后&#xff0c;才能对数据库进行查询 进行查询 查询结果如下&#xff1a; 二、ORM 介绍 ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 主要实现模型对象到关系数据库…

java GZIP压缩和解压

最近碰到了一个按GZIP解压指定的输入流数据&#xff0c;备份下 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;/*** 压缩&#xff…

python数据库连接池_Python实现数据库连接池

1.初始化 def __init__(self, **kwargs): self.size kwargs.get(size, 10) self.kwargs kwargs self.conn_queue queue.Queue(maxsizeself.size) for i in range(self.size): self.conn_queue.put(self._create_new_conn()) size&#xff1a;连接池支持的连接数&#xff0c;…

Chapter6_Vocoder

文章目录1 Introduction2 WaveNet2.1 WaveNet的架构2.2 Softmax Distribution2.3 Causal Convolution和Dilated Convolution2.4 Gated Activation Unit2.5 小结3 FFTNet4 WaveRNN4.1 Dual Softmax Layer4.2 Model Coarse4.3 Model Fine4.4 小结5 WaveGlow本文为李弘毅老师【Voc…