主要内容

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

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

介绍

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

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

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

在高信噪比情况下,传统的语音检测算法充分执行。读入一个音频文件,包括单词之间的停顿。重新取样16 kHz的声音。听音频。

fs = 16 e3;[演讲,fileFs] = audioread (“Counting-16-44p1-mono-15secs.wav”);演讲=重新取样(演讲、fs、fileFs);演讲=演讲/ max (abs(演讲));声音(演讲中,fs)

使用detectSpeech功能定位区域的言论。的detectSpeech函数正确识别所有地区的演讲。

赢得=汉明(50 e - 3 * fs,“周期”);detectSpeech(演讲、fs、窗口=赢)

腐败的音频信号洗衣机在-20分贝噪声信噪比。听的音频。

(噪音、fileFs) = audioread (“洗衣机- 16 - 8 mono - 200 - secs.mp3”);噪音=重新取样(噪音、fs、fileFs);信噪比= -20;noiseGain = 10 ^(信噪比/ 20)*规范(演讲)/规范(噪声);noisySpeech =演讲+ noiseGain *噪声(1:元素个数(演讲));noisySpeech = noisySpeech. / max (abs (noisySpeech));声音(noisySpeech fs)

调用detectSpeech在嘈杂的音频信号。函数无法检测到演讲地区考虑到非常低的信噪比。

detectSpeech (noisySpeech fs,窗口=赢)

下载和加载pretrained网络和配置audioFeatureExtractor对象。网络言论被训练来检测低信噪比环境中给定的输出特性audioFeatureExtractor对象。

downloadFolder = matlab.internal.examples.download金宝appSupportFile (“音频”,“VoiceActivityDetection.zip”);dataFolder = tempdir;解压缩(downloadFolder dataFolder) netFolder = fullfile (dataFolder,“VoiceActivityDetection”);负载(fullfile (netFolder“voiceActivityDetectionExample.mat”));
speechDetectNet
speechDetectNet = SeriesNetwork属性:层:[6×1 nnet.cnn.layer.Layer] InputNames: {“sequenceinput”} OutputNames: {“classoutput”}
afe
afe = audioFeatureExtractor属性:属性窗口:[256×1双]OverlapLength: 128 SampleRate: 16000 FFTLength: [] SpectralDescriptorInput:“linearSpectrum”FeatureVectorLength: 9 spectralCentroid启用功能,spectralCrest, spectralEntropy, spectralFlux, spectralKurtosis, spectralRolloffPoint spectralSkewness, spectralSlope, harmonicRatio linearSpectrum禁用功能,melSpectrum, barkSpectrum, erbSpectrum, mfcc, mfccDelta mfccDeltaDelta, gtcc、gtccDelta, gtccDeltaDelta, spectralDecrease, spectralFlatness spectralSpread,音高,zerocrossrate, shortTimeEnergy提取功能,设置相应的属性为true。例如,obj。mfcc = true,增加了mfcc启用的列表功能。

从演讲中提取特征数据,然后正常化。东方特性,时间是在列。

特点=提取(afe noisySpeech);特性=(功能-意味着(功能,1))。/性病(特性,[],1);特点=功能”;

通过通过语音检测网络的特性分类每个特征向量属于一个帧的言论。

decisionsCategorical =分类(speechDetectNet、特点);

每一个决策对应窗口进行了分析audioFeatureExtractor。复制的决定,他们是一一对应的音频样本。演讲的阴谋,嘈杂的演讲,和监督的决定。

decisionsWindow = 1.2 *(双(decisionsCategorical) 1);decisionsSample = [repelem (decisionsWindow(1)元素个数(afe.Window)),repelem (decisionsWindow(2:结束),元素个数(afe.Window) -afe.OverlapLength)];t =(0:元素个数(decisionsSample) 1) / afe.SampleRate;情节(t, noisySpeech(1:元素个数(t)),t,演讲(1:元素个数(t)),t, decisionsSample);包含(“时间(s)”)ylabel (“振幅”)传说(《吵闹的演讲》,“演讲”,“监督”位置=“西南”)

