使用深度学习语音活动检测噪声

这个例子展示了如何检测区域的言论在低信噪比环境下使用深度学习。示例使用语音命令数据集训练短期记忆双向长(BiLSTM)网络来检测语音活动。

介绍

语音活动检测许多音频系统是一个重要的组成部分,如自动语音识别和说话人识别。语音活动检测可以在低信噪比(信噪比)的情况下尤其具有挑战性,演讲是噪音的阻碍。

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

这个例子训练语音活动检测双向LSTM网络特性的光谱特征序列和谐波比率指标。

要运行示例,您必须先下载数据集。如果你不希望下载数据集或训练网络,然后你可以加载一个pretrained网络通过打开这个例子在MATLAB®和打字负载(“speechDetectNet.mat”)在命令行中。

例子总结

这个例子经过以下步骤:

培训:

  1. 创建一个audioDatastore指向音频语音文件用于火车LSTM网络。

  2. 创建一个训练信号组成的演讲片段分离段的不同持续时间的沉默。

  3. 腐败与洗衣机speech-plus-silence信号噪声(信噪比= -10分贝)。

  4. 提取特征序列组成的光谱特性和谐波比嘈杂的信号。

  5. 火车LSTM网络使用声音的特征序列识别区域活动。

预测:

  1. 创建一个audioDatastore语音文件用于测试训练网络,并创建一个测试信号组成的语音分离段的沉默。

  2. 腐败与洗衣机噪声测试信号(信噪比= -10 dB)。

  3. 从喧闹的测试信号中提取特征序列。

  4. 语音识别地区活动通过测试功能通过训练网络。

  5. 比较网络的准确性从signal-plus-silence声音活动基线测试信号。

这里是一个草图的训练过程。

这是一个预测过程的示意图。你用经过训练的网络进行预测。

加载语音命令数据集

下载的数据集https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz并解压下载文件。集datafolder数据的位置。使用audioDatastore创建一个数据存储,其中包含文件名。

datafolder = PathToDatabase;广告= audioDatastore (datafolder,“Includesubfolders”,真正的);

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

指数= cellfun (@ (c) ~包含(c,“_background_noise_”),ads.Files);广告=子集(广告、指标);

将数据分为训练和验证

数据集文件夹包含文本文件列出哪些音频文件应该在验证集和音频文件应该在测试集。这些预定义的验证和测试集不包含发音相同的词同样的人,那么最好是使用这些预定义的集比选择一个随机的整个数据集的子集,使用支持函数万博1manbetxsplitData将数据存储到基于训练集和验证集验证和测试文件的列表。

[adsTrain, adsValidation] = splitData(广告,datafolder);

洗牌文件数据存储的顺序。

adsTrain = shuffle (adsTrain);adsValidation = shuffle (adsValidation);

创建Speech-Plus-Silence训练信号

读一个音频文件的内容。得到的采样率信息结构体。

(数据、信息)=阅读(adsTrain);Fs = info.SampleRate;

使用声音命令听音频信号。

声音(数据、Fs)

情节的音频信号。

timeVector = (1 / Fs) *(0:元素个数(数据)1);情节(timeVector、数据)ylabel (“振幅”)包含(“时间(s)”)标题(“音频样本”网格)

信号有交际部分(沉默、背景噪声等),不包含有用的语言信息。这个例子就沉默使用一个简单的阈值方法中使用的一个相同性别使用LSTM网络进行分类

提取有用的部分数据。情节的新使用的音频信号,听它声音命令。

段= HelperGetSpeechSegments(数据、Fs);speechData =段{1};图timeVector = (1 / Fs) *(0:元素个数(speechData) 1);情节(timeVector speechData) ylabel (“振幅”)包含(“时间(s)”)标题(“音频样本”网格)

创建一个1000秒的训练信号通过结合多个语音文件从训练数据集。使用HelperGetSpeechSegments每个文件,删除不需要的部分。插入一段随机的演讲片段之间的沉默。

