使用深度学习训练语音命令识别模型
这个例子展示了如何培养一个深度学习模型,检测音频语音命令的存在。示例数据集使用语音命令[1]训练一个卷积神经网络识别一组命令。
使用pretrained语音命令识别系统,明白了语音命令识别使用深度学习(音频工具箱)。
要运行示例很快,集speedupExample
来真正的
。运行完整的示例发布,集speedupExample
来假
。
speedupExample =假;
设置随机种子再现性。
rng默认的
加载数据
下面的例子使用了谷歌语音命令数据集[1]。下载并解压缩数据集。
downloadFolder = matlab.internal.examples.download万博1manbetxSupportFile (“音频”,“google_speech.zip”);dataFolder = tempdir;解压缩数据集(downloadFolder dataFolder) = fullfile (dataFolder,“google_speech”);
增加的数据
网络不仅应该能够识别不同的口语词汇,还检测如果音频输入沉默或背景噪音。
支持函数万博1manbetx,augmentDataset
,使用谷歌语音的音频文件在后台文件夹命令数据集创建一秒钟的背景噪音。函数创建一个相同数量的背景从每个背景噪音段文件,然后分裂之间的部分训练和验证文件夹。
augmentDataset(数据集)
进步= 17(%)进步= 33 = 50(%)进展进展(%)= 67(%)进步进步= 83 (%)= 100 (%)
创建培训数据存储
创建一个audioDatastore
(音频工具箱)指向的训练数据集。
广告= audioDatastore (fullfile(数据集,“训练”),…IncludeSubfolders = true,…FileExtensions =“wav”,…LabelSource =“foldernames”);
指定的话,你希望你的模型识别的命令。标签的所有文件没有命令或背景噪音未知的
。标记的单词不是命令未知的
接近的单词创建一组命令以外的所有词语的分布。网络使用这组学习命令和其他单词之间的区别。
减少失衡已知和未知的类单词和加速处理,只包括一小部分生词的训练集。
使用子集
(音频工具箱)创建一个数据存储,只包含的命令,背景噪音,生词的子集。数一数的例子属于每个类别。
命令=分类([“是的”,“不”,《飞屋环游记》,“向下”,“左”,“正确”,“上”,“关闭”,“停止”,“走”]);背景=分类(“背景”);isCommand = ismember (ads.Labels、命令);isBackground = ismember (ads.Labels、背景);isUnknown = ~ (isCommand | isBackground);includeFraction = 0.2;%的未知数,包括。idx =找到(isUnknown);idx = idx (randperm(元素个数(idx)轮((1-includeFraction) * sum (isUnknown))));isUnknown (idx) = false;ads.Labels (isUnknown) =分类(“未知”);adsTrain =子集(广告,isCommand | isUnknown | isBackground);adsTrain。标签= removecats (adsTrain.Labels);
创建验证数据存储
创建一个audioDatastore
(音频工具箱)指向验证数据集。遵循相同的步骤用于创建数据存储的培训。
广告= audioDatastore (fullfile(数据集,“确认”),…IncludeSubfolders = true,…FileExtensions =“wav”,…LabelSource =“foldernames”);isCommand = ismember (ads.Labels、命令);isBackground = ismember (ads.Labels、背景);isUnknown = ~ (isCommand | isBackground);includeFraction = 0.2;%的未知数,包括。idx =找到(isUnknown);idx = idx (randperm(元素个数(idx)轮((1-includeFraction) * sum (isUnknown))));isUnknown (idx) = false;ads.Labels (isUnknown) =分类(“未知”);adsValidation =子集(广告,isCommand | isUnknown | isBackground);adsValidation。标签= removecats (adsValidation.Labels);
可视化培训和验证标签分布。
图(单位=“归一化”位置= [0.2,0.2,0.5,0.5])tiledlayout (2, 1) nexttile直方图(adsTrain.Labels)标题(“培训标签分配”)ylabel (“观察”网格)在nexttile直方图(adsValidation.Labels)标题(“验证标签分配”)ylabel (“观察”网格)在
加快通过减少数据集的例子中,如果请求。
如果speedupExample numUniqueLabels =元素个数(独特(adsTrain.Labels));% #好< UNRCH >%减少数据集的20倍adsTrain = splitEachLabel (adsTrain轮(元素个数(adsTrain.Files) / numUniqueLabels / 20));adsValidation = splitEachLabel (adsValidation轮(元素个数(adsValidation.Files) / numUniqueLabels / 20));结束
准备培训资料
准备的数据有效的卷积神经网络训练,语音波形转换为auditory-based声谱图。
加快处理、特征提取可以分发到多个工人。开始一个平行池如果你有访问并行计算工具箱™。
如果canUseParallelPool & & ~ speedupExample useParallel = true;gcp;其他的useParallel = false;结束
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
提取的特征
定义参数提取听觉声音(音频输入。segmentDuration
每个演讲片段的时间在秒。frameDuration
是频谱计算每一帧的持续时间。hopDuration
是每个光谱之间的时间步。numBands
过滤器的数量在听觉谱图。
fs = 16 e3;%已知采样率的数据集。segmentDuration = 1;frameDuration = 0.025;hopDuration = 0.010;FFTLength = 512;numBands = 50;segmentSamples =圆(segmentDuration * fs);frameSamples =圆(frameDuration * fs);hopSamples =圆(hopDuration * fs);overlapSamples = frameSamples - hopSamples;
创建一个audioFeatureExtractor
(音频工具箱)对象进行特征提取。
afe = audioFeatureExtractor (…SampleRate = fs,…FFTLength = FFTLength,…窗口=损害(frameSamples,“周期”),…OverlapLength = overlapSamples,…barkSpectrum = true);setExtractorParameters (afe“barkSpectrum”NumBands = NumBands WindowNormalization = false);
定义一个系列的变换
(音频工具箱)在audioDatastore
(音频工具箱)垫音频长度一致,提取特征,然后运用对数。
transform1 =变换(adsTrain @ (x)[0(地板((segmentSamples-size (x, 1)) / 2), 1); x; 0(装天花板((segmentSamples-size (x, 1)) / 2), 1)));transform2 =变换(transform1, @ (x)提取(afe x));transform3 =变换(transform2 @ (x) {log10 (x + 1 e-6)});
使用readall
(音频工具箱)函数来读取所有数据从数据存储中。读取每个文件,通过变换之前返回的数据。
XTrain = readall (transform3 UseParallel = UseParallel);
输出是一个numFiles
1单元阵列。细胞数组的每个元素对应于听觉谱图提取一个文件。
numFiles =元素个数(XTrain)
numFiles = 28463
[numHops, numBands numChannels] =大小(XTrain {1})
numHops = 98
numBands = 50
numChannels = 1
细胞数组转换成一个四维数组与听觉谱图以及第四维。
XTrain =猫(4,XTrain {:});[numHops, numBands numChannels numFiles] =大小(XTrain)
numHops = 98
numBands = 50
numChannels = 1
numFiles = 28463
执行上述特征提取步骤验证集。
transform1 =变换(adsValidation @ (x)[0(地板((segmentSamples-size (x, 1)) / 2), 1); x; 0(装天花板((segmentSamples-size (x, 1)) / 2), 1)));transform2 =变换(transform1, @ (x)提取(afe x));transform3 =变换(transform2 @ (x) {log10 (x + 1 e-6)});XValidation = readall (transform3 UseParallel = UseParallel);XValidation =猫(4,XValidation {:});
为了方便起见,隔离训练和验证目标标签。
TTrain = adsTrain.Labels;TValidation = adsValidation.Labels;
可视化数据
画出波形和听觉谱图的一些训练样本。发挥相应的音频剪辑。
specMin = min (XTrain [],“所有”);specMax = max (XTrain [],“所有”);idx = randperm(元素个数(adsTrain.Files), 3);图(单位=“归一化”位置= (0.2,0.2,0.6,0.6));tiledlayout (2、3)为2 = 1:3 (x, fs) = audioread (adsTrain.Files {idx (ii)});nexttile (ii)情节(x)轴紧标题(string (adsTrain.Labels (idx (ii)))) nexttile (2 + 3) spect = XTrain (:,: 1, idx (ii) ';这一pcolor (spect) ([specMin specMax])阴影平声音(x, fs)暂停(2)结束
定义网络体系结构
创建一个简单的网络体系结构层的一个数组。使用卷积和批量标准化层,downsample特征地图“空间”(也就是说,在时间和频率)使用max池层。添加最后一个马克斯池层池输入特性全球地图。这个执行(近似)time-translation输入谱图中的不变性,使网络执行相同的分类独立言论的确切位置。全球池也显著减少了参数的数量在最后完全连接层。减少的可能性,网络记忆训练数据的特定功能,添加少量的辍学输入到最后完全连接层。
网络很小,因为它只有5卷积和几层过滤器。numF
控制卷积过滤器的层数。增加网络的准确性,试着增加网络深度通过添加相同的卷积,批正常化,和ReLU层。你也可以尝试增加卷积过滤器的数量增加numF
。
给每个类等于总重量损失,使用类重量成反比的训练例子每个类的数量。当使用亚当优化器训练网络,训练算法是独立于整体类的归一化权重。
类=类别(TTrain);classWeights = 1. / countcats (TTrain);classWeights = classWeights ' /意味着(classWeights);numClasses =元素个数(类);timePoolSize =装天花板(numHops / 8);dropoutProb = 0.2;numF = 12;层= [imageInputLayer ([numHops afe.FeatureVectorLength]) convolution2dLayer (3 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 ([timePoolSize 1]) dropoutLayer (dropoutProb) fullyConnectedLayer (numClasses) softmaxLayer classificationLayer(类=类,ClassWeights = ClassWeights)];
指定培训选项
定义参数训练,使用trainingOptions
。优化器使用亚当mini-batch大小为128。
miniBatchSize = 128;validationFrequency =地板(元素个数(TTrain) / miniBatchSize);选择= trainingOptions (“亚当”,…InitialLearnRate = 3的军医,…MaxEpochs = 15,…MiniBatchSize = MiniBatchSize,…洗牌=“every-epoch”,…情节=“训练进步”,…Verbose = false,…ValidationData = {XValidation, TValidation},…ValidationFrequency = ValidationFrequency);
列车网络的
训练网络,使用trainNetwork
。如果你没有一个GPU,然后培训网络需要时间。
trainedNet = trainNetwork (XTrain、TTrain层,选择);
评估培训网络
计算网络的最终精度训练集和验证集,使用分类
。网络是非常准确的数据集。然而,训练,验证和测试数据都有类似的分布不一定反映真实世界的环境。这种限制特别适用于未知的
类别,其中包含的话语只有少量的单词。
YValidation =分类(trainedNet XValidation);validationError =意味着(YValidation ~ = TValidation);YTrain =分类(trainedNet XTrain);trainError =意味着(YTrain ~ = TTrain);disp ([“训练误差:+ trainError * 100 +“%”;"验证错误:"+ validationError * 100 +“%”])
“训练误差:2.7263%”“验证错误:6.3968%”
为验证集的情节混淆矩阵,使用confusionchart
。显示每个类的精度和召回通过使用列和行摘要。
图(单位=“归一化”位置= (0.2,0.2,0.5,0.5));厘米= confusionchart (TValidation YValidation,…Title =“验证数据的混淆矩阵”,…ColumnSummary =“column-normalized”RowSummary =“row-normalized”);sortClasses(厘米,[命令,“未知”,“背景”])
当工作在有限的硬件资源的应用程序,如移动应用,重要的是要考虑限制可用内存和计算资源。计算网络的总大小字节和测试它的预测速度当使用一个CPU。分类的预测时间是时间一个输入图像。如果你输入多个图像网络,这些可以同时分类,导致短预测次形象。当分类流式音频,幅图片预测时间是最相关的。
为2 = 1:10 0 x = randn ([numHops numBands]);predictionTimer =抽搐;(y,聚合氯化铝)= (trainedNet x, ExecutionEnvironment =进行分类“cpu”);(二)= toc (predictionTimer);结束disp ([“网络大小:”+谁(“trainedNet”)。字节/ 1024 +“知识库”;…幅图片预测CPU时间:“+的意思是(时间(11:结束))* 1000 +“女士”])
“网络大小:292.2842 kB”“女士幅图片预测CPU时间:3.7237”
万博1manbetx支持功能
增加数据集和背景噪音
函数augmentDataset (datasetloc) adsBkg = audioDatastore (fullfile (datasetloc,“背景”));fs = 16 e3;%已知采样率的数据集segmentDuration = 1;segmentSamples =圆(segmentDuration * fs);volumeRange = log10([1的军医,1]);numBkgSegments = 4000;numBkgFiles =元素个数(adsBkg.Files);numSegmentsPerFile =地板(numBkgSegments / numBkgFiles);fpTrain = fullfile (datasetloc,“训练”,“背景”);fpValidation = fullfile (datasetloc,“确认”,“背景”);如果~ datasetExists (fpTrain)%创建目录mkdir (fpTrain) mkdir (fpValidation)为backgroundFileIndex = 1:元素个数(adsBkg.Files) [bkgFile fileInfo] =阅读(adsBkg);[~,fn] = fileparts (fileInfo.FileName);%确定每个部分开始指数segmentStart =兰迪(大小(bkgFile, 1) -segmentSamples, numSegmentsPerFile, 1);%确定每个片段的获得获得= 10。^ (volumeRange (2) -volumeRange(1)) *兰德(numSegmentsPerFile 1) + volumeRange (1));为segmentIdx = 1: numSegmentsPerFile%隔离随机选择部分的数据。bkgSegment = bkgFile (segmentStart (segmentIdx): segmentStart (segmentIdx) + segmentSamples-1);%范围内指定的部分收益。bkgSegment = bkgSegment *获得(segmentIdx);%夹1和1之间的音频。bkgSegment = max (min (bkgSegment, 1), 1);%创建一个文件的名字。afn = fn +“_segment”+ segmentIdx +“wav”;%随机分配段火车或背景%验证集。如果兰德> 0.85% 15%分配给验证dirToWriteTo = fpValidation;其他的%分配85%的训练集。dirToWriteTo = fpTrain;结束%写音频文件的位置。ffn = fullfile (dirToWriteTo afn);audiowrite (ffn bkgSegment fs)结束%打印进展流(的进步= % d % %) (\ n '而圆(100 *进展(adsBkg)))结束结束结束
引用
[1]监狱长P。“语音命令:一个公共数据集单字原图语音识别”,2017。可以从https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz。版权2017年谷歌。语音命令数据集是创作共用署名4.0许可下的,可用:https://creativecommons.org/licenses/by/4.0/legalcode。
引用
[1]监狱长P。“语音命令:一个公共数据集单字原图语音识别”,2017。可以从http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz。版权2017年谷歌。语音命令数据集是创作共用署名4.0许可下的,可用:https://creativecommons.org/licenses/by/4.0/legalcode。
另请参阅
trainNetwork
|分类
|analyzeNetwork