您还可以使用培训和监督网络流上下文。模拟流环境,首先保存语音和噪声信号WAV文件。模拟流输入,你会读到帧的文件,并把它们所需的信噪比。

audiowrite (“Speech.wav”演讲中,fs) audiowrite (“Noise.wav”、噪音、fs)

应用和监督网络流媒体音频,你必须权衡之间的延迟和准确性。定义参数的流噪声语音活动检测演示。您可以设置测试的持续时间,序列长度输入网络,跳序列长度和信噪比测试。一般来说,增加序列长度增加了准确性,还增加了延迟。你也可以选择你的设备的输出信号与原始信号或噪声信号。

testDuration =20.;sequenceLength =400年;sequenceHop =20.;信噪比=-20年;noiseGain = 10 ^(信噪比/ 20)*规范(演讲)/规范(噪声);signalToListenTo =“吵”;

调用流演示helper函数观察流式音频和监督网络的性能。参数设置使用现场控制不要打断流的例子。流媒体演示完成后,您可以修改参数的示范,然后再次运行流演示。你可以找到的代码流演示的金宝app支持功能

helperStreamingDemo (afe speechDetectNet,“Speech.wav”,“Noise.wav”,testDuration、sequenceLength sequenceHop、signalToListenTo noiseGain);

剩下的例子走过培训和评估和监督网络。

培训和评估和监督网络

培训:

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

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

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

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

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

预测:

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

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

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

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

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

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

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

加载语音命令数据集

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

downloadFolder = matlab.internal.examples.download金宝appSupportFile (“音频”,“google_speech.zip”);dataFolder = tempdir;解压缩数据集(downloadFolder dataFolder) = fullfile (dataFolder,“google_speech”);

创建一个audioDatastore指向的训练数据集。

adsTrain = audioDatastore (fullfile(数据集,“训练”),Includesubfolders = true);

创建一个audioDatastore指向验证数据集。

adsValidation = audioDatastore (fullfile(数据集,“确认”),Includesubfolders = true);

创建Speech-Plus-Silence训练信号

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

(数据、adsInfo) =阅读(adsTrain);fs = adsInfo.SampleRate;

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

声音(数据、fs)

情节的音频信号。

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

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

提取有用的部分数据。定义一个50毫秒周期性汉明窗进行分析。调用detectSpeech没有输出参数绘制区域检测到演讲。调用detectSpeech再次返回检测到演讲的指标。隔离区域,然后使用检测到演讲声音命令听音频。

赢得=汉明(50 e - 3 * fs,“周期”);detectSpeech(数据、fs窗口=赢得);