Preallocate训练信号。

时间= 1000 * Fs;audioTraining = 0(持续时间,1);

面具Preallocate声音活动培训。面具1的值对应于样品位于语音活动的地区。0的值对应的地区没有声音的活动。

maskTraining = 0(持续时间,1);

指定一个最大安静段时间2秒。

maxSilenceSegment = 2;

通过调用构造训练信号数据存储在一个循环中。

numSamples = 1;numSamples < data =时间阅读(adsTrain);%从片段中删除非语音领域data = HelperGetSpeechSegments(数据、Fs);数据={1}的数据;%写演讲段训练信号audioTraining (numSamples: numSamples +元素个数(数据)1)=数据;%设置VAD基线maskTraining (numSamples: numSamples +元素个数(数据)1)= true;%随机沉默期numSilenceSamples =兰迪(maxSilenceSegment * Fs, 1,1);numSamples = numSamples +元素个数(数据)+ numSilenceSamples;结束

想象十秒信号部分的训练。阴谋活动面具基线的声音。

= 1:10 * Fs范围图;情节((1 / Fs) *(范围1)audioTraining(范围);持有情节((1 / Fs) *(范围1)maskTraining(范围);网格行= findall (gcf,“类型”,“行”);行(1)。线宽= 2;包含(“时间(s)”)传说(“信号”,“言语区”)标题(“训练信号(前10秒)”);

听第一个10秒的训练信号。

声音(audioTraining(范围),Fs);

添加噪声训练信号

腐败的训练与洗衣机噪声信号通过添加洗衣机噪声语音信号,信噪比是-10分贝。

读8 kHz的声音,把它转换成16赫兹。

噪音= audioread (“洗衣机- 16 - 8 mono - 1000 - secs.wav”);噪音=重新取样(噪音、2、1);

腐败的训练信号与噪声。

audioTraining = audioTraining(1:元素个数(噪声));信噪比= -10;噪音= 10 ^(信噪比/ 20)*噪声*规范(audioTraining) /规范(噪声);audioTrainingNoisy = audioTraining +噪声;audioTrainingNoisy = audioTrainingNoisy / max (abs (audioTrainingNoisy));

想象一个10秒的部分噪声训练信号。阴谋活动面具基线的声音。

图绘制((1 / Fs) *(范围1)audioTrainingNoisy(范围);持有情节((1 / Fs) *(范围1)maskTraining(范围);网格行= findall (gcf,“类型”,“行”);行(1)。线宽= 2;包含(“时间(s)”)传说(“噪声信号”,“言语区”)标题(“训练信号(前10秒)”);

听吵闹的训练的前十秒信号。

声音(audioTrainingNoisy(范围)、Fs)

注意,您获得的基线声音活动面具使用无声speech-plus-silence信号。确认使用HelperGetSpeechSegments的信号不产生良好的结果。

[~,noisyMask] = HelperGetSpeechSegments (audioTrainingNoisy Fs);

想象一个10秒的部分噪声训练信号。阴谋活动分析获得的面具嘈杂的声音信号。

图绘制((1 / Fs) *(范围1)audioTrainingNoisy(范围);持有情节((1 / Fs) *(范围1)noisyMask(范围);网格行= findall (gcf,“类型”,“行”);行(1)。线宽= 2;包含(“时间(s)”)传说(“噪声信号”,“面具从噪声信号”)标题(“训练信号(前10秒)”);

创建Speech-Plus-Silence验证信号

创建一个200秒的噪声语音信号验证训练网络。使用验证数据存储。注意,验证和训练数据存储有不同的扬声器。

Preallocate验证信号,验证面具。您将使用这个面具来评估的准确性训练网络。

时间= 200 * Fs;audioValidation = 0(持续时间,1);maskValidation = 0(持续时间,1);

构建验证信号通过调用数据存储在一个循环中。

numSamples = 1;numSamples < data =时间阅读(adsValidation);%从片段中删除非语音领域data = HelperGetSpeechSegments(数据、Fs);数据={1}的数据;%写演讲段训练信号audioValidation (numSamples: numSamples +元素个数(数据)1)=数据;maskValidation (numSamples: numSamples +元素个数(数据)1)= true;%随机沉默期numSilenceSamples =兰迪(maxSilenceSegment * Fs, 1,1);numSamples = numSamples +元素个数(数据)+ numSilenceSamples;结束

腐败的验证与洗衣机噪声信号通过添加洗衣机噪声语音信号,信噪比是-10分贝。使用一个不同的声音文件验证信号比你训练信号。

噪音= audioread (“洗衣机- 16 - 8 mono - 200 - secs.wav”);噪音=重新取样(噪音、2、1);audioValidation = audioValidation(1:元素个数(噪声));噪音= 10 ^(信噪比/ 20)*噪声*规范(audioValidation) /规范(噪声);audioValidationNoisy = audioValidation +噪声;audioValidationNoisy = audioValidationNoisy / max (abs (audioValidationNoisy));

提取训练功能

这个例子列车LSTM网络使用以下功能:

定义系统参数。

WindowLength = 256;参数个数。WindowLength = WindowLength;参数个数。窗口=损害(WindowLength,“周期”);参数个数。OverlapLength = 128;参数个数。FFTLength = 256;参数个数。范围= [0,Fs / 2];参数个数。SpectrumType =“权力”;

计算训练信号的功率谱。

[frequencyVector, ~ ~ S] =光谱图(audioTrainingNoisy损害(WindowLength,“周期”),128年,WindowLength Fs,“权力”,“单向的”);

提取特征,然后连接它们。

SCentroid = spectralCentroid(年代,frequencyVector);可控硅= spectralCrest(年代,frequencyVector);Sentropy = spectralEntropy(年代,frequencyVector);SFlux = spectralFlux(年代,frequencyVector);SKurtosis = spectralKurtosis(年代,frequencyVector);SRolloffPoint = spectralRolloffPoint(年代,frequencyVector);SSkewness = spectralSkewness(年代,frequencyVector);SSlope = spectralSlope(年代,frequencyVector);hr = harmonicRatio (audioTrainingNoisy Fs,“窗口”params.Window,“OverlapLength”,params.OverlapLength);featuresTraining = [SCentroid可控硅Sentropy SFlux SKurtosis SRolloffPoint SSkewness SSlope人力资源);

显示的尺寸特性矩阵。第一个维度对应窗口的数量信号分为(这取决于窗口长度和重叠长度)。第二个维度是本例中使用的特性。

[numWindows, numFeatures] =大小(featuresTraining)
numWindows = 124999 numFeatures = 9

在分类应用程序中,这是一个很好的实践所有功能正常化零均值和标准差统一。

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

M =意味着(featuresTraining, 1);S =性病(featuresTraining [], 1);featuresTraining = (featuresTraining - M)。/ S;

从验证提取特征信号使用相同的过程。辅助函数getSpeechActivityFeatures封装了特征提取和标准化的步骤。

featuresValidation = getSpeechActivityFeatures (Fs, audioValidationNoisy params);

每个特征对应于128年的样本数据(hop长度)。对于每一个跳跃,预期的声音/不值设置为基线掩模值的模式对应的128个样本。声音/不掩码转换为分类。

hopLength = (WindowLength - params.OverlapLength);= (hopLength) *(1:尺寸(featuresTraining, 1)) + hopLength;maskMode = 0(大小(范围);指数= 1:元素个数(范围)maskMode(指数)=模式(maskTraining((索引1)* hopLength + 1:(索引1)* hopLength + WindowLength));结束maskTraining = maskMode。”;maskTrainingCat =分类(maskTraining);

做同样的验证的面具。

= (hopLength) *(1:尺寸(featuresValidation, 1)) + hopLength;maskMode = 0(大小(范围);指数= 1:元素个数(范围)maskMode(指数)=模式(maskValidation((索引1)* hopLength + 1:(索引1)* hopLength + WindowLength));结束maskValidation = maskMode。”;maskValidationCat =分类(maskValidation);

将培训特点和面具分为序列长度为800,有75%的重叠连续序列。

sequenceLength = 800;trainFeatureCell = {};trainLabelCell = {};指数= 1;指数<大小(featuresTraining 1)——sequenceLength trainFeatureCell{结束+ 1}= featuresTraining(指数:指数+ sequenceLength-1:)。';% #好吧trainLabelCell{结束+ 1}= maskTrainingCat(指数:索引+ sequenceLength-1) ';% #好吧指数=指数+圆(sequenceLength / 4);结束

定义LSTM网络体系结构

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

指定输入大小的序列长度9(特性)的数量。指定一个隐藏的双向LSTM层和一个输出大小为200和输出序列。这个命令指示双向LSTM层输入时间序列映射到200特性传递到下一层。然后,指定一个双向LSTM层和一个输出大小为200和输出序列的最后一个元素。这个命令指示双向LSTM层将其输入映射到200,然后准备输出特性完全连接层。最后,指定两个类包括一个完全连接层的大小2,其次是softmax层和一层分类。

层= [sequenceInputLayer(大小(featuresValidation, 2)) bilstmLayer(200年“OutputMode”,“序列”)bilstmLayer (200,“OutputMode”,“序列”)fullyConnectedLayer (2) softmaxLayer classificationLayer];

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

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

maxEpochs = 20;miniBatchSize = 64;选择= trainingOptions (“亚当”,“MaxEpochs”maxEpochs,“MiniBatchSize”miniBatchSize,“洗牌”,“every-epoch”,“详细”0,“SequenceLength”sequenceLength,“ValidationFrequency”、地板(元素个数(trainFeatureCell) / miniBatchSize),“ValidationData”,{featuresValidation。“maskValidationCat。”},“阴谋”,“训练进步”,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”10);

火车LSTM网络

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

doTraining = true;如果doTraining [speechDetectNet信息]= trainNetwork (trainFeatureCell、trainLabelCell层,选择);流(“验证准确性:% f %。\ n”info.ValidationAccuracy(结束));其他的负载speechDetectNet结束
验证精度:90.820313%。

使用训练有素的网络来检测语音活动

估计语音活动验证信号使用训练网络。估计VAD面具从范畴转化成双。

EstimatedVADMask =分类(speechDetectNet featuresValidation。');EstimatedVADMask =双(EstimatedVADMask);EstimatedVADMask = EstimatedVADMask。”——1;

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

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

每个面具值对应于128个样本(hop长度)。重复做的面具的面具值相同长度验证音频信号。做同样的基线的面具。

EstimatedVADMask = repmat (EstimatedVADMask 1 hopLength);EstimatedVADMask =重塑(EstimatedVADMask。”元素个数(EstimatedVADMask), 1);ActualVADMask = repmat (maskValidation 1 hopLength);ActualVADMask =重塑(ActualVADMask。”元素个数(ActualVADMask), 1);

隔离区域估计的声音通过设置沉默者地区活动

音频= audioValidationNoisy;音频(EstimatedVADMask = = 0) =南;audioAct = audioValidation;audioAct (ActualVADMask = = 0) =南;

可视化语音活动的估计和实际领域的50秒钟部分验证信号。

图范围= 50 * Fs: 100 * Fs;次要情节(2,1,1)情节(范围/ Fs, [audioValidationNoisy(范围),音频(范围)])标题(“估计演讲地区”)传说(“信号”,“语音检测”网格)次要情节(2,1,2)情节(范围/ Fs, [audioValidation(范围),audioAct(范围)])标题(“基线”)传说(“信号”,“语音检测”网格)包含(“时间(s)”)