主要内容

基于MFCC和LSTM网络的噪声关键字发现

这个例子展示了如何使用深度学习网络识别嘈杂语音中的关键字。特别地,该示例使用了双向长短期记忆(BiLSTM)网络和mel频率倒谱系数(MFCC)。

简介

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

这个例子训练了一个具有梅尔频率倒谱系数(MFCC)特征序列的KWS深度网络。该示例还演示了如何使用数据增强来提高噪声环境中的网络精度。

本例使用长短期记忆(LSTM)网络,它是一种循环神经网络(RNN),非常适合研究序列和时间序列数据。LSTM网络可以学习序列时间步长之间的长期依赖关系。LSTM层(lstmLayer(深度学习工具箱))可以向前看时间序列,而双向LSTM层(bilstmLayer(深度学习工具箱))可以从正反两个方向查看时间序列。本例使用双向LSTM层。

本例使用谷歌语音命令数据集来训练深度学习模型。要运行该示例,必须首先下载数据集。如果您不想下载数据集或训练网络,那么您可以下载并使用预先训练好的网络,方法是在MATLAB®中打开此示例并运行现场关键字与预训练网络部分。

现场关键字与预训练网络

在详细进入训练过程之前,您将下载并使用预先训练好的关键字发现网络来识别关键字。

在本例中,要查找的关键字是是的

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

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

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

downloadFolder = matlab.internal.examples.download万博1manbetxSupportFile(“音频”“KeywordSpotting.zip”);dataFolder = tempdir;unzip(下载文件夹,数据文件夹)netFolder = fullfile(数据文件夹,数据文件夹)“KeywordSpotting”);负载(fullfile (netFolder“KWSNet.mat”));

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

windowLength = 512;overlapLength = 384;afe = audioFeatureExtractor(SampleRate=fs,...窗口=损害(windowLength,“周期”), OverlapLength = OverlapLength,...mfcc = true, mfccDelta = true, mfccDeltaDelta = true);

从测试信号中提取特征并将其归一化。

features = extract(afe,audioIn);features = (features - M)./S;

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

