主要内容

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

在本例中,您执行批处理和流的语音活动检测(VAD)在低信噪比环境下使用pretrained深度学习模型。模型的细节和它是如何训练,明白了训练语音活动检测噪声模型中使用深度学习

加载并检查数据

读入一个音频文件,包括单词之间的停顿,听它。使用重新取样重新取样信号到16 kHz的采样率。使用detectSpeech在干净的信号来确定真实语言的地区。

fs = 16 e3;[演讲,fileFs] = audioread (“Counting-16-44p1-mono-15secs.wav”);演讲=重新取样(演讲、fs、fileFs);演讲= speech. / max (abs(演讲));声音(演讲中,fs) detectSpeech(演讲、fs、窗口=汉明(0.04 * fs,“周期”),MergeDistance =圆(0.5 * fs))

加载一个噪声信号重新取样音频采样率。

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

使用支持函数万博1manbetxmixSNR腐败的清洁与洗衣机噪声语音信号所需的信噪比水平dB。听的音频。在-10分贝信噪比条件下的网络训练。

信噪比=-10年;noisySpeech = mixSNR(演讲、噪声、信噪比);声音(noisySpeech fs)

算法和监督,detectSpeech在这些噪声条件下,失败。

detectSpeech (noisySpeech fs =汉明窗(0.04 * fs,“周期”),MergeDistance =圆(0.5 * fs))

下载Pretrained网络

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

downloadFolder = matlab.internal.examples.download万博1manbetxSupportFile (“音频”,“VoiceActivityDetection.zip”);dataFolder = tempdir;解压缩(downloadFolder dataFolder) netFolder = fullfile (dataFolder,“VoiceActivityDetection”);pretrainedNetwork =负载(fullfile (netFolder“voiceActivityDetectionExample.mat”));afe = pretrainedNetwork.afe;网= pretrainedNetwork.speechDetectNet;

audioFeatureExtractor对象配置为从256 -提取特征样本windows 128样本之间的重叠。16千赫采样率,功能是提取16 ms windows 8女士重叠。从每个窗口audioFeatureExtractor对象提取9个特点:频谱质心、光谱波峰,谱熵谱通量,谱峰态,光谱滚边,偏态光谱,光谱斜率,谐波比率。

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启用的列表功能。

网络包括两个双向LSTM层,每个200隐藏的单位,一个返回类的分类输出0对应没有语音活动检测或类1对应的语音活动检测。

net.Layers
ans = 6×1层与层:数组1 sequenceinput的序列输入序列输入2 9维的biLSTM_1 BiLSTM BiLSTM 200隐藏单位3‘biLSTM_2 BiLSTM BiLSTM 200隐藏单位4 fc的完全连接2完全连接层5‘softmax softmax softmax 6“classoutput”分类输出crossentropyex类“0”和“1”

执行语音活动检测

从演讲中提取特征数据,然后进行标准化。东方特性,时间是在列。

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

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

decisionsCategorical =分类(净、特点);

每一个决策对应窗口进行了分析audioFeatureExtractor。复制的决定,他们是一一对应的音频样本。使用detectSpeech方便阴谋情节地面真理。使用signalMaskplotsigroi情节预测和监督。

决定=(双(decisionsCategorical) - 1) ';decisionsPerSample =[决定(1:圆形(元素个数(afe.Window) / 2)); repelem(决策,元素个数(afe.Window) -afe.OverlapLength, 1)];tiledlayout (2, 1) nexttile detectSpeech(演讲、fs、窗口=汉明(0.04 * fs,“周期”),MergeDistance =圆(0.5 * fs))标题(“地面实况和监督”)包含(”“)= signalMask nexttile面具(decisionsPerSample SampleRate = fs,类别=“活动”);plotsigroi(面具,noisySpeech,真正的)标题(“预测和监督”)

执行流语音活动检测

audioFeatureExtractor对象用于批处理,不调用之间保留状态。使用generateMATLABFunction创建一个streaming-friendly特征提取器。您可以使用培训和监督网络流上下文使用classifyAndUpdateState(深度学习工具箱)

