百度端到端说话人识别系统 Deep Speaker 详细介绍


前言:百度端到端说话人识别系统 Deep Speaker : an End-to-End Neural Speaker Embedding System,论文学习整理一下

0、补充知识

神经网络:

假设L层的输出为a[L],则L+1层得到的为 a[L]的线性变换 + **

  • 线性变换:z[L+1] = w[L+1] * a[L] + b[L+1]
  • **:a[L+1] = g( z[L+1] )

卷积层:

二维卷积核和三维卷积核:二位卷积核针对输入也是二维,二维卷积核可以想象成一个正方形,参数(高,宽);三维卷积核则针对三维输入(高,宽,通道数),可以想象成一个长方体,参数中多了一个 “通道数”,一般卷积核的通道数与输入数据的通道数是一样的,所以维度上的变化在于卷积核的个数。
卷积核参数:三维卷积核 一般设置4个参数,(高,宽,输入通道数,卷积核个数),其中卷积核个数也就是输出时的第三维-输出通道数。
维度变化:输入三维数据(高, 宽, 通道数c),卷积核(尺寸x * y * c,步长)。其中卷积核尺寸和步长会改变输入的高和宽的维度;而卷积核的个数带来的是第三维的变化。输入数据的通道数,只会影响卷积核的通道数,而输出的第三维只与卷积核个数有关。
全连接层:

1、Deep Speaker 介绍

百度端到端说话人识别系统 Deep Speaker 详细介绍
Deep Speaker 是一个系统,所以包含的是一个说话人识别的流程。
包括: 语音前端处理 + 特征提取网络(模型) + 损失函数训练(策略) + 预训练(算法)

2、ResCNN 网络结构分析

ResBlock:

百度端到端说话人识别系统 Deep Speaker 详细介绍
文中设定一个ResBlock:33的卷积核 + Relu** + 33的卷积核
解释一下这个ResBlock的输出:
ResBlock 最后**函数的输出:a[L+1] = g ( z[L+1] + a[L] ),残差的核心就体现在这个 + a[L] 了
其中,z[L+1] 为在输入数据经过块中的(Cov 、 ReLU 、 Cov)得到的输出

ResCNN:

百度端到端说话人识别系统 Deep Speaker 详细介绍

一层一层的来看:

百度端到端说话人识别系统 Deep Speaker 详细介绍

  • conv64-s:单纯的卷积层。
    卷积核尺寸55(卷积核实际上是55c,其中c为输入数据的通道数);个数64,也就代表着输出数据的第三维了;步长为22,会改变数据维度的前2维,也就是高和宽。
    百度端到端说话人识别系统 Deep Speaker 详细介绍
  • res64:是一个ResBlock(残差块),并不是一层网络,实际层数是这个ResBlock中包含的层数,这里残差块中包含2个卷积层:卷积核尺寸33;个数64;步长为11(也就是上文的 Cov+ReLU+Cov,也就是2层,中间**不算)。后面的 乘3 是指有三个ResBlock。所以说这个res64部分指的是 经过3个 ResBlock,而且每一个ResBlock中包含2个卷积层,其实是6层网络了。
    ……(其它conv和res都差不多了)
  • average层,本来数据是三维的,分别代表(时间帧数 * 每帧特征维度 * 通道数),通道数也就是经过不同方式提取的每帧的特征(Fbank或MFCC这种)。将时间平均,这样一段语音就对应一段特征了,而不是每一帧都对应一段特征。
  • affine层:仿射层,就是将维度2048的特征变为512维
  • ln层( length normalization layer):标准化层,特征标准化之后,得到的向量来表示说话者语音

解释下 dim 维度这一列

开始时输入语音数据是三维:(时间帧数 * 每帧特征维度 * 通道数)。本文中,时间帧数根据语音长度可变,每帧特征维度为64,通道数为3(代表Fbank、一阶、二阶)。

所以输入维度:时间帧数 * 64 * 3

经过第一层conv64-s后:因为卷积层步长22,所以时间帧数 和每帧特征维度都减半了,特征维度变为了32,通道数变为了卷积核个数64。3264=2048,也就是dim的值了。

所以,这里的dim维度指的是除去时间维的 频率特征维度。

3、Triplet Loss

百度端到端说话人识别系统 Deep Speaker 详细介绍


参考:
1 百度声纹识别论文deep speaker介绍
2 开发日记】Deep speaker之ResCNN Input结构
3 论文中文翻译