主要内容

说话者识别使用自定义SincNet层更深的学习

在本例中,您的火车三个卷积神经网络(cnn)执行议长验证然后架构的性能进行比较。三个cnn的架构都是等价的,除了第一次卷积层在每一个:

  1. 在第一个体系结构中,第一个卷积层是一个“标准”卷积层,实现使用convolution2dLayer

  2. 在第二个架构,第一个卷积层是一个常数sinc filterbank,使用一个自定义实现层。

  3. 第三建筑,第一个卷积层是可训练的sinc filterbank,使用一个自定义实现层。这种架构被称为SincNet[1]

[1]显示标准卷积层替换filterbank层导致更快的训练收敛和更高的精度。[1]还表明,使滤波器组的参数可学的收益率额外的性能收益。

介绍

说话人识别是一个著名的研究领域与各种各样的应用程序包括取证和生物认证。许多演讲者识别系统依赖于预先计算的特性,比如i-vectors或MFCCs,然后送入机器学习分类或深度学习网络。其他深度学习语音系统旁路音频信号的特征提取阶段,饲料直接网络。在这样的端到端系统,网络直接学习低级音频信号特征。

在这个例子中,你第一次培训传统的端到端议长识别CNN。过滤器学习往往随机形状不符合感性证据或知识的人耳是如何工作的,特别是在场景训练数据的数量是有限的[1]。然后替换第一个卷积层网络与一个定制的sinc filterbank层,引入了基于感知结构和约束的证据。最后,你训练SincNet架构,它增加了易学性sinc filterbank参数。

三种神经网络体系结构研究的例子总结如下:

  1. 标准卷积神经网络——输入波形直接连接到一个随机初始化卷积层试图学习特性和捕获特性从原始音频帧。

  2. ConstantSincLayer——输入波形与一组固定宽度sinc函数卷积(带通滤波器)等距的mel刻度。

  3. SincNetLayer——输入波形与一组sinc函数卷积的网络参数学习。在SincNet架构,网络音乐训练时sinc函数的参数。

这个例子定义了三种神经网络和火车上面提出LibriSpeech数据集和评估他们的表现[2]

数据集

下载数据集

在本例中,您使用LibriSpeech数据集的一个子集[2]。LibriSpeech数据集是一个大型语料库的读英语演讲在16岁千赫采样。数据来源于有声读物读LibriVox项目。

dataFolder = tempdir;数据集= fullfile (dataFolder,“LibriSpeech”,“培训-清洗- 100”);如果~ datasetExists(集)文件名=“火车——清洁- 100. tar.gz”;url =“http://www.openSLR.org/resources/12/”+文件名;gunzip (url, dataFolder);unzippedFile = fullfile(数据集,文件名);解压(unzippedFile {1} (1: end-3),数据集);结束

创建一个audioDatastore对象访问LibriSpeech音频数据。

广告= audioDatastore(数据集,IncludeSubfolders = true);

从文件路径中提取演讲者标签。

ads.Labels =分类(extractBetween (ads.Files fullfile(数据集,filesep) filesep));

完整的dev -培训- 100数据集是6 GB的数据。快速运行这个例子,集speedupExample真正的

speedupExample =;如果speedupExample allSpeakers =独特(ads.Labels);subsetSpeakers = allSpeakers (1:50);广告=子集(广告,ismember (ads.Labels subsetSpeakers));ads.Labels = removecats (ads.Labels);结束广告= splitEachLabel(广告,0.1);

将音频文件分为训练和测试数据。80%的音频文件被分配到训练集和测试集被分配到20%。

[adsTrain, adsTest] = splitEachLabel(广告,0.8);

语音信号样本

情节的一个音频文件,听它。

[audioIn, dsInfo] =阅读(adsTrain);Fs = dsInfo.SampleRate;声音(audioIn Fs) t = (1 / Fs) *(0:长度(audioIn) 1);情节(t, audioIn)标题(“音频样本”)包含(“时间(s)”)ylabel (“振幅”网格)

重置训练数据存储。

重置(adsTrain)

数据预处理

cnn期望输入有一致的维度。你将预处理音频通过消除地区的沉默,然后将剩下的演讲为200 ms帧与40毫秒重叠。

设置参数预处理。

frameDuration = 200 e - 3;overlapDuration = 40 e - 3;frameLength =地板(Fs * frameDuration);overlapLength =圆(Fs * overlapDuration);

