主要内容

使用MFCC和LSTM网络在噪声中发现的关键字

此示例显示如何使用深度学习网络识别嘈杂语音中的关键字。特别地,该示例使用双向长期短期存储器(BILSTM)网络和MEL频率谱系数(MFCC)。

介绍

关键字识别(KWS)是语音辅助技术的一个重要组成部分,用户在向设备说出完整的命令或查询之前先说出预定义的关键字来唤醒系统。

该示例使用mel频率倒谱系数(MFCC)的特征序列训练KWS深度网络。该示例还演示了如何使用数据扩充来提高噪声环境中的网络精度。

该示例使用长期内存(LSTM)网络,这些网络是一种经常性的神经网络(RNN)非常适合研究序列和时间序列数据。LSTM网络可以在序列的时间步长之间学习长期依赖性。LSTM层(lstmLayer(深度学习工具箱))可以向前方向查看时间序列,而双向LSTM层(双层膜(深度学习工具箱))可以从正反两个方向看时间序列。这个例子使用了一个双向LSTM层。

本例使用google Speech Commands数据集来训练深度学习模型。要运行本例,必须先下载数据集。如果不想下载数据集或训练网络,则可以通过在MATLAB®中打开本例并运行本例第3-10行来下载并使用预训练网络。

Spot关键字与预先训练的网络

在详细介绍培训过程之前,您将下载并使用预培训的关键字识别网络来识别关键字。

在本例中,要定位的关键字是是的

读取关键字发出的测试信号。

[audioIn, fs] = audioread('关键字TestSignal.wav');声音(AudioIn,FS)

下载并加载预训练网络、用于特征规范化的平均值(M)和标准偏差(S)向量,以及用于在本例后面验证网络的2个音频文件。

url =“http://ssd.mathworks.com/万博1manbetxsupportfiles/audio/KeywordSpotting.zip”;downloadNetFolder = tempdir;netFolder = fullfile (downloadNetFolder,'关键字');如果〜存在(NetFolder,'dir')disp('下载预训练的网络和音频文件(4个文件-7 MB)…'解压缩(url, downloadNetFolder)结尾负载(fullfile (netFolder“KWSNet.mat”));

创建一个audiofeatureextractor.对象执行功能提取。

WindowLength = 512;OverlapLength = 384;AFE = audiofeatureextractor(“SampleRate”,fs,...“窗口”损害(WindowLength'定期'),...“OverlapLength”,重叠长度,...“mfcc”,真的,...'mfccdelta', 真的,...“mfccDeltaDelta”,真正的);

从测试信号中提取特征并使它们归一化。

特点=提取物(AFE,AUDION);特征=(特点 -  m)./ s;

计算关键字拍摄二进制掩码。掩码值对应于发现关键字的段。

