训练语音数字识别使用内存不足的网络音频数据
这个例子训练语音数字识别网络使用将数据存储在内存不足的音频数据。在本例中,您使用一个随机的音高转向音频数据用于训练卷积神经网络(CNN)。对于每个迭代训练,增强使用音频数据audioDataAugmenter
(音频工具箱)对象,然后使用特性提取audioFeatureExtractor
(音频工具箱)对象。工作流在这个例子适用于任何随机数据增加用于训练循环。工作流也适用于当底层音频数据集或培训特性不符合在内存中。
数据
下载免费使用数字数据集(FSDD)。FSDD由四个扬声器2000录音说英文数字0到9。
downloadFolder = matlab.internal.examples.download金宝appSupportFile (“音频”,“FSDD.zip”);dataFolder = tempdir;解压缩数据集(downloadFolder dataFolder) = fullfile (dataFolder,“FSDD”);
创建一个audioDatastore
(音频工具箱)指向数据集。
广告= audioDatastore(数据集,IncludeSubfolders = true);
解码数据存储的文件名设置标签。显示类和例子的数量在每个类。
(~,文件名)= fileparts (ads.Files);ads.Labels =分类(extractBefore(文件名,“_”));总结(ads.Labels)
0 200 200 200 200 200 4 200 5 6 200 7 200 200 200 9
把FSDD分成训练集和测试集。分配80%的数据训练集和测试集保留20%。使用训练集训练模型和测试集验证训练模型。
rng默认的广告= shuffle(广告);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表标签数_____ _____ 0 160 160 160 160 160 4 160 5 6 160 7 160 160 160 9
countEachLabel (adsTest)
ans =10×2表标签数_____ _____ 40 0 40 1 40 2 40 3 4 5 40 6 40 7 40 8 40 9 40
减少训练数据集
整个数据集训练网络,实现尽可能高的精度,集speedupExample
来假
。快速运行这个例子,集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-shifting参数。使用身份相锁定和保护共振峰用谱包络估计30日订单cepstral分析。
setAugmenterParams(增压器,“shiftPitch”LockPhase = true PreserveFormants = true, CepstralOrder = 30);
创建一个转换数据增加适用于训练数据的数据存储。
fs = 8000;adsAugTrain =变换(adsTrain, @ (y)交易(增加(增压器,y, fs) .Audio {1}));
梅尔·声谱图特征提取
美国有线电视新闻网接受mel-frequency声谱图。
定义参数用于提取mel-frequency色。使用220 ms windows窗口之间10 ms啤酒花。使用2048点DFT和40频段。
frameDuration = 0.22;frameLength =圆(frameDuration * fs);hopDuration = 0.01;hopLength =圆(hopDuration * fs);segmentLength = 8192;numBands = 40;fftLength = 2048;
创建一个audioFeatureExtractor
(音频工具箱)对象计算mel-frequency声音(从输入音频信号。
afe = audioFeatureExtractor (melSpectrum = true, SampleRate = fs,…窗口=汉明(frameLength,“周期”),OverlapLength = frameLength - hopLength…FFTLength = FFTLength);
设置参数mel-frequency声谱图。
setExtractorParameters (afe“melSpectrum”NumBands = NumBands FrequencyRange = [50 fs / 2], WindowNormalization = true);
创建一个转换计算mel-frequency色从pitch-shifted音频数据的数据存储。支持函数金宝app,getSpeechSpectrogram
,规范记录长度和规范的振幅音频输入。getSpeechSpectrogram
使用audioFeatureExtractor
对象(afe
)获得对数mel-frequency色。
adsSpecTrain =变换(adsAugTrain @ (x) getSpeechSpectrogram (x, afe segmentLength));
培训的标签
使用一个arrayDatastore
培训的标签。
labelsTrain = arrayDatastore (adsTrain.Labels);
结合训练数据存储
创建一个数据存储相结合,指出mel-frequency谱图数据和相应的标签。
tdsTrain =结合(adsSpecTrain labelsTrain);
验证数据
验证数据集符合到内存中。预先执行验证功能。
adsTestT =变换(adsTest @ (x) {getSpeechSpectrogram (x, afe segmentLength)});XTest = readall (adsTestT);XTest =猫(4 XTest {:});
验证标签。
欧美= adsTest.Labels;
CNN架构定义
构建一个小型CNN作为数组的层。使用卷积和批量标准化层,downsample使用max池层特征图。减少的可能性,网络记忆训练数据的特定功能,添加少量的辍学输入到最后完全连接层。
深圳=大小(XTest);specSize =深圳(1:2);图象尺寸= [specSize 1];numClasses =元素个数(类别(欧美));dropoutProb = 0.2;numF = 12;层= [imageInputLayer(图象尺寸归一化=“没有”)convolution2dLayer (5 numF填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3 2 * numF填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3、4 * numF填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3、4 * numF填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3、4 * numF、填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (2) dropoutLayer (dropoutProb) fullyConnectedLayer (numClasses) softmaxLayer classificationLayer(类=类别(欧美));];
设置hyperparameters用于训练网络。使用一个mini-batch大小为128的学习速率1的军医。指定“亚当”优化。使用并行池读取转换后的数据存储,集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”);
金宝app支持功能
得到语音谱图
函数X = getSpeechSpectrogram (X, afe segmentLength)% getSpeechSpectrogram (x, afe params)计算的语音谱图使用audioFeatureExtractor afe x %的信号。x = scaleAndResize(单(x), segmentLength);规范=提取(afe, x) ';X = log10(规范+ 1 e-6);结束
规范和调整
函数x = scaleAndResize (x, segmentLength)% scaleAndResize x (x, segmentLength)尺度的最大绝对值和力量%的长度被削减或segmentLength补零。L = segmentLength;N =大小(x, 1);如果N > L x = x (1: L:);elseifN < L垫= L - N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);x =[0(前置液,1),x; 0 (postpad 1)];结束x = x / max (abs (x));结束