使用支持函数,金宝apppreprocessAudioData训练和测试数据进行预处理。定义一个变换的音频数据存储进行预处理,然后用readall整个数据集进行预处理,预处理数据到内存中。如果你有并行计算工具箱™,你可以计算负载分布到工人。XTrainXTest分别包含训练和测试语音帧。TTraintt分别包含训练和测试标签。

= ~ isempty(版本(pFlag“平行”));adsTrainTransform =变换(adsTrain @ (x) {preprocessAudioData (x, frameLength overlapLength Fs)});XTrain = readall (pFlag adsTrainTransform UseParallel =);

复制标签,这样每个200 ms块都有一个相应的标签。

chunksPerFile = cellfun (@ (x)大小(x, 4), XTrain);TTrain = repelem (adsTrain.Labels chunksPerFile 1);

将训练集到一个数组中。

XTrain =猫(4,XTrain {:});

执行相同的预处理步骤,测试集。

adsTestTransform =变换(adsTest @ (x) {preprocessAudioData (x, frameLength overlapLength Fs)});XTest = readall (adsTestTransform UseParallel = true);chunksPerFile = cellfun (@ (x)大小(x, 4), XTest);tt = repelem (adsTest.Labels chunksPerFile 1);XTest =猫(4 XTest {:});

标准的美国有线电视新闻网

定义层

标准的CNN是受神经网络架构[1]

numFilters = 80;filterLength = 251;numSpeakers =元素个数(独特(removecats (ads.Labels)));层= [imageInputLayer ([1 frameLength 1])%的第一个回旋的层numFilters filterLength convolution2dLayer ([1]) batchNormalizationLayer leakyReluLayer (0.2) maxPooling2dLayer (1 [3])%这一层是紧随其后的是2卷积层convolution2dLayer ([1 - 5], 60) batchNormalizationLayer leakyReluLayer (0.2) maxPooling2dLayer ([1 3]) convolution2dLayer ([1 - 5], 60) batchNormalizationLayer leakyReluLayer (0.2) maxPooling2dLayer (1 [3])%这是紧随其后的是3全层fullyConnectedLayer (256) batchNormalizationLayer leakyReluLayer (0.2) fullyConnectedLayer (256) batchNormalizationLayer leakyReluLayer (0.2) fullyConnectedLayer (256) batchNormalizationLayer leakyReluLayer (0.2) fullyConnectedLayer (numSpeakers) softmaxLayer classificationLayer];

分析神经网络的层使用analyzeNetwork函数

analyzeNetwork(层)

列车网络的

火车15时期使用的神经网络亚当优化。每一个时代之前洗牌的训练数据。神经网络的训练选项设置使用trainingOptions。使用测试数据作为验证数据观察网络性能提高的培训进展。

numEpochs = 15;miniBatchSize = 128;validationFrequency =地板(元素个数(TTrain) / miniBatchSize);选择= trainingOptions (“亚当”,洗牌=“every-epoch”,MiniBatchSize = MiniBatchSize,情节=“训练进步”,Verbose = false, MaxEpochs = numEpochs,ValidationData = {XTest,直言(tt)},ValidationFrequency = ValidationFrequency);

训练网络,电话trainNetwork

(事先convNetInfo] = trainNetwork (XTrain、TTrain层,选择);

检查频率响应的卷积层

画出频率响应的九级过滤器从CNN网络的标准。这些过滤器的形状不直观、不对应于感性认识。下一个部分将探索使用限制滤波器的形状的影响。

