利用内存外音频数据训练语音数字识别网络
本示例使用转换后的数据存储在内存不足的音频数据上训练语音数字识别网络。在本例中,您将对用于训练卷积神经网络(CNN)的音频数据应用一个随机的音调偏移。对于每个训练迭代,音频数据使用audioDataAugmenter
(音频工具箱)对象,然后使用audioFeatureExtractor
(音频工具箱)对象。本例中的工作流适用于训练循环中使用的任何随机数据增强。当底层音频数据集或训练特性不适合内存时,工作流也适用。
数据
下载免费语音数字数据集(FSDD)。FSDD由2000个录音组成,四个说话者用英语说数字0到9。
downloadFolder = matlab.internal.examples.downloadSupportFile (“音频”,“FSDD.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) dataset = fullfile(dataFolder,“FSDD”);
创建一个audioDatastore
(音频工具箱)这指向数据集。
广告= audioDatastore(数据集,IncludeSubfolders = true);
解码文件名以设置数据存储上的标签。显示类和每个类中的示例数量。
(~,文件名)= fileparts (ads.Files);ads.Labels =分类(extractBefore(文件名,“_”));总结(ads.Labels)
0 200 1 200 2 200 3 200 4 200 5 200 6 200 7 200 8 200 9 200
将FSDD分成训练集和测试集。分配80%的数据给训练集,保留20%的数据给测试集。您使用训练集来训练模型,使用测试集来验证训练过的模型。
rng默认的广告= shuffle(广告);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表标签数_____ _____ 0 160 1 160 2 160 3 160 4 160 5 160 6 160 7 160 8 160 9 160
countEachLabel (adsTest)
ans =10×2表标签数_____ _____ 0 40 1 40 2 40 3 40 4 40 5 40 6 40 7 40 8 40 9 40
减少训练数据集
要用整个数据集训练网络并达到尽可能高的精度,请设置speedupExample
来假
.要快速运行此示例,请设置speedupExample
来真正的
.
speedupExample =假;如果adsTrain = splitEachLabel(adsTrain,2);adsTest = splitEachLabel (adsTest 2);结束
改变了训练数据存储
数据增加
增加训练数据应用的音高移动与audioDataAugmenter
(音频工具箱)对象。
创建一个audioDataAugmenter
.增广器对输入音频信号应用0.5概率的音调偏移。增频器在[-12 12]半音范围内选择一个随机的音高移动值。
增量= audioDataAugmenter (...PitchShiftProbability = 0.5,...SemitoneShiftRange = [-12 12],...TimeShiftProbability = 0,...VolumeControlProbability = 0,...AddNoiseProbability = 0,...TimeShiftProbability = 0);
设置自定义的pitch-shift参数。使用身份相位锁定和使用谱包络估计与30阶倒谱分析保存共振。
setAugmenterParams(增压器,“shiftPitch”LockPhase = true PreserveFormants = true, CepstralOrder = 30);
创建转换后的数据存储,将数据增强应用于培训数据。
fs = 8000;adsAugTrain =变换(adsTrain, @ (y)交易(增加(增压器,y, fs) .Audio {1}));
梅尔谱图特征提取
CNN接受mel频率谱图。
定义用于提取mel频率谱图的参数。使用220毫秒的窗口和10毫秒之间的跳转。使用2048点DFT和40个频带。
frameDuration = 0.22;frameLength =圆(frameDuration * fs);hopDuration = 0.01;hopLength =圆(hopDuration * fs);segmentLength = 8192;numBands = 40;fftLength = 2048;
创建一个audioFeatureExtractor
(音频工具箱)对象从输入音频信号计算mel频率谱图。
afe = audioFeatureExtractor (melSpectrum = true, SampleRate = fs,...窗口=汉明(frameLength,“周期”), OverlapLength = frameLength - hopLength...FFTLength = FFTLength);
设置mel频率谱图参数。
setExtractorParameters (afe“melSpectrum”NumBands = NumBands FrequencyRange = [50 fs / 2], WindowNormalization = true);
创建一个转换的数据存储,从音高偏移的音频数据计算mel频率谱图。支持函数,getSpeechSpectrogram
,使录音长度标准化,并使音频输入的振幅规范化。getSpeechSpectrogram
使用audioFeatureExtractor
对象(afe
),以获得基于对数的mel频率谱图。
adsSpecTrain =变换(adsAugTrain @ (x) getSpeechSpectrogram (x, afe segmentLength));
培训的标签
使用一个arrayDatastore
持有培训标签。
labelsTrain = arrayDatastore (adsTrain.Labels);
结合训练数据存储
创建一个指向mel频率谱图数据和相应标签的组合数据存储。
tdsTrain =结合(adsSpecTrain labelsTrain);
验证数据
验证数据集装入内存中。预先执行验证功能。
adsTestT =变换(adsTest @ (x) {getSpeechSpectrogram (x, afe segmentLength)});XTest = readall (adsTestT);XTest =猫(4 XTest {:});
获取验证标签。
欧美= adsTest.Labels;
CNN架构定义
构建一个小的CNN作为层的数组。使用卷积和批处理归一化层,并使用最大池化层对特征映射进行下采样。为了减少网络记忆训练数据的特定特征的可能性,在最后一个全连接层的输入中添加少量dropout。
深圳=大小(XTest);specSize =深圳(1:2);imageSize = [specSize 1];numClasses =元素个数(类别(欧美));dropoutProb = 0.2;numF = 12;layers = [imageInputLayer(imageSize, normalized = .“没有”) convolution2dLayer (5 numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer (3 2 * numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer(3、4 * numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer(3、4 * numF填充=“相同”) batchNormalizationLayer reluLayer convolution2dLayer(3,4*numF,Padding= .“相同”(2) dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer(Classes=categories(YTest));];
设置用于训练网络的超参数。使用128的小批大小和1e-4的学习率。指定“亚当”优化。若要使用并行池读取转换后的数据存储,请设置DispatchInBackground
来真正的
.有关更多信息,请参见trainingOptions
.
miniBatchSize = 128;选择= trainingOptions (“亚当”,...InitialLearnRate = 1的军医,...MaxEpochs = 60,...LearnRateSchedule =“分段”,...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 30,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”,...情节=“训练进步”,...Verbose = false,...ValidationData = {XTest,欧美},...ValidationFrequency =装天花板(元素个数(adsTrain.Files) / miniBatchSize),...ValidationPatience = 5,...ExecutionEnvironment =“汽车”,...DispatchInBackground = true);
通过传递转换后的训练数据存储来训练网络trainNetwork
.
trainedNet = trainNetwork (tdsTrain层,选项);
使用训练过的网络对测试集的数字标签进行预测。
(Ypredicted,聚合氯化铝)= (trainedNet XTest)进行分类;cnnAccuracy = (Ypredicted = =次)/元素个数之和(欧美)* 100
cnnAccuracy = 95.5000
用混淆图总结训练后的网络在测试集上的表现。通过使用列和行摘要显示每个类的精度和召回率。混淆图底部的表格显示了精度值。混淆度图右边的表格显示了召回值。
图(单位=“归一化”,位置=[0.2 0.2 0.5 0.5]);Ypredicted confusionchart(欧美,...Title =“DCNN困惑图表”,...ColumnSummary =“column-normalized”RowSummary =“row-normalized”);
支持功能
得到语音谱图
函数X = getSpeechSpectrogram (X, afe segmentLength)函数的语音谱图%信号x使用audioFeatureExtractor安全。x = scaleAndResize(单(x), segmentLength);规范=提取(afe, x) ';X = log10(spec + 1e-6);结束
规范和调整
函数x = scaleAndResize (x, segmentLength)% scaleAndResize(x,segmentLength)根据x的最大绝对值和力缩放x%它的长度是segmentLength通过修剪或零填充。L = segmentLength;N =大小(x, 1);如果N > L x = x(1:L,:);elseifN < L pad = L - N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);x =[0(前置液,1),x; 0 (postpad 1)];结束x = x / max (abs (x));结束