论文速递:Deep Speaker: an End-to-End Neural Speaker Embedding System

百度端到端的声纹识别系统
源码:https://github.com/philipperemy/deep-speaker
论文:Deep Speaker: an End-to-End Neural Speaker Embedding System
数据:VoxCeleb:A large scale audio-visual dataset of human speech

摘要

我们提出了一个新的基于深度学习的speaker embedding系统-Deep Speaker,该系统将语音句子映射到一个超平面,然后通过cosine similarity计算说话人之间的相似度。由该Deep Speaker所生成的embeddings 可以被用作多任务,包括说话人识别、验证和聚类。我们通过ResCNN和GRU模型提取音频特征,然后做一个平均池化去产生句子级别的speaker embeddings,然后以cosine similarity为基础,使用triplet loss损失函数训练模型。在三个不同数据库上的实验表明,Deep Speaker系统比基于DNN的i-vector特征要好得多。例如,Deep Speaker系统在文本无关的数据集上将验证错误率(vertification error rate)降低了50%,将识别准确率(identification accuracy)提高了60%。结果表明,通过普通话对模型进行训练和调整可以提高英文说话者识别的准确率。

1. Introduction

说话人识别算法的目的是从音频中确认说话人的身份。两个常用的任务,第一个是说话人验证(speaker vertification)–确认一个说话人的身份是对的还是错的;第二个是说话人鉴定–在一组说话人中,对未知的音频进行鉴定是哪一个说话人。验证和鉴定算法可能需要说话人说出一个特定的词语(文本相关)或者随便说出一段语音(文本无关)。在所有的这些子任务中,embedding方法可以将话语映射到一个特征空间,这个特征空间里,距离就是两个说话人的相似度。尽管有许多算法已经获得了很好的效果,但是说话人识别仍然是一个巨大的挑战。
传统的说话人识别方法使用的是i-vectors和PLDA分析方法。共有三个步骤:

  • step 1:收集足够的统计信息
  • step 2:提取embedding特征(i-vector)
  • step 3:分类(PLDA)

统计信息通常用于通用背景模型(Gaussian Mixture Model-Universal Background Model, GMM-UBM)的计算,GMM-UBM能够使用一系列特征向量被优化(如梅尔倒谱系数, MFCC)。近年来,基于DNN的声学模型也被用于提取足够的统计信息,高维的统计信息被转换成一个低维的i-vector向量,用于对说话人的身份及其话语级别的可变性进行编码。然后,PLDA模型通过比较来自不同话语的i-vector来产生验证分数。
传统上,i-vector系统的三个步骤都是独立训练的,而不是联合优化。一个DNN模型同样可以被用作分类层(第三步)。DNN的中间层可以提供一个帧级别的embedding,可用于训练集中未曾包含的说话者。在预测阶段,需要额外的步骤聚合这种基于帧的表示然后执行验证程序。这种方法存在两大问题:

  • step1和step2都不是直接关于说话人识别进行优化的;
  • 训练和测试阶段不匹配,训练时的label是帧级的,但预测时确是句子级的特征。