F =挤压(convNet.Layers (2, 1) .Weights);H = 0(大小(F));频率= 0(大小(F));2 = 1:尺寸(F, 2) [h F] = freqz (F(:,(二),1251年,Fs);H(:,(二)= abs (H);频率(:,(二)= f;结束idx = linspace(1、大小(F, 2), 9);idx =圆(idx);图jj = 1:9次要情节(3,3,jj)情节(频率(:,idx (jj)), H (:, idx (jj))) sgtitle (“学会了标准的CNN过滤器的频率响应”)包含(“频率(赫兹)”)结束

常数Sinc Filterbank

在本节中,您替换第一个卷积层标准CNN一个常数sinc filterbank层。常数sinc filterbank层可变的输入帧与银行固定的带通滤波器。带通滤波器的线性组合两个sinc过滤器在时域。带通滤波器的频率间隔的线性在梅尔的规模。

定义层

实现不断sinc filterbank层中可以找到constantSincLayer.m文件(在本例中)。定义参数ConstantSincLayer。使用80过滤器和过滤器长度为251。

numFilters = 80;filterLength = 251;numChannels = 1;name =“constant_sinc”;

改变的第一个卷积层从标准CNNConstantSincLayer并保持其他层不变。

cSL = constantSincLayer (numChannels numFilters filterLength, Fs,名称)
cSL = constantSincLayer属性:名称:“constant_sinc”NumFilters: 80 SampleRate: 16000 FilterLength: 251 NumChannels:[]过滤器:[1×251××80单]MinimumFrequency: 50 MinimumBandwidth: 50 StartFrequencies:[0.0019 0.0032 0.0047 0.0062 0.0078 0.0094 0.0111 0.0128 0.0145 0.0164 0.0183 0.0202 0.0222 0.0243 0.0264 0.0286 0.0309 0.0332 0.0356 0.0381 0.0407 0.0433 0.0460 0.0488 0.0517 0.0547 0.0578 0.0610 0.0643 0.0677 0.0712 0.0748…]带宽:[0.0028 0.0030 0.0031 0.0032 0.0033 0.0034 0.0035 0.0036 0.0037 0.0038 0.0039 0.0041 0.0042 0.0043 0.0045 0.0046 0.0047 0.0049 0.0051 0.0052 0.0054 0.0055 0.0057 0.0059 0.0061 0.0063 0.0065 0.0067 0.0069 0.0071 0.0073 0.0075…]可学的参数没有属性。状态参数没有属性。显示所有属性
层(2)= cSL;

列车网络的

列车网络使用trainNetwork函数。使用相同的培训前面定义的选项。

[constSincNet, constSincInfo] = trainNetwork (XTrain、TTrain层,选择);

检查频率响应的卷积层

plotNFilters情节的大小频率响应方法n过滤器与等距的筛选指标。画出大小9过滤器的频率响应ConstantSincLayer

图9 n =;plotNFilters (constSincNet.Layers (2), n)

SincNet

在本节中,您使用一个可训练的SincNet一层一层作为第一个卷积在您的网络。SincNet层可变带通滤波器的输入帧与银行。的带宽和初始频率SincNet过滤器是初始化的等距的梅尔·规模。SincNet层试图学习中更好的为这些带通滤波器参数神经网络框架。

定义层

SincNet层filterbank层的实现可以在找到sincNetLayer.m文件(在本例中)。定义参数SincNetLayer。使用80过滤器和过滤器长度为251。

numFilters = 80;filterLength = 251;numChannels = 1;name =“sinc”;

取代ConstantSincLayer从以前的网络SincNetLayer。这个新的层有两个可学的参数:FilterFrequenciesFilterBandwidths

sNL = sincNetLayer (numChannels numFilters filterLength, Fs,名称)
sNL = sincNetLayer属性:名称:“sinc”NumFilters: 80 SampleRate: 16000 FilterLength: 251 NumChannels:[]窗口:[0.0800 0.0801 0.0806 0.0813 0.0823 0.0836 0.0852 0.0871 0.0893 0.0917 0.0945 0.0975 0.1008 0.1043 0.1082 0.1123 0.1167 0.1214 0.1263 0.1315 0.1369 0.1426 0.1485 0.1547 0.1612 0.1679 0.1748 0.1819 0.1893 0.1969 0.2047 0.2127…]时间戳:[-0.0078 -0.0077 -0.0077 -0.0076 -0.0076 -0.0075 -0.0074 -0.0074 -0.0073 -0.0073 -0.0072 -0.0071 -0.0071 -0.0070 -0.0069 -0.0069 -0.0068 -0.0067 -0.0067 -0.0066 -0.0066 -0.0065 -0.0064 -0.0064 -0.0063 -0.0063 -0.0062 -0.0061…]MinimumFrequency: 50 MinimumBandwidth: 50可学的参数FilterFrequencies: [0.0019 0.0032 0.0047 0.0062 0.0078 0.0094 0.0111 0.0128 0.0145 0.0164 0.0183 0.0202 0.0222 0.0243 0.0264 0.0286 0.0309 0.0332 0.0356 0.0381 0.0407 0.0433 0.0460 0.0488 0.0517 0.0547 0.0578 0.0610 0.0643 0.0677 0.0712 0.0748…] FilterBandwidths:[0.0028 0.0030 0.0031 0.0032 0.0033 0.0034 0.0035 0.0036 0.0037 0.0038 0.0039 0.0041 0.0042 0.0043 0.0045 0.0046 0.0047 0.0049 0.0051 0.0052 0.0054 0.0055 0.0057 0.0059 0.0061 0.0063 0.0065 0.0067 0.0069 0.0071 0.0073 0.0075…]状态参数没有属性。显示所有属性
层(2)= sNL;

列车网络的

列车网络使用trainNetwork函数。使用相同的培训前面定义的选项。

[sincNet, sincNetInfo] = trainNetwork (XTrain、TTrain层,选择);

检查频率响应的卷积层

使用plotNFilters的方法SincNetLayer可视化的频率响应的九级过滤器由SincNet等距的指数学。

图plotNFilters (sincNet.Layers (2), 9)

结果总结

精度

表总结了框架为所有三个神经网络精度。

NetworkType = [“标准CNN”;“恒Sinc层”;“SincNet层”];精度= [convNetInfo.FinalValidationAccuracy; constSincInfo.FinalValidationAccuracy sincNetInfo.FinalValidationAccuracy];resultsSummary =表(NetworkType、准确性)
resultsSummary =3×2表NetworkType准确性_____________________ ________ CNN“标准“71.202”常数Sinc层”75.455“SincNet层”78.395

性能对时代

情节上的精度测试集对时代数看看网络学习随着时代的数量增加。SincNet表现超过了ConstantSincLayer网络,特别是在早期阶段的训练。这表明更新带通滤波器的参数神经网络框架内导致更快的收敛。这种行为只是观察到数据集足够大时,它可能不会看到什么时候speedupExample被设置为真正的

时代= linspace (0 numEpochs元素个数(sincNetInfo.ValidationAccuracy (~ isnan (sincNetInfo.ValidationAccuracy))));时代=[时代,numEpochs];sinc_valAcc = [sincNetInfo.ValidationAccuracy (~ isnan (sincNetInfo.ValidationAccuracy)),sincNetInfo.FinalValidationAccuracy];const_sinc_valAcc = [constSincInfo.ValidationAccuracy (~ isnan (constSincInfo.ValidationAccuracy)),constSincInfo.FinalValidationAccuracy];conv_valAcc = [convNetInfo.ValidationAccuracy (~ isnan (convNetInfo.ValidationAccuracy)),convNetInfo.FinalValidationAccuracy];图绘制(sinc_valAcc时代,“- *”MarkerSize = 4)情节(const_sinc_valAcc时代,“- *”MarkerSize = 4)情节(conv_valAcc时代,“- *”MarkerSize = 4) ylabel (“框架水准仪准确性(测试集)”)包含(“时代”)xlim ([0 numEpochs + 0.3])标题(“框架水准仪精度与时代”)传说(“sincNet”,“constantSincLayer”,“conv2dLayer”位置=“东南”网格)

在上图中,最后一帧精度略有不同的帧在过去迭代计算的准确性。训练时,批标准化层执行mini-batches正常化。然而,训练结束时,批规范化整个训练数据归一化层,导致性能略有变化。

金宝app支持功能

函数xp = preprocessAudioData (x, frameLength overlapLength Fs) speechIdx = detectSpeech (x, Fs);xp = 0 (1 frameLength 1,0);2 = 1:尺寸(speechIdx, 1)%隔离段演讲audioChunk = x (speechIdx (2, 1): speechIdx (2, 2));%分成200 ms的块audioChunk =缓冲区(audioChunk frameLength overlapLength);audioChunk =重塑(audioChunk 1 frameLength 1大小(audioChunk, 2));%与现有的音频连接xp =猫(4 xp audioChunk);结束结束

引用

[1]m . Ravanelli和y Bengio SincNet说话人识别从原始波形,”2018年IEEE口语技术研讨会(SLT),雅典,希腊,2018年,页1021 - 1028,doi: 10.1109 / SLT.2018.8639585。

[2]诉Panayotov g·陈,d . Povey和s . Khudanpur”Librispeech:一种基于公共领域的ASR语料库有声书本,“2015年IEEE国际会议音响、演讲和信号处理(ICASSP),布里斯班昆士兰,2015年,页。5206 - 5210 . doi: 10.1109 / ICASSP.2015.7178964