generateMATLABFunction (afe“featureExtractor”IsStreaming = true)

模拟流环境,保存语音和噪声信号WAV文件。模拟流输入,您将使用dsp.AudioFileReader从文件读取帧和混合所需的信噪比。您还可以使用audioDeviceReader所以,你的麦克风是演讲的来源。

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

定义参数的流噪声语音活动检测演示:

  • 信号信号源,指定为语音文件以前记录的,或你的麦克风。

  • 噪音——噪声源,指定为混合信号的噪声声音文件。

  • 信噪比——信噪比混合信号和噪声,在数据库中指定。

  • testDuration测试时间,以秒为单位指定。

  • playbackSource——播放源,指定为原始干净的信号,噪声信号,或发现演讲。一个audioDeviceWriter对象用于播放音频扬声器。

信号=“Speech.wav”;噪音=“Noise.wav”;信噪比=-10年;% dBtestDuration =20.;%秒playbackSource =“吵”;

调用支持函数万博1manbetxstreamingDemo观察和监督网络流媒体音频的性能。参数设置使用现场控制不要打断流的例子。流媒体演示完成后,您可以修改参数的示范,然后再次运行流演示。

afe streamingDemo(净,信号,噪声,信噪比,testDuration playbackSource);

引用

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

万博1manbetx支持功能

流媒体演示