speechIndices = detectSpeech(数据、fs窗口=赢得);声音(数据(speechIndices (1,1): speechIndices (1、2), fs)

detectSpeech函数返回索引,紧密围绕着发现演讲。这是根据经验,对于这个示例,扩展指数5帧检测到演讲的两侧增加了最终模型的性能。延长演讲指数5帧,然后听演讲。

speechIndices (1, - 1) = max (speechIndices(1,1) - 5 *元素个数(赢),1);speechIndices (1、2) = min (speechIndices(1、2) + 5 *元素个数(赢),元素个数(数据);声音(数据(speechIndices (1,1): speechIndices (1、2), fs)

重置训练数据存储和洗牌文件数据存储的顺序。

重置(adsTrain) adsTrain = shuffle (adsTrain);adsValidation = shuffle (adsValidation);

detectSpeech函数计算在乐此不疲的阈值来确定演讲的地区。你可以跳过阈值计算和加快detectSpeech直接通过指定的阈值函数。数据集来确定阈值,调用detectSpeech抽样的文件和计算得到的阈值。带阈值的均值。

T = 0 (500 2);2 = 1:50 0数据=阅读(adsTrain);[~ T (ii)): = detectSpeech(数据、fs窗口=赢得);结束T =意味着(T, 1);重置(adsTrain)

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

Preallocate训练信号。

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

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

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

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

maxSilenceSegment = 2;

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

numSamples = 1;numSamples < data =时间阅读(adsTrain);=数据。/ max (abs(数据));%规模振幅%确定地区的言论idx = detectSpeech(数据、fs窗口=赢,阈值= T);%如果检测到地区的言论如果~ isempty (idx)%扩展指数由5帧idx (1, - 1) = max (1、idx(1,1) - 5 *元素个数(赢得));idx (1、2) = min(长度(数据),idx(1、2) + 5 *元素个数(赢得));%隔离演讲data =数据(idx (1,1): idx (1、2);%写演讲段训练信号audioTraining (numSamples: numSamples +元素个数(数据)1)=数据;%设置VAD基线maskTraining (numSamples: numSamples +元素个数(数据)1)= true;%随机沉默期numSilenceSamples =兰迪(maxSilenceSegment * fs, 1,1);numSamples = numSamples +元素个数(数据)+ numSilenceSamples;结束结束audioTraining = audioTraining(1:持续时间);maskTraining = maskTraining(1:持续时间);

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

= 1:10 * fs范围图;情节((1 / fs) *(范围1)audioTraining(范围);持有情节((1 / fs) *(范围1)maskTraining(范围),线宽= 2);网格包含(“时间(s)”)传说(“信号”,“演讲地区”)标题(“训练信号(前10秒)”);

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

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

添加噪声训练信号

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

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

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

腐败的训练信号与噪声。

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

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

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

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

声音(audioTrainingNoisy(范围)、fs)

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

speechIndices = detectSpeech (fs, audioTrainingNoisy窗口=赢得);speechIndices (: 1) = max (1, speechIndices(: 1) - 5 *元素个数(赢得));speechIndices (:, 2) = min(元素个数(audioTrainingNoisy) speechIndices(:, 2) + 5 *元素个数(赢得));noisyMask = 0(大小(audioTrainingNoisy));2 = 1:尺寸(speechIndices) noisyMask (speechIndices (2, 1): speechIndices (2, 2)) = 1;结束

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

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

创建Speech-Plus-Silence验证信号

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

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

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

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

numSamples = 1;numSamples < data =时间阅读(adsValidation);=数据。/ max (abs(数据));%正常化振幅%确定地区的言论idx = detectSpeech(数据、fs窗口=赢,阈值= T);%如果检测到地区的言论如果~ isempty (idx)%扩展指数由5帧idx (1, - 1) = max (1、idx(1,1) - 5 *元素个数(赢得));idx (1、2) = min(长度(数据),idx(1、2) + 5 *元素个数(赢得));%隔离演讲data =数据(idx (1,1): idx (1、2);%写演讲段训练信号audioValidation (numSamples: numSamples +元素个数(数据)1)=数据;%设置VAD基线maskValidation (numSamples: numSamples +元素个数(数据)1)= true;%随机沉默期numSilenceSamples =兰迪(maxSilenceSegment * fs, 1,1);numSamples = numSamples +元素个数(数据)+ numSilenceSamples;结束结束

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

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

提取训练功能

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

这个示例使用audioFeatureExtractor创建一个最佳特征提取特性。创建一个管道audioFeatureExtractor对象提取特性。使用256点损害窗口有50%的重叠。

afe = audioFeatureExtractor (SampleRate = fs,窗口=损害(256“周期”),OverlapLength = 128,spectralCentroid = true,spectralCrest = true,spectralEntropy = true,spectralFlux = true,spectralKurtosis = true,spectralRolloffPoint = true,spectralSkewness = true,spectralSlope = true,harmonicRatio = true);audioTrainingNoisy featuresTraining =提取(afe);

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

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

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

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

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

从验证提取特征信号使用相同的过程。

audioValidationNoisy featuresValidation =提取(afe);featuresValidation = (featuresValidation -意味着(featuresValidation, 1))。/性病(featuresValidation [], 1);

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

windowLength =元素个数(afe.Window);hopLength = windowLength - afe.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;sequenceOverlap =圆(0.75 * sequenceLength);trainFeatureCell = helperFeatureVector2Sequence (featuresTraining sequenceLength sequenceOverlap);trainLabelCell = helperFeatureVector2Sequence (maskTrainingCat sequenceLength sequenceOverlap);

定义LSTM网络体系结构

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

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

层= [sequenceInputLayer afe.FeatureVectorLength 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”,Verbose = 0,SequenceLength = SequenceLength,ValidationFrequency =地板(元素个数(trainFeatureCell) / miniBatchSize),ValidationData = {featuresValidation。', maskValidationCat。},情节=“训练进步”,LearnRateSchedule =“分段”,LearnRateDropFactor = 0.1,LearnRateDropPeriod = 5);

火车LSTM网络

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

speedupExample =真正的;如果speedupExample [speechDetectNet netInfo] = trainNetwork (trainFeatureCell、trainLabelCell层,选择);显示器(“验证准确性:“+ netInfo。FinalValidationAccuracy +“百分比”。);其他的负载speechDetectNet结束

“验证精度:91%”。

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

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

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

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

图confusionchart (maskValidation EstimatedVADMask,title =“验证准确性”ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

如果你改变了你的网络参数或特征提取管道,考虑垫与新网络和文件保存audioFeatureExtractor对象。

resaveNetwork =;如果resaveNetwork保存(“Audio_VoiceActivityDetectionExample.mat”,“speechDetectNet”,“安全的”);结束

金宝app支持功能

将特征向量转换成序列

函数[序列,sequencePerFile] = helperFeatureVector2Sequence(特性、featureVectorsPerSequence featureVectorOverlap)如果featureVectorsPerSequence < = featureVectorOverlap错误(“重叠的特征向量的个数必须小于每个序列的特征向量数。”)结束如果~ iscell(特性)特性={特性};结束hopLength = featureVectorsPerSequence - featureVectorOverlap;idx1 = 1;序列= {};sequencePerFile =细胞(元素个数(特性),1);2 = 1:元素个数(特性)sequencePerFile{2} =地板((大小({2},2)- featureVectorsPerSequence) / hopLength) + 1;idx2 = 1;j = 1: sequencePerFile{2}序列{idx1, 1} ={2}特性(:,idx2: idx2 + featureVectorsPerSequence - 1);% #好< AGROW >idx1 = idx1 + 1;idx2 = idx2 + hopLength;结束结束结束

流媒体演示

函数helperStreamingDemo (speechDetectNet afe cleanSpeech,噪音,testDuration, sequenceLength, sequenceHop, signalToListenTo, noiseGain)

创建dsp.AudioFileReader对象从语音和噪声读取文件逐帧。

speechReader = dsp.AudioFileReader (cleanSpeech PlayCount = inf);noiseReader = dsp.AudioFileReader(噪音、PlayCount =正);fs = speechReader.SampleRate;

创建一个dsp.MovingStandardDeviation对象和一个dsp.MovingAverage对象。您将使用这些来确定标准差和均值的音频功能正常化。统计应该改善随着时间的推移。

movSTD = = dsp.MovingStandardDeviation(方法“指数权重”ForgettingFactor = 1);movMean = = dsp.MovingAverage(方法“指数权重”ForgettingFactor = 1);

创建三个dsp.AsyncBuffer对象。一个缓冲输入音频,一个缓冲提取的特征,和一个缓冲的输出缓冲区。输出缓冲区只有实时可视化决策所必需的。

audioInBuffer = dsp.AsyncBuffer;featureBuffer = dsp.AsyncBuffer;audioOutBuffer = dsp.AsyncBuffer;

对于音频缓冲区,您将缓冲区的原始干净语音信号和噪声信号。你只会播放指定的signalToListenTo。转换signalToListenTo变量来你想听的通道。

channelToListenTo = 1;如果比较字符串(signalToListenTo“清洁”)channelToListenTo = 2;结束

创建时间范围可视化原始语音信号,噪声信号,网络应用,从网络和决策输出。

范围= timescope (SampleRate = fs,TimeSpanSource =“财产”,时间间隔= 3,BufferLength = f * 3 * 3,YLimits = [1],TimeSpanOverrunAction =“滚动”,ShowGrid = true,NumInputPorts = 3,LayoutDimensions = (3,1),Title =《吵闹的演讲》);范围。ActiveDisplay = 2;范围。Title =“干净的演讲(原始)”;范围。YLimits = [1];范围。ActiveDisplay = 3;范围。Title =“发现演讲”;范围。YLimits = [1];

创建一个audioDeviceWriter对象玩原来的或嘈杂的声音从你的扬声器。

deviceWriter = audioDeviceWriter (SampleRate = fs);

初始化变量在循环中使用。

windowLength =元素个数(afe.Window);hopLength = windowLength - afe.OverlapLength;myMax = 0;audioBufferInitialized = false;featureBufferInitialized = false;

流媒体示范运行。

抽搐toc < testDuration%读取一帧语音信号和噪声信号的帧speechIn = speechReader ();noiseIn = noiseReader ();%将语音和噪声在指定的信噪比noisyAudio = speechIn + noiseGain * noiseIn;%更新正常化运行马克斯myMax = max (myMax max (abs (noisyAudio)));%写吵闹的音频和语音缓冲区写(audioInBuffer [noisyAudio speechIn]);%如果缓冲足够多的样本,%的音频缓冲区读指针初始化,推动%的音频缓冲区窗口长度。如果audioInBuffer。NumUnreadSamples > = windowLength & & ~ audioBufferInitialized audioBufferInitialized = true;读(audioInBuffer windowLength);结束%如果有足够多的样本在音频缓冲区计算功能%向量,看样品,规范化,提取特征向量,和写作%的最新特征向量缓冲特性。(audioInBuffer。NumUnreadSamples > = hopLength) & & audioBufferInitialized x =阅读(audioInBuffer, windowLength + hopLength windowLength);写(audioOutBuffer x (end-hopLength + 1:,:));noisyAudio = x (: 1);noisyAudio = noisyAudio / myMax;特点=提取(afe noisyAudio);写(featureBuffer特性(2:));结束%如果足够多的特征向量是缓冲,缓冲特性%作为特征,推动读指针初始化缓冲%和音频输出缓冲区(这样他们是同步的)。如果featureBuffer。NumUnreadSamples > = (sequenceLength + sequenceHop) & & ~ featureBufferInitialized featureBufferInitialized = true;读(featureBuffer sequenceLength - sequenceHop);读(audioOutBuffer (sequenceLength - sequenceHop) * windowLength);结束featureBuffer。NumUnreadSamples > = sequenceHop & & featureBufferInitialized特性=阅读(featureBuffer、sequenceLength sequenceLength - sequenceHop);特性(isnan(特性))= 0;%只使用新功能更新%标准差和均值。规范化的特点。localSTD = movSTD(特性(end-sequenceHop + 1:,:));localMean = movMean(特性(end-sequenceHop + 1:,:));特性=(功能- localMean(最终,:))。/ localSTD(最终:);决定= (speechDetectNet,功能分类');决策=决策(end-sequenceHop + 1:结束);决定=双(决定)- 1;决定= repelem(决定,hopLength);audioHop =阅读(audioOutBuffer, sequenceHop * hopLength);% +噪音听演讲或演讲deviceWriter (audioHop (:, channelToListenTo));%可视化语音+噪音,原来的演讲,%的语音活动检测。范围(audioHop (: 1), audioHop (:, 2), audioHop(: 1)。*决定)结束结束发行版(deviceWriter)发布(audioInBuffer)发布(audioOutBuffer)发布(featureBuffer)发布(movSTD)发布(movMean)发布(范围)结束

引用

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