主要内容

关键字定位在噪音使用MFCC和LSTM网络

这个例子展示了如何识别一个关键字在嘈杂的演讲中使用深度学习网络。特别是,示例使用双向长短期记忆(BiLSTM)网络和mel频率cepstral系数(MFCC)。

介绍

关键字定位(KWS) voice-assist技术是一个重要的组成部分,用户说一个预定义的关键字来唤醒一个系统之前,说一个完整的命令或查询到设备。

这个例子列车KWS深层网络的特征序列mel-frequency cepstral系数(MFCC)。示例还演示了如何提高网络精度在嘈杂的环境中使用数据增大。

这个示例使用长期短期记忆(LSTM)网络,这是一种递归神经网络(RNN)适合研究序列和时间序列数据。一个LSTM网络可以学习长期时间的步骤序列之间的依赖关系。一个LSTM层(lstmLayer(深度学习工具箱))可以查看时间序列方向前进,而双向LSTM层(bilstmLayer(深度学习工具箱))可以查看时间序列在向前和向后的方向。这个例子使用一个双向LSTM层。

示例使用谷歌语音命令数据集训练深度学习模型。要运行示例,您必须先下载数据集。如果你不希望下载数据集或训练网络,然后你可以下载和使用pretrained网络通过打开这个例子在MATLAB®和运行线路3 - 10的例子。

关键字与Pretrained网络

进入详细培训过程之前,您将下载并使用pretrained关键词定位网络来识别关键字。

在这个例子中,发现的关键字是的

读一个关键字是发出的测试信号。

[audioIn, fs] = audioread (“keywordTestSignal.wav”);声音(audioIn fs)

下载和加载pretrained网络,意味着(M)和标准差(S)向量用于功能正常化,以及2音频文件用于验证网络之后的示例。