掩码=分类(KWSNet,特征');

掩码中的每个样本对应于来自语音信号的128个样本(WindowLength.-OverlapLength)。

将掩码展开到信号的长度。

mask = repmat(mask, WindowLength-OverlapLength, 1);Mask = double(Mask) - 1;掩码=面具(:);

绘制测试信号和掩模。

figure audioIn = audioIn(1:长度(掩码));t =(0:长度(audioIn) 1) / fs;情节(t, audioIn)网格在…上抓住在…上绘图(T,掩码)传奇(“演讲”'是的'

收听斑点关键字。

声音(AudioIn(Mask == 1),FS)

使用来自麦克风的流音频检测命令

在从麦克风上测试您的预先培训的命令检测网络。尝试说随机单词,包括关键字(是的)。

调用generatematlabfunction.在这一点audiofeatureextractor.对象创建特征提取函数。您将在处理循环中使用此函数。

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,...'陈旧',真的,...'ChannelNames',{“演讲”“关键字掩码”},...'ylimits',[-1.2 1.2],...'标题''关键字');

定义估计掩码的速率。您将每次生成一次掩码NumHopsPerUpdate音频帧。

NumHopsPerUpdate = 16;

初始化音频的缓冲区。

databuff = dsp.asyncbuffer(windowlength);

初始化计算特征的缓冲区。

featurebuff = dsp.asyncuffer(numhopsperupdate);

初始化缓冲区以管理音频和掩码的绘图。

plotbuff = dsp.asyncbuffer(numhopsperupdate * windowlength);

无限期地运行循环,将timelimit设置为INF..要停止模拟,请关闭范围。

timelimit = 20;Tic.尽管toc 如果featureBuff.NumUnreadSamples==NumHopsPerUpdate featureMatrix=read(featureBuff);featureMatrix(~isfinite(featureMatrix))=0;featureMatrix=(featureMatrix-M)。/S;[keywordNet,v]=classifyAndUpdateState(KWSNet,featureMatrix.');v=double(v)-1;v=repmat(v,HopLength,1);v=v(:);v=mode(v);v=repmat(v,NumHopsPerUpdate*HopLength,1);数据=读取(plotBuff);范围([data,v]);如果~isVisible(范围)休息结尾结尾结尾隐藏(范围)

在示例的其余部分中,您将学习如何训练关键字识别网络。

培训过程总结

培训过程包括以下几个步骤:

  1. 检查验证信号上的“黄金标准”关键字检测基线。

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

  3. 使用从这些话语中提取的MFCC序列列出关键字LSTM网络。

  4. 当应用到验证信号时,通过比较验证基线和网络输出来检查网络的准确性。

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

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

  7. 使用增强的数据集对网络进行再培训。

  8. 验证重新训练的网络在应用于有噪声的验证信号时现在产生更高的精度。

检查验证信号

您使用示例语音信号来验证KWS网络。验证信号包含34秒的语音与关键字是的间歇性地出现。

加载验证信号。

[isaimin,fs] = audioread(fullfile(netfolder,'关键词-16-16-mono-34secs.flac'));

听信号。

声音(AudioIn,FS)

可视化信号。

图t = (1/fs) * (0:length(audioIn)-1);情节(t, audioIn);网格在…上包含('时间'')标题('验证语音信号'

检查KWS基线

加载KWS基线。使用此基线使用speech2text使用音频标签创建关键字识别掩码

负载('kwsbaseline.mat''kwsbaseline'

基线是与验证音频信号长度相同的逻辑向量。段在audioIn其中关键字被设置为一个在kwsbaseline.

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

无花果=图;情节(t [audioIn KWSBaseline '])网格在…上包含('时间'')传说(“演讲”'kws baseline'“位置”“东南”)l = findall(图,'类型'“行”);L(1).LineWidth = 2;标题(“验证信号”

聆听标识为关键字的语音段。

声音(audioIn (KWSBaseline)、fs)

你训练的网络的目标是输出一个0和1的KWS掩码,就像这个基线。

加载语音命令数据集

下载并提取Google语音命令数据集[1]

url ='https://ssd.mathwands.com/万博1manbetxsupportfiles/audio/google_speech.zip';downloadfolder = tempdir;datasetfolder = fullfile(DownloadFolder,“google_speech”);如果~exist(datasetFolder,'dir')disp('下载谷歌语音命令数据集(1.5 GB)......')解压缩(URL,DataSetFolder)结尾

创建一个audiodatastore.这指向数据集。

广告= audiodataStore(DataSetFolder,“标签源”'文件夹名称'“包含子文件夹”,真正的);广告= Shuffle(广告);

数据集包含本示例中未使用的背景噪声文件。用子集创建一个没有背景噪声文件的新数据存储。

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

该数据集有大约65,000个一秒长的话语,包含30个短单词(包括关键字YES)。获取数据存储中单词分布的分解。

CountAckeLabel(广告)
ans =30×2表标签数_____ _____床1713鸟1731猫1733狗1746狗1746下来2359八2352五2357四零字2372 Go 2372 Happy 1742 House 1750左2353 Marvin 1746九2364⋮

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

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

要将网络与整个数据集一起培训并达到最高的准确性,请设置还原酶错误的.快速运行此示例,设置还原酶真的

DEFERATASET =错误的如果还原酶%将数据集减少20倍ads_keyword = spliteachLabel(ADS_KEYWORD,ROUND(NUMER(ADS_KEYWORD.FILES)/ 20)));numuniqueLabels = numel(唯一(ads_other.labels));Ads_other = splitheachlabel(Ads_other,round(numel(ads_other.files)/ numuniqueLabels / 20));结尾

获取每个数据存储中单词分布的明细ads_other数据存储区使连续读取返回不同的单词。

countEachLabel (ads_keyword)
ans =1×2表标签数_____ _____是2377
CountAckeLabel(Ads_other)
ans =29×2表标签数_____ _____床1713鸟1731猫1733狗1746狗1746下来2359八2352五2357四零字2372 Go 2372 Happy 1742 House 1750左2353 Marvin 1746九2364⋮
Ads_other = Shuffle(Ads_other);

创建培训句子和标签

训练数据存储包含一秒语音信号,其中发出一个单词。您将创建更复杂的训练语音,其中包含关键字和其他单词的混合。

下面是一个构造语句的示例。从关键字数据存储中读取一个关键字,并将其规格化为最大值1。

是=读(ADS_KEYWORD);是=是/最大值(ABS(是));

信号具有不包含有用语音信息的非语音部分(静音、背景噪音等)。此示例使用检测

获取信号中有用部分的开始和结束索引。

语音indices =检测echech(是,FS);

随机选择要在合成培训句中使用的单词数。最多使用10个单词。

numWords = randi([0 10]);

随机选择关键字出现的位置。

关键字位置= randi([1 numWords+1]);

阅读所需数量的非关键字话语,并构建训练句和掩码。

句子= [];面具= [];为了index = 1:numwords + 1如果索引==关键字位置句子=[句子;是];% #好吧newmask = zeros(尺寸(是));NewMask(语音indices(1,1):语言indices(1,2))= 1;面具= [蒙面; newmask];% #好吧别的其他=阅读(ads_其他);其他=其他。/max(abs(其他));句子=[句子;其他];% #好吧面具= [掩码;零(尺寸(其他))];% #好吧结尾结尾

与面具一起绘制训练句。

图t =(1 / fs)*(0:长度(句子)-1);无花果=图;绘图(t,[句子,掩码])网格在…上包含('时间'')传说(“训练信号”'面具'“位置”“东南”)l = findall(图,'类型'“行”);L(1).LineWidth = 2;标题(“范例话语”

听取训练判决。

声音(句子,fs)

提取特征

本实施例中使用训练39个MFCC系数(13 MFCC,13增量和13Δ-增量系数)深学习网络。

定义MFCC提取所需的参数。

WindowLength = 512;OverlapLength = 384;

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

AFE = audiofeatureextractor(“SampleRate”,fs,...“窗口”损害(WindowLength'定期'),...“OverlapLength”,重叠长度,...“mfcc”,真的,...'mfccdelta',真的,...“mfccDeltaDelta”,真正的);

提取功能。

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

请注意,通过输入窗口通过输入来计算MFCC,因此特征矩阵短于输入语音信号。每一行Featurematrix.对应于来自语音信号的128个样本(WindowLength.-OverlapLength)。

计算相同长度的掩码Featurematrix.

HopLength = WindowLength - OverlapLength;Range = HopLength *(1:尺寸(Featurematrix,1))+ HopLength;Featuremask = Zeros(尺寸(范围));为了index = 1:numel(range) featureMask(index) = mode(mask((index-1)*HopLength+1:(index-1)*HopLength+WindowLength));结尾

从训练数据集中提取特征

整个训练数据集的句子合成和特征提取可以非常耗时。要加快处理,如果您有并行计算工具箱™,分区训练数据存储,并在单独的工作者上处理每个分区。

选择多个数据存储分区。

numPartitions = 6;

初始化特征矩阵和掩模的单元格数组。

TrainingFeatures = {};trainingmasks = {};

执行句子合成,特征提取和使用掩码议案

emptyCategories=分类([10]);emptyCategories(:)=[];tic议案ii = 1:numPartitions subads_keyword = partition(ads_keyword,numPartitions,ii);subads_other =分区(ads_other、numPartitions ii);数= 1;localFeatures =细胞(长度(subads_keyword.Files), 1);localMasks =细胞(长度(subads_keyword.Files), 1);尽管hasdata (subads_keyword)创造一个训练句子[句子,掩码] = alpersynthesizeentence(subads_keyword,subads_other,fs,windowlength);%计算mfcc特性特征矩阵=提取(afe,句子);featureMatrix (~ isfinite (featureMatrix)) = 0;%创建面具hopLength = WindowLength - OverlapLength;Range =(HopLength)*(1:尺寸(Featurematrix,1))+ HopLength;Featuremask = Zeros(尺寸(范围));为了index = 1:numel(range) featureMask(index) = mode(mask((index-1)*hopLength+1:(index-1)*hopLength+WindowLength));结尾localfeatures {count} = featurematrix;localmasks {count} = [空分类,分类(featuremask)];count = count + 1;结尾TrainingFeatures = [TrainingFeatures; localFeatures];TrainingMasks = [TrainingMasks; localMasks];结尾fprintf('训练功能提取花费了%f秒。\n',TOC)
培训特征提取花了33.656404秒。

良好的做法是,正常化所有功能都具有零均值和单位标准偏差。计算每个系数的平均值和标准偏差,并使用它们来标准化数据。

SampleFeature = TrainingFeatures {1};numfeatures =尺寸(样品种,2);特点rix =猫(1,培训方法{:});如果reduceDataset加载(fullfile (netFolder'contendnetnougmentation.mat'),“keywordNetNoAugmentation”'M'');别的m =均值(特点atrix);s = std(特点atrix);结尾为了索引= 1:长度(训练方法)f =培训方法{指数};f =(f-m)./ s;TrainingFeatures {index} = f。';% #好吧结尾

提取验证功能

从验证信号中提取MFCC功能。

featurematrix =提取物(afe,audioin);featureMatrix (~ isfinite (featureMatrix)) = 0;

规范化验证特性。

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

构建验证KWS掩码。

Featuremask = Zeros(尺寸(范围));为了索引= 1:numel(range) featureMask(index) = mode(KWSBaseline((index-1)*HopLength+1:(index-1)*HopLength+WindowLength));结尾BaselineV =分类(featureMask);

定义LSTM网络架构

LSTM网络可以学习序列数据的时间步长之间的长期依赖关系。此示例使用双向LSTM层双层膜(深度学习工具箱)查看向前和向后方向的序列。

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

层= [...sequenceInputLayer numFeatures bilstmLayer(150年“输出模式”“顺序”)Bilstmlayer(150,“输出模式”“顺序”) fulllyconnectedlayer (2) softmaxLayer classificationLayer];

定义培训选项

指定分类器的训练选项。放MaxEpochs到10,以便网络使10通过培训数据。放小匹匹匹匹配64因此,网络一次看64个训练信号。放情节“训练进步”生成随着迭代次数增加而显示训练进度的图。放verb错误的禁用打印与图中显示的数据相对应的表输出。放洗牌“every-epoch”在每个纪元开始时打乱训练顺序。放学习进度表“分段”每次通过一定数量的时期(5)都通过指定因子(0.1),减少了学习率。放验证数据验证预测器和目标。

本例使用自适应矩估计(ADAM)求解器。ADAM在lstm这样的递归神经网络(RNNs)中比默认的SGDM (SGDM)求解器表现更好。

Maxepochs = 10;minibatchsize = 64;选项=培训选项(“亚当”...“InitialLearnRate”,1e-4,...“MaxEpochs”,maxEpochs,...“迷你atchsize”miniBatchSize,...“洗牌”“every-epoch”...“verbose”,错,...“ValidationFrequency”,地板(Numel(训练训练)/小匹匹匹匹配),...“validationdata”, BaselineV} {FeaturesValidationClean。”...“情节”“训练进步”...“LearnRateSchedule”“分段”...“学习ropfactor”,0.1,...“LearnRateDropPeriod”5);

培训LSTM网络

使用指定的培训选项和图层架构列车LSTM网络使用Trainnetwork.(深度学习工具箱).因为训练集很大,培训过程可能需要几分钟。

[KeywordNetNoAguation,netInfo]=培训网络(培训功能、培训掩码、层、选项);

如果reduceDataset加载(fullfile (netFolder'contendnetnougmentation.mat'),“keywordNetNoAugmentation”'M'');结尾

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

使用经过训练的网络估计验证信号的KWS掩码。

v =分类(keywordNetNoAugmentation FeaturesValidationClean。');

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

figure cm = confusionchart(BaselineV,v,“标题”“验证准确性”);cm.columnsummary =“列标准化”;cm.rowsummary =“row-normalized”

将网络输出从分类转换为双倍。

v =双(v) -  1;v = repmat(v,hoplength,1);v = v(:);

侦听网络标识的关键字区域。

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

可视化估计和预期的KWS掩码。

基线=double(BaselineV)-1;基线=repmat(基线,HopLength,1);基线=baseline(:);t=(1/fs)*(0:length(v)-1);图=图形;绘图(t,[audioIn(1:length(v)),v,0.8*基线])网格在…上包含('时间'')传说(“训练信号”“网络掩码”'基线面膜'“位置”“东南”)l = findall(图,'类型'“行”);L(1).LineWidth = 2;L(2).LineWidth = 2;标题(“无噪音言论测试结果”

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

现在,您将检查噪声语音信号的网络精度。噪声信号是通过加性高斯白噪声破坏干净的验证信号获得的。

加载嘈杂的信号。

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

可视化信号。

图t = (1/fs) * (0:length(audioInNoisy)-1);情节(t, audioInNoisy)网格在…上包含('时间'')标题('嘈杂的验证语音信号'

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

featureMatrixV = extract(afe, audioInNoisy);featureMatrixV (~ isfinite (featureMatrixV)) = 0;FeaturesValidationNoisy = (featureMatrixV - M)./S;

将特征矩阵传递给网络。

v =分类(ContentyNetNoUgmentation,CompanyValidationNoisy。');

将网络输出与基线进行比较。注意,精度低于你得到一个干净的信号。

figure cm = confusionchart(BaselineV,v,“标题”“验证准确性 - 嘈杂的演讲”);cm.columnsummary =“列标准化”;cm.rowsummary =“row-normalized”

将网络输出从分类转换为双倍。

v =双(v) -  1;v = repmat(v,hoplength,1);v = v(:);

侦听网络标识的关键字区域。

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

可视化估计和基线掩模。

t =(1 / fs)*(0:长度(v)-1);无花果=图;绘图(t,[AudioInnoisy(1:长度(v)),v,0.8 *基线]网格在…上包含('时间'')传说(“训练信号”“网络掩码”'基线面膜'“位置”“东南”)l = findall(图,'类型'“行”);L(1).LineWidth = 2;L(2).LineWidth = 2;标题('嘈杂的演讲结果 - 没有数据增强'

执行数据增强

训练有素的网络在嘈杂的信号上表现不佳,因为训练有素的数据集仅包含无噪音句子。您将通过增强数据集来纠正此问题以包含嘈杂的句子。

audioDataAugmenter以扩充数据集。

ada=音频数据增强器('timestretchprobability'0,...“变桨可能性”0,...“VolumeControlProbability”0,...“TimeShiftProbability”0,...'snrrange'[1],...'addnoiseprobability', 0.85);

使用这些设置,audioDataAugmenter对象破坏了具有85%概率的白色高斯噪声的输入音频信号。SNR从范围[-1 1](dB中)随机选择。增强器不会修改输入信号,有15%的概率。

例如,将音频信号传递给增益器。

重置(ads_关键字)x=读取(ads_关键字);数据=增加(ada,x,fs)
数据=1×2表音频AugmentationInfo  ________________ ________________ { 16000×1双}(1×1结构)

检查增强信息变量数据验证信号如何修改。

data.augmentationInfo.
ans =.结构与字段:SNR:0.3410

重置数据存储。

重置(ads_keyword)重置(ads_other)

初始化功能和掩码单元格。

TrainingFeatures = {};trainingmasks = {};

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

Tic.议案ii = 1:numPartitions subads_keyword = partition(ads_keyword,numPartitions,ii);subads_other =分区(ads_other、numPartitions ii);数= 1;localFeatures =细胞(长度(subads_keyword.Files), 1);localMasks =细胞(长度(subads_keyword.Files), 1);尽管hasdata(subads_keyword)[句子,mask] = alpersynthesizeentence(subads_keyword,subads_other,fs,windowlength);%噪音污染AugmentedData = Augment(ADA,句子,FS);句子= upmenteddata.audio {1};%计算mfcc特性特征矩阵=提取(afe,句子);featureMatrix (~ isfinite (featureMatrix)) = 0;hopLength = WindowLength - OverlapLength;range = hopLength * (1:size(featureMatrix,1)) + hopLength;Featuremask = Zeros(尺寸(范围));为了index = 1:numel(range) featureMask(index) = mode(mask((index-1)*hopLength+1:(index-1)*hopLength+WindowLength));结尾localfeatures {count} = featurematrix;localmasks {count} = [空分类,分类(featuremask)];count = count + 1;结尾TrainingFeatures = [TrainingFeatures; localFeatures];TrainingMasks = [TrainingMasks; localMasks];结尾fprintf('训练功能提取花费了%f秒。\n',TOC)
训练特征提取花了36.090923秒。

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

SampleFeature = TrainingFeatures {1};numfeatures =尺寸(样品种,2);特点rix =猫(1,培训方法{:});如果reduceDataset加载(fullfile (netFolder“KWSNet.mat”),“KWSNet”'M'');别的m =均值(特点atrix);s = std(特点atrix);结尾为了索引= 1:长度(训练方法)f =培训方法{指数};f =(f-m)./ s;TrainingFeatures {index} = f。';% #好吧结尾

用新的平均值和标准差值对验证特征进行归一化。

FeaturesValidationNoisy = (featureMatrixV - M)./S;

用增强数据集重新培训网络

重新创建培训选择。使用Noisy Baseline功能和掩码进行验证。

选项=培训选项(“亚当”...“InitialLearnRate”,1e-4,...“MaxEpochs”,maxEpochs,...“迷你atchsize”miniBatchSize,...“洗牌”“every-epoch”...“verbose”,错,...“ValidationFrequency”,地板(Numel(训练训练)/小匹匹匹匹配),...“validationdata”,{featuresvalidationnoisy。',baseinev},...“情节”“训练进步”...“LearnRateSchedule”“分段”...“学习ropfactor”,0.1,...“LearnRateDropPeriod”5);

训练网络。

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

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

验证验证信号的网络准确性。

v =分类(KWSNet FeaturesValidationNoisy。');

比较估计和预期KWS掩码。

figure cm = confusionchart(BaselineV,v,“标题”“数据扩充的验证准确性”);cm.columnsummary =“列标准化”;cm.rowsummary =“row-normalized”

收听已识别的关键字区域。

v =双(v) -  1;v = repmat(v,hoplength,1);v = v(:);声音(AudioIn(逻辑(v)),fs)

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

无花果=图;绘图(t,[AudioInnoisy(1:长度(v)),v,0.8 *基线]网格在…上包含('时间'')传说(“训练信号”“网络掩码”'基线面膜'“位置”“东南”)l = findall(图,'类型'“行”);L(1).LineWidth = 2;L(2).LineWidth = 2;标题('嘈杂的演讲结果 - 通过数据增强'

参考

[1]监狱长P。“语音指令:单字语音识别的公共数据集”,2017。可以从https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz.版权所有Google 2017.语音命令DataSet在Creative Commons归因4.0许可下许可。

附录-辅助功能

功能[句子,掩码]=助手合成内容(ads\u关键字,ads\u其他,fs,minlength)%读取一个关键字关键词=阅读(ads_keyword);/ max(abs(关键字));%确定感兴趣的区域speechIndices = detectSpeech(关键字、fs);如果isempty(speech hindices) || diff(speech hindices (1,:)) <= minlength speech hindices = [1,length(keyword)];结尾关键词=关键字(speechIndices (1,1): speechIndices(1、2);%挑选一个随机数量的单词(0到10之间)numWords = randi([0 10]);%选择插入关键字的位置loc = randi([1 num字+ 1]);句子= [];面具= [];为了index = 1:numwords + 1如果索引==loc句子=[句子;关键字];newMask = 1(大小(关键字));mask = [mask;newMask];别的其他=阅读(ads_其他);其他=其他。/max(abs(其他));句子=[句子;其他];面具= [掩码;零(尺寸(其他))];结尾结尾结尾