文献6和文献7介绍了一种端到端的说话人识别系统(结合三个步骤)。文献6里使用的是LSTM模型最后一帧的输出作为一个句子的embedding,而文献7里使用了一个NIN(network in network)模型的非线性特征(通过一个话语级的池化层去聚合所有的帧级特征)。这两个模型都通过相同的距离准则去训练。
本文里,我们扩展了文献6和文献7所提出的端到端的说话人embedding系统。首先,一个DNN被用来从话语中提取帧级的特征;然后,池化和长度归一化层生成话语级别的embedding;模型被通过triplet loss训练,这能够最小化相同说话人embedding之间的距离,最大化不同说话人的embedding之间的距离。预训练使用了一个softmax层和交叉熵通过固定的说话人提高模型的性能。
更特别的是,我们测试了基于CNN和DNN架构所生成的基于帧级的特征,为speaker verification和speaker identification提供结果。CNN对于减小频谱的可变性和对音频特征的谱相关性建模是有效的,CNN被用到语音识别中也有比较好的结果。由于深度网络能够更好的比浅层网络表示长的话语,因而我们提出了一个深度残差CNN模型(ResCNN),灵感来自于残差网络resnets,我们也融合了GRU层作为一个可选择的帧级特征提取方法(由于它被证明在语音提取应用中是有效的)。
和文献7相同,我们使用了一个基于距离的孙志函数去衡量两个embedding的相似性。但是,不像文献7里的PLDA损失函数,我们训练我们的网络,使得在特征空间里的cosine similarity能够直接对应话语的相关度。我们在迭代过程中也选择了一些负样本,不只是相同的小批量样本。这种方法能够使得训练快速收敛。
最后,我们通过三个不同的数据集验证我们所提出的Deep Speaker系统。我们也调研了softmax预训练、系统的融合、数据大小和录入的句子数量对结果的影响。实验表明,Deep Speaker系统可以显著的改善基于DNN的i-vector文本无关的说话人识别系统。两个有趣的结果展示了:Deep Speaker能够更好的利用大数据(用多达25万个说话者训练,性能会提高);并且,Deep Speaker能够很好的在各种语言进行转换,如中文和英语。

2. Related Work

3. Deep Speaker

图1展示了Deep Speaker的结构,原始音频首先通过4.3节预处理。然后,使用一个前向DNN提取特征。我们在两个不同的核心架构上进行实验:ResNet风格的DNN和Deep Speech2风格的架构(包含GRU的卷基层)。这些网络的细节在3.1。sentence average层是将帧级的输入转换为话语级别的说话人特征。然后,一个affine层和一个length normalization层将临时汇集的特征映射成一个speaker embedding(如3.2节),最后,通过triplet损失层,最大化相同说话人间的余弦相似度,最小化不同人之间的余弦相似度(如3.3节)。
在这里插入图片描述

3.1 Neural Network Architecture

3.1.1 Residual CNN

尽管深度网络比起浅层网络的能力更强,但是它们往往很难训练。ResNet的提出使得深度CNN的训练更容易一点。ResNet由一系列的残差块构成。每一个残差块都包含低层输出到高层输出直接相连的线,如图2所示,ResBlock被定义为:
h = F ( x , W i ) + x h = F(x, W_i) + x h=F(x,Wi)+x
上式中,x和h是输入和输出,F是映射函数。注意到,后面所加的x不会增加额外的参数和计算复杂度,这是它的优势。

表1显示了ResCNN的细节。图2中,ResBlock由2个3*3的卷积层(步长为1)构成。每一个块都有一个残差结构,3个ResBlock在我们的系统里被堆叠。随着通道的增加,我们就使用一个简单的卷基层(大小为55,步长为22)。因此,在卷基层里,频率的范围是一个常数。我们发现说话人识别的效果对时间维度的步长并不敏感,这和文献15的发现相反。我们采用了按句子进行batch normalization(在卷积和非线性层之间),和文献18相同,我们使用以下函数作为激活函数,作为所有网络的非线性层。
σ ( x ) = m i n { m a x { x , 0 } , 20 } \sigma(x) = min\{max\{x, 0\},20\} σ(x)=min{ ma

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
The class `NeuralNet` is a simple fully-connected deep neural network implemented using the `nn.Module` class from the PyTorch library. This class serves as a base for creating custom neural network architectures in PyTorch. It allows you to define the structure and behavior of the neural network by specifying the layers and operations within the `forward` method. To create a custom neural network using this class, you would typically define the layers and operations in the `__init__` method and implement the forward pass in the `forward` method. Here's an example of how you can define a simple fully-connected deep neural network using the `NeuralNet` class: ```python import torch import torch.nn as nn class NeuralNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(NeuralNet, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out ``` In this example, the neural network has two fully connected layers (`fc1` and `fc2`) with a ReLU activation function applied after the first layer. The `input_size` parameter specifies the size of the input features, `hidden_size` specifies the number of hidden units in the first fully connected layer, and `num_classes` specifies the number of output classes. You can then create an instance of this neural network and use it for tasks such as classification or regression by passing input data through the forward method.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值