url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/KeywordSpotting.zip”;downloadNetFolder = tempdir;netFolder = fullfile (downloadNetFolder,“KeywordSpotting”);如果~存在(netFolder“dir”)disp (文件下载pretrained网络和音频文件(4 - 7 MB)……”解压缩(url, downloadNetFolder)结束负载(fullfile (netFolder“KWSNet.mat”));

创建一个audioFeatureExtractor对象进行特征提取。

WindowLength = 512;OverlapLength = 384;afe = audioFeatureExtractor (“SampleRate”fs,“窗口”损害(WindowLength“周期”),“OverlapLength”OverlapLength,“mfcc”,真的,“mfccDelta”,真的,“mfccDeltaDelta”,真正的);

从测试信号中提取特征和规范化。

特点=提取(afe audioIn);特点=(功能- M)。/ S;

计算关键字识别二进制面具。面具的值对应于一段关键字被发现的地方。

掩码= (KWSNet、特点进行分类。');

面具中的每个样本对应128个样本从语音信号(WindowLength- - - - - -OverlapLength)。

扩大面具的长度的信号。

掩码= repmat(面具WindowLength-OverlapLength 1);掩码=双(面具)- 1;掩码=面具(:);

测试信号和面具的阴谋。

图audioIn = audioIn(1:长度(面具));t =(0:长度(audioIn) 1) / fs;情节(t, audioIn)网格持有情节(t,面具)传说(“演讲”,“是的”)

听了关键字。

声音(audioIn(掩码= = 1),fs)

检测命令使用流式音频从麦克风

测试你的pre-trained命令检测网络流媒体音频从你的麦克风。试着说随机的单词,包括关键字(是的)。

调用generateMATLABFunctionaudioFeatureExtractor对象创建特征提取功能。您将使用此函数在处理循环。

generateMATLABFunction (afe“generateKeywordFeatures”,“IsStreaming”,真正的);

定义一个音频设备的读者,可以阅读从你的麦克风音频。设置帧长度的跳。这使您能够计算一组新的功能,为每一个新的麦克风的音频帧。

HopLength = WindowLength - OverlapLength;FrameLength = HopLength;adr = audioDeviceReader (“SampleRate”fs,“SamplesPerFrame”,FrameLength);

创建一个空间可视化语音信号和估计的面具。

范围= timescope (“SampleRate”fs,“TimeSpanSource”,“属性”,“时间间隔”5,“TimeSpanOverrunAction”,“滚动”,“BufferLength”fs * 5 * 2,“ShowLegend”,真的,“ChannelNames”,{“演讲”,“关键词面具”},“YLimits”(-1.2 - 1.2),“标题”,关键字定位的);

定义你的速度估计面具。您将生成一个面具一次NumHopsPerUpdate音频帧。

NumHopsPerUpdate = 16;

初始化一个音频缓冲区。

dataBuff = dsp.AsyncBuffer (WindowLength);

初始化一个缓冲区的计算功能。

featureBuff = dsp.AsyncBuffer (NumHopsPerUpdate);

初始化一个缓冲区管理策划音频和面具。

plotBuff = dsp.AsyncBuffer (NumHopsPerUpdate * WindowLength);

无限循环运行,设定时限。停止仿真,缩小范围。

期限= 20;抽搐toc <时限数据= adr ();写(dataBuff、数据);写(plotBuff、数据);帧=阅读(dataBuff WindowLength OverlapLength);特点= generateKeywordFeatures(框架、fs);写(featureBuff特性。');如果featureBuff。NumUnreadSamples = = NumHopsPerUpdate featureMatrix =阅读(featureBuff);featureMatrix (~ isfinite (featureMatrix)) = 0;featureMatrix = (featureMatrix - M)。/ S;[keywordNet v] = classifyAndUpdateState (KWSNet featureMatrix。');v =双(v) - 1;v = repmat (v HopLength 1);v = (,);v =模式(v);v = repmat (v NumHopsPerUpdate * HopLength 1); data = read(plotBuff); scope([data, v]);如果~ isVisible(范围)打破;结束结束结束隐藏(范围)

在其他例子中,您将学习如何培养关键字识别网络。

培训过程总结

培训过程经过以下步骤:

  1. 检查上的“黄金标准”关键字定位基准确认信号。

  2. 从一个无噪声的数据集创建培训话语。

  3. 火车一个关键词发现LSTM网络使用MFCC序列提取这些话语。

  4. 检查网络精度进行比较验证基线时网络的输出信号应用于验证。

  5. 检查网络验证噪声信号的精度。

  6. 增加训练数据集通过注入噪声语音数据使用audioDataAugmenter

  7. 重新培训增强的网络数据集。

  8. 确认重新训练网络现在收益率更高的准确性当应用于噪声信号验证。

检查验证信号

你用语音信号样本来验证KWS网络。验证信号由34秒的演讲与关键字是的出现间歇性。

加载验证信号。

[audioIn, fs] = audioread (fullfile (netFolder,“KeywordSpeech-16-16-mono-34secs.flac”));

听信号。

声音(audioIn fs)

可视化的信号。

图t = (1 / fs) *(0:长度(audioIn) 1);情节(t, audioIn);网格包含(“时间(s)”)标题(验证语音信号的)

检查KWS基线

负载KWS基线。这个基准是获得使用speech2text:使用音频贴标签机创建关键字发现面具

负载(“KWSBaseline.mat”,“KWSBaseline”)

基线是一个逻辑向量长度相同的验证音频信号。段在audioIn关键字在哪里设置为一个在说KWSBaseline

可视化语音信号和KWS基线。

无花果=图;情节(t [audioIn KWSBaseline '])网格包含(“时间(s)”)传说(“演讲”,KWS基线的,“位置”,“东南”)l = findall(图,“类型”,“行”);l (1)。线宽= 2;标题(“验证信号”)

听演讲的部分确认为关键词。

声音(audioIn (KWSBaseline)、fs)

网络,你训练的目的是输出一个KWS掩盖这样的0和1的基线。

加载语音命令数据集

下载并提取数据集的谷歌语音命令[1]

url =“https://ssd.mathworks.com/金宝appsupportfiles/audio/google_speech.zip”;downloadFolder = tempdir;datasetFolder = fullfile (downloadFolder,“google_speech”);如果~存在(datasetFolder“dir”)disp (下载谷歌语音命令数据集(1.5 GB)……”解压缩(url, datasetFolder)结束

创建一个audioDatastore指向数据集。

广告= audioDatastore (datasetFolder,“LabelSource”,“foldername”,“Includesubfolders”,真正的);广告= shuffle(广告);

数据集包含了背景噪音文件,在本例中没有使用。使用子集创建一个新的数据存储没有背景噪音文件。

isBackNoise = ismember (ads.Labels,“背景”);广告(广告,~ isBackNoise) =子集;

数据集有大约65000个一秒钟长30话语短单词(包括关键字是的)。得到一个分解词分布的数据存储。

countEachLabel(广告)
ans =30×2表标签数_____ _____床1713鸟1731猫1733狗1746 2359 8 2352 5 2357 4 2372 2372快乐1742 1750 2353马文1746 9 2364 2375 2357⋮

分裂广告为两个数据存储:第一个数据存储包含文件对应的关键字。第二个数据存储包含所有其他单词。

关键词=“是的”;isKeyword = ismember (ads.Labels、关键词);ads_keyword =子集(广告,isKeyword);ads_other =子集(广告,~ isKeyword);

整个数据集训练网络,实现尽可能高的精度,集reduceDataset。快速运行这个例子,集reduceDataset真正的

reduceDataset =;如果reduceDataset%减少数据集的20倍ads_keyword = splitEachLabel (ads_keyword轮(元素个数(ads_keyword.Files) / 20));numUniqueLabels =元素个数(独特(ads_other.Labels));ads_other = splitEachLabel (ads_other轮(元素个数(ads_other.Files) / numUniqueLabels / 20));结束

得到一个崩溃的分布在每个数据存储。洗牌的ads_other数据存储,以便连续读取返回不同的单词。

countEachLabel (ads_keyword)
ans =1×2表标签数_____ _____是的2377
countEachLabel (ads_other)
ans =29日×2表标签数_____ _____床1713鸟1731猫1733狗1746 2359 8 2352 5 2357 4 2372 2372快乐1742 1750 2353马文1746 9 2364 2375 2357⋮
ads_other = shuffle (ads_other);

创建培训句子和标签

训练数据存储包含一秒钟的语音信号,说出一个单词。您将创建更复杂的培训演讲话语包含关键字以及其他单词的混合物。

这是构建话语的一个例子。从关键字数据存储和读取一个关键字正常它的最大价值。

是的=阅读(ads_keyword);是的= yes / max (abs (yes));

信号有交际部分(沉默,背景噪音等),不包含有用的语言信息。这个例子就沉默detectSpeech

的开始和结束指标的有用部分信号。

speechIndices = detectSpeech(是的,fs);

随机选择的字数合成训练句子里使用。使用最多10个单词。

numWords =兰迪([0 10]);

随机挑选关键词出现的位置。

keywordLocation =兰迪([1 numWords + 1]);

读所需数量的non-keyword话语,构造训练句子和面具。

句子= [];掩码= [];指数= 1:numWords + 1如果指数= = keywordLocation句子=(句子;是的);% #好吧newMask = 0(大小(是的));newMask (speechIndices (1, 1): speechIndices (1、2)) = 1;掩码=[面具;newMask];% #好吧其他的其他=阅读(ads_other);其他=。/ max (abs(其他));句子=(句子,其他);% #好吧掩码=[面具;0(大小(其他))];% #好吧结束结束

情节训练句子的面具。

图t = (1 / fs) *(0:长度(句子)1);无花果=图;情节(t,句子,面具)网格包含(“时间(s)”)传说(“训练信号”,“面具”,“位置”,“东南”)l = findall(图,“类型”,“行”);l (1)。线宽= 2;标题(“话语”)

听句子训练。

声音(句子,fs)

提取的特征

这个例子列车深入学习网络使用39 MFCC系数(13 MFCC 13三角洲和13δ系数)。

定义MFCC提取所需参数。

WindowLength = 512;OverlapLength = 384;

创建一个audioFeatureExtractor对象执行特征提取。

afe = audioFeatureExtractor (“SampleRate”fs,“窗口”损害(WindowLength“周期”),“OverlapLength”OverlapLength,“mfcc”,真的,“mfccDelta”,真的,“mfccDeltaDelta”,真正的);

提取特征。

featureMatrix =提取(afe,句子);大小(featureMatrix)
ans =1×2478年39

注意,您计算MFCC通过滑动窗口输入,所以特征矩阵是短于输入语音信号。在每一行featureMatrix从语音信号对应于128个样本(WindowLength- - - - - -OverlapLength)。

计算长度相同的面具featureMatrix

HopLength = WindowLength - OverlapLength;范围= HopLength *(1:尺寸(featureMatrix, 1)) + HopLength;featureMask = 0(大小(范围);指数= 1:元素个数(范围)featureMask(指数)=模式(面具((索引1)* HopLength + 1:(索引1)* HopLength + WindowLength));结束

从训练数据集提取特征

句子合成和整个训练数据集特征提取可能非常耗时。加快处理,如果你有并行计算工具箱™,训练数据存储分区,每个分区和过程在一个单独的工人。

选择一个数据库分区的数量。

numPartitions = 6;

初始化细胞阵列的特性矩阵和面具。

TrainingFeatures = {};TrainingMasks = {};

完成句子合成、特征提取和面具创建使用parfor

emptyCategories =分类([1 0]);emptyCategories (:) = [];抽搐parfor2 = 1:numPartitions subads_keyword =分区(ads_keyword、numPartitions ii);subads_other =分区(ads_other、numPartitions ii);数= 1;localFeatures =细胞(长度(subads_keyword.Files), 1);localMasks =细胞(长度(subads_keyword.Files), 1);hasdata (subads_keyword)%创建一个培训的句子(句子,面具)= HelperSynthesizeSentence (subads_keyword subads_other, fs, WindowLength);%计算mfcc特征featureMatrix =提取(afe,句子);featureMatrix (~ isfinite (featureMatrix)) = 0;%创建面具hopLength = WindowLength - OverlapLength;= (hopLength) *(1:尺寸(featureMatrix, 1)) + hopLength;featureMask = 0(大小(范围);指数= 1:元素个数(范围)featureMask(指数)=模式(面具((索引1)* hopLength + 1:(索引1)* hopLength + WindowLength));结束localFeatures{数}= featureMatrix;localMasks{数}= [emptyCategories,直言(featureMask)];数=计数+ 1;结束TrainingFeatures = [TrainingFeatures; localFeatures];TrainingMasks = [TrainingMasks; localMasks];结束流(的训练特征提取了% f秒。\ n 'toc)
训练特征提取了33.656404秒。

是一种很好的做法规范化所有功能零均值和标准差统一。计算每个系数的平均值和标准偏差和规范化的数据使用它们。

sampleFeature = TrainingFeatures {1};numFeatures =大小(sampleFeature, 2);featuresMatrix =猫(1,TrainingFeatures {:});如果reduceDataset加载(fullfile (netFolder“keywordNetNoAugmentation.mat”),“keywordNetNoAugmentation”,“米”,“年代”);其他的M =意味着(featuresMatrix);S =性病(featuresMatrix);结束指数= 1:长度(TrainingFeatures) f = TrainingFeatures{指数};f = (f - M)。/ S;TrainingFeatures{指数}= f。';% #好吧结束

提取验证特性

从验证提取MFCC特征信号。

audioIn featureMatrix =提取(afe);featureMatrix (~ isfinite (featureMatrix)) = 0;

验证功能正常化。

FeaturesValidationClean = (featureMatrix - M)。/ S;范围= HopLength *(1:尺寸(FeaturesValidationClean, 1)) + HopLength;

构建验证KWS面具。

featureMask = 0(大小(范围);指数= 1:元素个数(范围)featureMask(指数)=模式(KWSBaseline((索引1)* HopLength + 1:(索引1)* HopLength + WindowLength));结束BaselineV =分类(featureMask);

定义LSTM网络体系结构

LSTM网络可以学习长期之间的依赖关系的时间序列数据的步骤。下面的例子使用了双向LSTM层bilstmLayer(深度学习工具箱)观察序列在向前和向后的方向。

指定输入序列的大小numFeatures。指定两个双向LSTM隐藏层和一个输出大小为150和输出序列。这个命令指示双向LSTM层输入时间序列映射到150特性传递到下一层。指定两个类,包括一个完全连接大小为2层,其次是softmax层和一层分类。

层= [sequenceInputLayer numFeatures bilstmLayer(150年“OutputMode”,“序列”)bilstmLayer (150,“OutputMode”,“序列”)fullyConnectedLayer (2) softmaxLayer classificationLayer];

定义培训的选项

指定分类器训练选项。集MaxEpochs10所以网络使10通过训练数据。集MiniBatchSize64年所以网络看着64训练信号。集情节“训练进步”生成块显示培训进展随着迭代次数的增加。集详细的禁用打印表输出对应于图中所示的数据。集洗牌“every-epoch”洗牌训练序列,每一个时代的开始。集LearnRateSchedule“分段”减少指定的学习速率的因素(0.1)每次一定数量的时代(5)已经过去了。集ValidationData验证预测和目标。

下面的例子使用了自适应时刻估计(亚当)解算器。亚当与复发性神经网络性能更好(RNNs)像LSTMs比默认随机梯度下降势头(个)解算器。

maxEpochs = 10;miniBatchSize = 64;选择= trainingOptions (“亚当”,“InitialLearnRate”1的军医,“MaxEpochs”maxEpochs,“MiniBatchSize”miniBatchSize,“洗牌”,“every-epoch”,“详细”假的,“ValidationFrequency”、地板(元素个数(TrainingFeatures) / miniBatchSize),“ValidationData”,BaselineV} {FeaturesValidationClean。”“阴谋”,“训练进步”,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”5);

火车LSTM网络

火车与指定的培训选项LSTM网络和层体系结构使用trainNetwork(深度学习工具箱)。因为训练集很大,培训过程可能需要几分钟时间。

[keywordNetNoAugmentation, netInfo] = trainNetwork (TrainingFeatures、TrainingMasks层,选择);

如果reduceDataset加载(fullfile (netFolder“keywordNetNoAugmentation.mat”),“keywordNetNoAugmentation”,“米”,“年代”);结束

检查网络精度验证无噪声的信号

估计KWS面具验证信号使用训练网络。

v =分类(keywordNetNoAugmentation FeaturesValidationClean。');

计算和绘制验证混淆矩阵向量的实际和估计标签。

图厘米= confusionchart (BaselineV v,“标题”,“验证准确性”);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;

网络分类的输出转换成双。

v =双(v) - 1;v = repmat (v HopLength 1);v = (,);

听关键字被网络领域。

声音(audioIn(逻辑(v)), fs)

可视化和预期估计KWS面具。

基线=双(BaselineV) - 1;基线= repmat(基线HopLength 1);基线=基线(:);t = (1 / fs) *(0:长度(v) 1);无花果=图;情节(t) [audioIn(1:长度(v)), v, 0.8 *基线])网格包含(“时间(s)”)传说(“训练信号”,“网络掩码”,“基线面具”,“位置”,“东南”)l = findall(图,“类型”,“行”);l (1)。线宽= 2;l (2)。线宽= 2;标题(“结果无噪声的演讲》)

检查网络精度的确认信号

现在,您可以检查网络噪声语音信号的准确性。噪声信号通过腐蚀清洁验证加性高斯白噪声信号。

加载噪声信号。

[audioInNoisy, fs] = audioread (fullfile (netFolder,“NoisyKeywordSpeech-16-16-mono-34secs.flac”));声音(audioInNoisy fs)

可视化的信号。

图t = (1 / fs) *(0:长度(audioInNoisy) 1);情节(t, audioInNoisy)网格包含(“时间(s)”)标题(嘈杂的验证语音信号的)

信号从噪声中提取特征矩阵。

audioInNoisy featureMatrixV =提取(afe);featureMatrixV (~ isfinite (featureMatrixV)) = 0;FeaturesValidationNoisy = (featureMatrixV - M)。/ S;

通过网络的特征矩阵。

v =分类(keywordNetNoAugmentation FeaturesValidationNoisy。');

比较网络输出到基线。注意精度低于一个你有一个干净的信号。

图厘米= confusionchart (BaselineV v,“标题”,“验证准确性,嘈杂的演讲》);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;

网络分类的输出转换成双。

v =双(v) - 1;v = repmat (v HopLength 1);v = (,);

听关键字被网络领域。

声音(audioIn(逻辑(v)), fs)

可视化和基线估计面具。

t = (1 / fs) *(0:长度(v) 1);无花果=图;情节(t) [audioInNoisy(1:长度(v)), v, 0.8 *基线])网格包含(“时间(s)”)传说(“训练信号”,“网络掩码”,“基线面具”,“位置”,“东南”)l = findall(图,“类型”,“行”);l (1)。线宽= 2;l (2)。线宽= 2;标题(结果吵的演说——没有数据增加的)

执行数据增加

经过训练的网络没有执行在一个嘈杂的信号,因为训练数据集只包含无噪声的句子。你会改变通过增加数据集包括嘈杂的句子。

使用audioDataAugmenter增加你的数据集。

ada = audioDataAugmenter (“TimeStretchProbability”0,“PitchShiftProbability”0,“VolumeControlProbability”0,“TimeShiftProbability”0,“SNRRange”[1],“AddNoiseProbability”,0.85);

与这些设置audioDataAugmenter反对腐败的输入音频信号与高斯白噪声的概率为85%。信噪比是随机选择的范围[1](dB)。有15%的概率增量不修改您的输入信号。

作为一个例子,通过增压器的音频信号。

重置(ads_keyword) x =阅读(ads_keyword);data =增加(ada, x, fs)
data =1×2表音频AugmentationInfo ___________ ___________{16000×1双}(1×1结构)

检查AugmentationInfo变量数据验证信号是如何修改的。

data.AugmentationInfo
ans =结构体字段:信噪比:0.3410

重置数据存储。

重置(ads_keyword)重置(ads_other)

初始化功能和面具细胞。

TrainingFeatures = {};TrainingMasks = {};

再次进行特征提取。每个带噪信号的概率为85%,所以你的增广数据集有大约85%噪声数据和15%无噪声的数据。

抽搐parfor2 = 1:numPartitions subads_keyword =分区(ads_keyword、numPartitions ii);subads_other =分区(ads_other、numPartitions ii);数= 1;localFeatures =细胞(长度(subads_keyword.Files), 1);localMasks =细胞(长度(subads_keyword.Files), 1);hasdata (subads_keyword)(句子,面具)= HelperSynthesizeSentence (subads_keyword subads_other, fs, WindowLength);%的腐败与噪声augmentedData =增加(ada、句子、fs);句子= augmentedData.Audio {1};%计算mfcc特征featureMatrix =提取(afe,句子);featureMatrix (~ isfinite (featureMatrix)) = 0;hopLength = WindowLength - OverlapLength;范围= hopLength *(1:尺寸(featureMatrix, 1)) + hopLength;featureMask = 0(大小(范围);指数= 1:元素个数(范围)featureMask(指数)=模式(面具((索引1)* hopLength + 1:(索引1)* hopLength + WindowLength));结束localFeatures{数}= featureMatrix;localMasks{数}= [emptyCategories,直言(featureMask)];数=计数+ 1;结束TrainingFeatures = [TrainingFeatures; localFeatures];TrainingMasks = [TrainingMasks; localMasks];结束流(的训练特征提取了% f秒。\ n 'toc)
训练特征提取了36.090923秒。

计算每个系数的平均值和标准偏差;使用它们来规范化数据。

sampleFeature = TrainingFeatures {1};numFeatures =大小(sampleFeature, 2);featuresMatrix =猫(1,TrainingFeatures {:});如果reduceDataset加载(fullfile (netFolder“KWSNet.mat”),“KWSNet”,“米”,“年代”);其他的M =意味着(featuresMatrix);S =性病(featuresMatrix);结束指数= 1:长度(TrainingFeatures) f = TrainingFeatures{指数};f = (f - M)。/ S;TrainingFeatures{指数}= f。';% #好吧结束

验证功能正常化与新平均值和标准偏差值。

FeaturesValidationNoisy = (featureMatrixV - M)。/ S;

训练网络与增广数据集

重建培训选项。使用噪声基线特征和掩码进行验证。

选择= trainingOptions (“亚当”,“InitialLearnRate”1的军医,“MaxEpochs”maxEpochs,“MiniBatchSize”miniBatchSize,“洗牌”,“every-epoch”,“详细”假的,“ValidationFrequency”、地板(元素个数(TrainingFeatures) / miniBatchSize),“ValidationData”,BaselineV} {FeaturesValidationNoisy。”“阴谋”,“训练进步”,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”5);

培训网络。

[KWSNet, netInfo] = trainNetwork (TrainingFeatures、TrainingMasks层,选择);

如果reduceDataset加载(fullfile (netFolder“KWSNet.mat”));结束

验证网络精度验证信号。

v =分类(KWSNet FeaturesValidationNoisy。');

比较估计和预期KWS面具。

图厘米= confusionchart (BaselineV v,“标题”,“数据增加验证准确性”);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;

听所确定的关键字。

v =双(v) - 1;v = repmat (v HopLength 1);v = (,);声音(audioIn(逻辑(v)), fs)

可视化估计和预期的面具。

无花果=图;情节(t) [audioInNoisy(1:长度(v)), v, 0.8 *基线])网格包含(“时间(s)”)传说(“训练信号”,“网络掩码”,“基线面具”,“位置”,“东南”)l = findall(图,“类型”,“行”);l (1)。线宽= 2;l (2)。线宽= 2;标题(结果吵的演讲——数据增加的)

引用

[1]监狱长P。“语音命令:一个公共数据集单字原图语音识别”,2017。可以从https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz。版权2017年谷歌。语音命令数据集是创作共用署名4.0许可下的。

附录-辅助函数

函数(句子,面具)= HelperSynthesizeSentence (ads_keyword ads_other, fs,最小长度)%读一个关键字关键词=阅读(ads_keyword);关键词=关键字。/ max (abs(关键字));%识别感兴趣的地区speechIndices = detectSpeech(关键字、fs);如果isempty (speechIndices) | | diff (speechIndices(1:)) < =最小长度speechIndices =[1,长度(关键字)];结束关键词=关键字(speechIndices (1,1): speechIndices (1、2);句话说%选择一个随机数字(0 - 10)numWords =兰迪([0 10]);%选择插入的关键字loc =兰迪([1 numWords + 1]);句子= [];掩码= [];指数= 1:numWords + 1如果指数= = loc句子=(句子;关键字);newMask = 1(大小(关键字));掩码=[面具;newMask];其他的其他=阅读(ads_other);其他=。/ max (abs(其他));句子=(句子,其他);掩码=[面具;0(大小(其他))];结束结束结束