函数streamingDemo(净,afe、信号、噪声、信噪比、testDuration, playbackSource)% streamingDemo(净、afe、信号、噪声、信噪比、testDuration, playbackSource)%实时VAD演示。%创建dsp。AudioFileReader对象读取语音和噪声文件框架%的框架。如果语音信号被指定为麦克风,使用一个% audioDeviceReader作为源。如果strcmpi(信号,“麦克风”)speechReader = audioDeviceReader (afe.SampleRate);其他的speechReader = dsp.AudioFileReader(信号,PlayCount =正);结束noiseReader = dsp.AudioFileReader(噪音、PlayCount =正无穷,SamplesPerFrame = speechReader.SamplesPerFrame);fs = speechReader.SampleRate;%创建一个dsp。MovingStandardDeviation对象和一个dsp.MovingAverage%的对象。您将使用这些来确定标准差和均值%的音频功能标准化。统计应该改善随着时间的推移%。movSTD = = dsp.MovingStandardDeviation(方法“指数权重”ForgettingFactor = 1);movMean = = dsp.MovingAverage(方法“指数权重”ForgettingFactor = 1);%创建一个dsp。MovingMaximum对象。你会用它来规范%的音频。movMax = dsp.MovingMaximum (SpecifyWindowLength = false);%创建一个dsp。MovingRMS对象。您将使用这个来确定信号%和噪声混合在所需的信噪比。这个对象仅仅是有用的%的目的你在哪里人为添加噪音。movRMS = = dsp.MovingRMS(方法“指数权重”ForgettingFactor = 1);%创建三个dsp。AsyncBuffer对象。一个缓冲区输入音频,一个%缓冲提取的特征,一个缓冲输出音频% VAD决定对应的音频信号。输出缓冲区%只有实时可视化决策所必需的。audioInBuffer = dsp.AsyncBuffer (2 * speechReader.SamplesPerFrame);featureBuffer = dsp.AsyncBuffer(装天花板(2 * speechReader.SamplesPerFrame /(元素个数(afe.Window) -afe.OverlapLength)));audioOutBuffer = dsp.AsyncBuffer (2 * speechReader.SamplesPerFrame);%创建时间范围可视化原始语音信号,噪声网络应用于%信号,决定输出%网络。范围= timescope (SampleRate = fs,TimeSpanSource =“财产”,时间间隔= 3,BufferLength = f * 3 * 3,TimeSpanOverrunAction =“滚动”,AxesScaling =“更新”,MaximizeAxes =“上”,AxesScalingNumUpdates = 20,NumInputPorts = 3,LayoutDimensions = (3,1),ChannelNames = [《吵闹的演讲》,“干净的演讲(原始)”,“发现演讲”),ActiveDisplay = 1,ShowGrid = true,ActiveDisplay = 2,ShowGrid = true,ActiveDisplay = 3,ShowGrid = true);% #好< DUPNAMEARG >设置(范围、{1 1 1})%创建一个audioDeviceWriter对象原始或吵闹%音频扬声器。deviceWriter = audioDeviceWriter (SampleRate = fs);%初始化变量在循环中使用。windowLength =元素个数(afe.Window);hopLength = windowLength - afe.OverlapLength;%流示范运行。loopTimer =抽搐;toc (loopTimer) < testDuration%读取一帧语音信号和噪声信号的帧speechIn = speechReader ();noiseIn = noiseReader ();%将语音和噪声在指定的信噪比能量= movRMS ([speechIn noiseIn]);noiseGain = 10 ^(信噪比/ 20)*(1),/能源(,2);noisyAudio = speechIn + noiseGain * noiseIn;%更新运行最大范围内音频myMax = movMax (abs (noisyAudio));noisyAudio = noisyAudio / myMax(结束);%写吵闹的音频和语音缓冲区写(audioInBuffer [noisyAudio speechIn]);%如果有足够多的样本在音频缓冲区计算功能%向量,看样品,规范化,提取特征%向量,并编写最新的特性向量缓冲器的特性。(audioInBuffer。NumUnreadSamples > = hopLength) x =阅读(audioInBuffer,元素个数(afe.Window) afe.OverlapLength);写(audioOutBuffer x (end-hopLength + 1:,:));noisyAudio = x (: 1);特点= featureExtractor (noisyAudio);写(featureBuffer、特点);结束如果featureBuffer。NumUnreadSamples > = 1%读取音频数据对应数量的未读%的特征向量。audioHop =阅读(audioOutBuffer, featureBuffer.NumUnreadSamples * hopLength);%阅读所有未读的特征向量。特点=阅读(featureBuffer);%只使用新功能更新标准差和%的意思。规范化的特点。rmean = movMean(特性);rstd = movSTD(特性);特性=(功能- rmean(最终,:))。/ rstd(最终:);%网络推理[净,决定]= classifyAndUpdateState(净,功能);%将决定每个特征向量决定样本决定= repelem(决定hopLength 1);%面具应用到可视化的嘈杂的演讲vadResult = audioHop (: 1);vadResult(决定= =分类(0))= 0;% +噪音听演讲或演讲开关playbackSource情况下“清洁”deviceWriter (audioHop (:, 2));情况下“吵”deviceWriter (audioHop (: 1));情况下“detectedSpeech”deviceWriter (vadResult);结束%可视化语音+噪音,原来的演讲,和声音%活动检测。范围(audioHop (: 1), audioHop (:, 2), vadResult)结束结束结束

混合信噪比

函数[noisySignal, requestedNoise] = mixSNR(信号、噪声、比例)% (noisySignal requestedNoise] = mixSNR(信号、噪音比)返回一个吵了%的信号,noisySignal。吵闹的信号混合了%指定比率的噪音分贝。numSamples =大小(信号,1);%将噪声转化为mono噪音=意味着(噪音,2);%修剪或扩大噪声与信号的大小如果(噪音,1)> = numSamples大小%选择一个随机指数,这样你还有numSamples开始%索引后的噪音。开始=兰迪(大小(噪音,1)- numSamples + 1);噪音=噪音(启动:启动+ numSamples-1);其他的numReps =装天花板(numSamples /大小(噪音,1));temp = repmat(噪音numReps 1);开始=兰迪(大小(temp, 1) - numSamples - 1);噪音= temp(启动:启动+ numSamples-1);结束signalNorm =规范(信号);noiseNorm =规范(噪音);goalNoiseNorm = signalNorm /(10 ^(比率/ 20));因素= goalNoiseNorm / noiseNorm;requestedNoise =噪音。*因素;noisySignal = + requestedNoise信号;noisySignal = noisySignal. / max (abs (noisySignal));结束