mask = category (KWSNet,features.');

掩码中的每个样本对应于语音信号中的128个样本(windowLength-overlapLength).

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

mask = repmat(mask,windowLength-overlapLength,1);Mask = double(Mask) - 1;掩码=掩码(:);

画出测试信号和掩模。

figure audioIn = audioIn(1:长度(掩码));t = (0:length(audioIn)-1)/fs;情节(t, audioIn)网格持有情节(t,面具)图例(“演讲”“是的”)

听发现的关键字。

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

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

在麦克风的流音频上测试预先训练好的命令检测网络。试着说一些随机的单词,包括关键词(是的).

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

generateMATLABFunction (afe“generateKeywordFeatures”, IsStreaming = true);

定义一个可以从麦克风读取音频的音频设备阅读器。设置帧长为跳长。这使您能够为来自麦克风的每个新音频帧计算一组新的特征。

hopLength = windowLength - overlapLength;framength = hopLength;adr = audioDeviceReader(SampleRate=fs,SamplesPerFrame=frameLength);

创建一个范围来可视化语音信号和估计的掩码。

scope = timescope(SampleRate=fs,...TimeSpanSource =“财产”...时间间隔= 5,...TimeSpanOverrunAction =“滚动”...BufferLength = f * 5 * 2,...ShowLegend = true,...ChannelNames = {“演讲”“关键词面具”},...YLimits = [-1.2, 1.2],...Title =“关键字定位”);

定义估计掩码的速率。你将每次生成一个蒙版numHopsPerUpdate音频帧。

numHopsPerUpdate = 16;

初始化音频缓冲区。

dataBuff = dsp.AsyncBuffer(windowLength);

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

featureBuff = dsp.AsyncBuffer(numHopsPerUpdate);

初始化一个缓冲区来管理音频和掩码的绘制。

plotBuff = dsp.AsyncBuffer(numHopsPerUpdate*windowLength);

要无限期地运行循环,请将timeLimit设置为。若要停止模拟,请关闭作用域。

timeLimit = 20;抽搐toc < timeLimit data = adr();写(dataBuff、数据);写(plotBuff、数据);frame = read(dataBuff,windowLength,overlapLength);features = generateKeywordFeatures(帧,fs);写(featureBuff特性。');如果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 =模态(V);v = repmat(v,numHopsPerUpdate*hopLength,1); data = read(plotBuff); scope([data,v]);如果~ isVisible(范围)打破结束结束结束隐藏(范围)

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

培训流程总结

培训过程分为以下几个步骤:

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

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

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

  4. 通过将验证基线与应用于验证信号时的网络输出进行比较,检查网络的准确性。

  5. 检查网络准确性,确认信号被噪声损坏。

  6. 通过向语音数据中注入噪声来增强训练数据集audioDataAugmenter

  7. 使用增强数据集重新训练网络。

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

检查验证信号

您使用一个示例语音信号来验证KWS网络。验证信号由34秒的关键字语音组成是的出现间歇性。

加载验证信号。

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

听信号。

声音(audioIn fs)

想象这个信号。

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

检查KWS基线

加载KWS基线。该基线是使用speech2text而且信号贴标签机。相关示例请参见在语音信号中标注口语

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

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

将语音信号与KWS基线一起可视化。

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

听识别为关键字的语音片段。

声音(audioIn (KWSBaseline)、fs)

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

加载语音命令数据集

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

downloadFolder = matlab.internal.examples.download万博1manbetxSupportFile(“音频”“google_speech.zip”);dataFolder = tempdir;unzip(下载文件夹,数据文件夹)dataset = fullfile(数据文件夹,数据文件夹)“google_speech”);

创建一个audioDatastore这就指向了数据集。

ads = audioDatastore(数据集,LabelSource=“foldername”, Includesubfolders = true);广告= shuffle(广告);

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

isbackknoise = ismember(广告。标签,“背景”);广告=子集(广告,~isBackNoise);

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

countEachLabel(广告)
ans =30×2表标签计数______ _____床1713鸟1731猫1733狗1746下来2359八2352五2357四2372去2372快乐1742房子1750离开2353马文1746九2364没有2375掉2357的

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

关键词=“是的”;ismember(ads.Labels,关键字);adsKeyword =子集(广告,isKeyword);adsOther =子集(广告,~isKeyword);

为了用整个数据集训练网络并达到尽可能高的精度,设置speedupExample。要快速运行此示例,请设置speedupExample真正的

speedupExample =如果speedupExample将数据集减少20倍adsKeyword = splitEachLabel(adsKeyword,round(numel(adsKeyword. files)/20));numUniqueLabels = numel(唯一的(adther . labels));adsOther = splitEachLabel(adsOther,round(numel(adsOther. files)/numUniqueLabels/20));结束

获取每个数据存储中的单词分布的细目。打乱adsOther数据存储,以便连续读取返回不同的单词。

countEachLabel (adsKeyword)
ans =1×2表标签计数_____ _____是2377
countEachLabel (adsOther)
ans =29日×2表标签计数______ _____床1713鸟1731猫1733狗1746下来2359八2352五2357四2372去2372快乐1742房子1750离开2353马文1746九2364没有2375掉2357的
adsOther = shuffle(adsOther);

创建训练句子和标签

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

这里有一个构造话语的例子。从关键字数据存储中读取一个关键字,并将其规范化,使其最大值为1。

yes = read(adsKeyword);Yes = Yes /max(abs(Yes));

信号有非语音部分(静音、背景噪声等),不包含有用的语音信息。这个例子使用detectSpeech

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

speech hinices = detectSpeech(yes,fs);

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

numWords = randi([0,10]);

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

keywordLocation = randi([1,numWords+1]);

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

句子= [];掩码= [];index = 1:numWords+1如果index == keywordLocation句子=[句子;yes];% #好吧newMask = 0 (size(yes));newMask(speech hindices (1,1):speech hindices (1,2)) = 1;mask = [mask;newMask];% #好吧其他的other = read(adsOther);Other = Other ./max(abs(Other));句子=[句子;其他];% #好吧掩码=[掩码;零(大小(其他))];% #好吧结束结束

把训练句子和面具画在一起。

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

听训练句子。

声音(句子,fs)

提取的特征

这个例子使用39个MFCC系数(13个MFCC, 13个delta和13个delta-delta系数)训练深度学习网络。

定义MFCC提取所需的参数。

windowLength = 512;overlapLength = 384;

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

afe = audioFeatureExtractor(SampleRate=fs,...窗口=损害(windowLength,“周期”), OverlapLength = OverlapLength,...mfcc = true, mfccDelta = true, mfccDeltaDelta = true);

提取特征。

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

请注意,MFCC是通过在输入中滑动一个窗口来计算的,因此特征矩阵比输入语音信号短。每一行featureMatrix对应语音信号中的128个样本(windowLength-overlapLength).

计算相同长度的掩码featureMatrix

hopLength = windowLength - overlapLength;range = hopLength*(1:size(featureMatrix,1)) + hopLength;featureMask = 0(大小(范围));index = 1: number (range) featureMask(index) = mode(mask((index-1)*hopLength+1:(index-1)*hopLength+windowLength));结束

从训练数据集中提取特征

整个训练数据集的句子合成和特征提取是相当耗时的。为了加快处理速度,如果您有Parallel Computing Toolbox™,请对训练数据存储进行分区,并在单独的worker上处理每个分区。

选择多个数据存储分区。

numPartitions = 6;

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

TrainingFeatures = {};TrainingMasks = {};

执行句子合成,特征提取,和面具创建使用parfor

emptyCategories = categorical([10]);emptyCategories(:) = [];抽搐parforii = 1:numPartitions subadsKeyword = partition(adsKeyword,numPartitions,ii);subadsOther =分区(adsOther,numPartitions,ii);Count = 1;localFeatures = cell(length(subadsKeyword.Files),1);localMasks = cell(length(subadsKeyword.Files),1);hasdata (subadsKeyword)造一个训练句子[sentence,mask] = synthesizeSentence(subadsKeyword,subadsOther,fs,windowLength);计算mfcc特性featureMatrix =提取(afe,句子);featureMatrix(~isfinite(featureMatrix)) = 0;%创建掩码range = hopLength*(1:size(featureMatrix,1)) + hopLength;featureMask = 0(大小(范围));index = 1: number (range) featureMask(index) = mode(mask((index-1)*hopLength+1:(index-1)*hopLength+windowLength));结束localFeatures{count} = featureMatrix;localMasks{count} = [emptyCategories,categorical(featureMask)];Count = Count + 1;结束TrainingFeatures = [TrainingFeatures;localFeatures];TrainingMasks = [TrainingMasks;localMasks];结束
分析文件并将文件传输给工作人员…完成。
disp (“训练特征提取”+ toc +“秒”。)
训练特征提取耗时41.0509秒。

将所有特征归一化为零均值和统一标准差是很好的做法。计算每个系数的平均值和标准差,并使用它们对数据进行归一化。

sampleFeature =训练特征{1};numFeatures = size(sampleFeature,2);featuresMatrix = cat(1,TrainingFeatures{:});如果speedupExample加载(fullfile (netFolder“keywordNetNoAugmentation.mat”),“keywordNetNoAugmentation”“M”“S”);其他的M = mean(featuresMatrix);S = std(featuresMatrix);结束index = 1:length(TrainingFeatures) f = TrainingFeatures{index};f = (f - M)./S;训练特征{index} = f.';% #好吧结束

提取验证特性

从验证信号中提取MFCC特征。

featureMatrix = extract(afe, audioIn);featureMatrix(~isfinite(featureMatrix)) = 0;

规范化验证特性。

FeaturesValidationClean = (featureMatrix - M)./S;range = hopLength*(1:size(FeaturesValidationClean,1)) + hopLength;

构造验证KWS掩码。

featureMask = 0(大小(范围));index = 1: nummel (range) featureMask(index) = mode(KWSBaseline((index-1)*hopLength+1:(index-1)*hopLength+windowLength));结束BaselineV = categorical(featureMask);

定义LSTM网络体系结构

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

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

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

明确培训选择

为分类器指定训练选项。集MaxEpochs到10,让网络通过10次训练数据。集MiniBatchSize64这样网络一次就能看到64个训练信号。集情节“训练进步”生成随迭代次数增加而显示训练进度的图。集详细的禁用打印与图中显示的数据相对应的表输出。集洗牌“every-epoch”在每个纪元开始时重新洗牌训练序列。集LearnRateSchedule“分段”每次经过一定数量的epoch(5)时,将学习率降低指定的因子(0.1)。集ValidationData到验证预测器和目标。

本例使用自适应矩估计(ADAM)求解器。ADAM与LSTMs等递归神经网络(rnn)相比,默认的随机动量梯度下降(SGDM)求解器的性能更好。

maxEpochs = 10;miniBatchSize = 64;选项= trainingOptions(“亚当”...InitialLearnRate = 1的军医,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”...Verbose = false,...ValidationFrequency =地板(元素个数(TrainingFeatures) / miniBatchSize),...ValidationData = {FeaturesValidationClean。' BaselineV},...情节=“训练进步”...LearnRateSchedule =“分段”...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 5);

培训LSTM网络

使用指定的训练选项和层结构训练LSTM网络trainNetwork(深度学习工具箱)。由于训练集很大,训练过程可能需要几分钟。

[keywordNetNoAugmentation,netInfo] = trainNetwork(TrainingFeatures,TrainingMasks,layers,options);

如果speedupExample加载(fullfile (netFolder“keywordNetNoAugmentation.mat”),“keywordNetNoAugmentation”“M”“S”);结束

检查无噪声验证信号的网络准确性

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

v = category (keywordNetNoAugmentation,FeaturesValidationClean.');

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

图confusionchart (BaselineV v,...Title =“验证准确性”...ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

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

V = double(V) - 1;v = repmat(v,hopLength,1);V = V (:);

听网络识别的关键字区域。

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

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

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

检查有噪声的验证信号的网络准确性

现在您将检查有噪声的语音信号的网络准确性。用加性高斯白噪声破坏干净的验证信号,得到噪声信号。

加载噪声信号。

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

想象这个信号。

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

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

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

将特征矩阵传递给网络。

v = category (keywordNetNoAugmentation, featuresvalidationnoise .');

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

图confusionchart (BaselineV v,...Title =验证精度-噪声语音...ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

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

V = double(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 *基线])网格包含(“时间(s)”)传说(“训练信号”“网络掩码”“基线面具”位置=“东南”l = findall(fig,“类型”“行”);l(1)。LineWidth = 2;l(2)。LineWidth = 2;标题(噪声语音测试结果-无数据增强)

执行数据增强

训练过的网络在有噪声的信号上表现不佳,因为训练过的数据集只包含无噪声的句子。您将通过增加数据集以包括有噪声的句子来纠正这一问题。

使用audioDataAugmenter扩充您的数据集。

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

使用这些设置,audioDataAugmenter对象以85%的概率用高斯白噪声破坏输入音频信号。信噪比在[-1 1]范围内随机选择(单位:dB)。有15%的概率增广器不会修改输入信号。

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

reset(adsKeyword) x = read(adsKeyword);Data = augment(ada,x,fs)
data =1×2表音频AugmentationInfo  ________________ ________________ { 16000×1}1×1结构的两倍

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

数据。AugmentationInfo
ans =带字段的结构:信噪比:0.3410

重置数据存储。

重置(adsKeyword)重置(adsOther)

初始化特征和蒙版单元格。

TrainingFeatures = {};TrainingMasks = {};

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

抽搐parforii = 1:numPartitions subadsKeyword = partition(adsKeyword,numPartitions,ii);subadsOther =分区(adsOther,numPartitions,ii);Count = 1;localFeatures = cell(length(subadsKeyword.Files),1);localMasks = cell(length(subadsKeyword.Files),1);hasdata(subadsKeyword) [sentence,mask] = synthesizeSentence(subadsKeyword,subadsOther,fs,windowLength);%噪音污染augmentedData = augment(ada,sentence,fs);sentence = augmentedData.Audio{1};计算mfcc特性featureMatrix =提取(afe,句子);featureMatrix(~isfinite(featureMatrix)) = 0;range = hopLength*(1:size(featureMatrix,1)) + hopLength;featureMask = 0(大小(范围));index = 1: number (range) featureMask(index) = mode(mask((index-1)*hopLength+1:(index-1)*hopLength+windowLength));结束localFeatures{count} = featureMatrix;localMasks{count} = [emptyCategories,categorical(featureMask)];Count = Count + 1;结束TrainingFeatures = [TrainingFeatures;localFeatures];TrainingMasks = [TrainingMasks;localMasks];结束disp (“训练特征提取”+ toc +“秒”。)
训练特征提取耗时35.6612秒。

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

sampleFeature =训练特征{1};numFeatures = size(sampleFeature,2);featuresMatrix = cat(1,TrainingFeatures{:});如果speedupExample加载(fullfile (netFolder“KWSNet.mat”),“KWSNet”“M”“S”);其他的M = mean(featuresMatrix);S = std(featuresMatrix);结束index = 1:length(TrainingFeatures) f = TrainingFeatures{index};f = (f - M) ./ S;训练特征{index} = f.';% #好吧结束

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

featuresvalidationnoise = (featureMatrixV - M)./S;

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

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

选项= trainingOptions(“亚当”...InitialLearnRate = 1的军医,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”...Verbose = false,...ValidationFrequency =地板(元素个数(TrainingFeatures) / miniBatchSize),...ValidationData = {FeaturesValidationNoisy。' BaselineV},...情节=“训练进步”...LearnRateSchedule =“分段”...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 5);

培训网络。

[KWSNet,netInfo] = trainNetwork(TrainingFeatures,TrainingMasks,layers,options);

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

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

v = category (KWSNet, featuresvalidationnoise .');

比较估计的和预期的KWS掩码。

图confusionchart (BaselineV v,...Title =“数据增强的验证准确性”...ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

收听识别的关键字区域。

V = double(V) - 1;v = repmat(v,hopLength,1);V = V (:);声音(audioIn(逻辑(v)), fs)

想象一下估计的和预期的面具。

图;情节(t) [audioInNoisy(1:长度(v)), v, 0.8 *基线])网格包含(“时间(s)”)传说(“训练信号”“网络掩码”“基线面具”位置=“东南”l = findall(fig,“类型”“行”);l(1)。LineWidth = 2;l(2)。LineWidth = 2;标题(噪声语音测试结果-数据增强)

万博1manbetx支持功能

合成一句话

函数[sentence,mask] = synthesizeSentence(adsKeyword,adsOther,fs,minlength)阅读一个关键字adsKeyword = read(adsKeyword);关键字= Keyword ./max(abs(关键字));确定感兴趣的区域speech hinices = detectSpeech(关键字,fs);如果isempty(speech hinices) || diff(speech hinices (1,:)) <= minlength speech hinices = [1,length(关键字)];结束关键字=关键字(speech hindices (1,1):speech hindices (1,2));选择一个随机数字(0到10之间)numWords = randi([0,10]);选择插入关键字的位置loc = randi([1,numWords+1]);句子= [];掩码= [];index = 1:numWords+1如果索引==loc句子=[句子;关键词];newMask = ones(size(关键字));mask = [mask;newMask];其他的other = read(adsOther);Other = Other ./max(abs(Other));句子=[句子;其他];掩码=[掩码;零(大小(其他))];结束结束结束

参考文献

狱长P。“语音命令:用于单词语音识别的公共数据集”,2017年。可以从https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz。版权所有谷歌2017。语音命令数据集是在创作共用属性4.0许可下授权的。