主要内容

降噪演讲使用深度学习网络

这个例子展示了如何使用深度学习网络的语音信号降噪。这个例子比较了两种类型的网络应用于相同的任务:完全连接,卷积。

介绍

语音去噪的目的就是去除语音信号噪声,提高语音质量和可懂度。这个例子展示了洗衣机噪声的去除语音信号使用深度学习网络。这个例子比较了两种类型的网络应用于相同的任务:完全连接,卷积。

问题总结

考虑下面的语音信号采样8 kHz。

[cleanAudio, fs] = audioread (“SpeechDFT-16-8-mono-5secs.wav”);声音(cleanAudio fs)

添加洗衣机噪声语音信号。设置噪声功率,信噪比(信噪比)是零分贝。

噪音= audioread (“洗衣机- 16 - 8 mono - 1000 - secs.mp3”);%提取噪声段从一个随机的位置在声音文件中印第安纳州=兰迪(元素个数(噪声)——元素个数(cleanAudio) + 1, 1, 1);noiseSegment =噪音(印第安纳州:印第安纳州+元素个数(cleanAudio) - 1);speechPower =总和(cleanAudio。^ 2);noisePower =总和(noiseSegment。^ 2);noisyAudio = cleanAudio +√speechPower / noisePower) * noiseSegment;

听吵闹的语音信号。

声音(noisyAudio fs)

想象原始和噪声信号。

t = (1 / fs) *(0:元素个数(cleanAudio) 1);次要情节(2,1,1)情节(t, cleanAudio)标题(“干净的声音”网格)次要情节(2,1,2)情节(t, noisyAudio)标题(“嘈杂的声音”)包含(“时间(s)”网格)

语音去噪的目的就是去除语音信号的洗衣机噪声同时最小化输出演讲中不受欢迎的工件。

检查数据集

这个示例使用Mozilla常见的语音数据集的一个子集(1训练和测试的深度学习网络。数据集包含48 kHz的录音主题说短句子。下载并解压缩下载的文件的数据集。

url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/commonvoice.zip”;downloadFolder = tempdir;dataFolder = fullfile (downloadFolder,“无法推进”);如果~存在(dataFolder“dir”)disp (“下载数据集(956 MB)…”解压缩(url, downloadFolder)结束

使用audioDatastore为训练集来创建一个数据存储。加速运行时的性能为代价的,集reduceDataset真正的

adsTrain = audioDatastore (fullfile (dataFolder“火车”),“IncludeSubfolders”,真正的);reduceDataset =真正的;如果reduceDataset adsTrain = shuffle (adsTrain);adsTrain =子集(adsTrain 1:1000);结束

使用获得第一个文件的数据存储的内容。

[音频、adsTrainInfo] =阅读(adsTrain);

听语音信号。

声音(音频、adsTrainInfo.SampleRate)

画出语音信号。

图t = (1 / adsTrainInfo.SampleRate) *(0:元素个数(音频)1);情节(t,音频)标题(“例如语音信号”)包含(“时间(s)”网格)

深入学习系统概述

基本的深度学习培训计划如下所示。注意,因为演讲通常低于4 kHz,首先downsample清洁和嘈杂的音频信号到8 kHz,以减少网络的计算负载。预测和目标网络信号幅度谱的噪声和干净的音频信号,分别。网络的输出是去噪信号的幅度谱。回归网络使用的预测均方误差最小化的输入输出和输入之间的目标。去噪音频转换回时域使用的输出幅度谱和相位噪声信号(2]。

你变换频域的音频使用短时傅里叶变换(STFT),窗口长度为256样本,75%的重叠,和汉明窗。你减少光谱向量的大小129年下降相对应的频率样本负频率(因为时域语音信号是真实的,这不会导致任何信息丢失)。连续预测的输入由8嘈杂的STFT向量,以便每个STFT输出估计计算基于当前嘈杂的STFT和7以前吵了STFT向量。

STFT的目标和预测

本节说明如何生成目标和预测信号从一个培训文件。

首先,定义系统参数:

windowLength = 256;赢得=汉明(windowLength,“周期”);重叠=圆(0.75 * windowLength);ffTLength = windowLength;inputFs = 48 e3;fs = 8 e3;numFeatures = ffTLength / 2 + 1;numSegments = 8;

创建一个dsp.SampleRateConverter(DSP系统工具箱)对象将48 kHz音频8 kHz。

src = dsp.SampleRateConverter (“InputSampleRate”inputFs,“OutputSampleRate”fs,“带宽”,7920);

使用让数据存储的音频文件的内容。

音频=阅读(adsTrain);

确保音频长度的倍数采样率转换器大量毁灭的因素。

decimationFactor = inputFs / fs;L =地板(元素个数(音频)/ decimationFactor);音频=音频(1:decimationFactor * L);

将音频信号转换为8 kHz。

音频= src(音频);重置(src)

创建一个随机噪声段从洗衣机噪声向量。

randind =兰迪(元素个数(噪声)——元素个数(音频),[1]);noiseSegment =噪音(randind: randind +元素个数(音频)- 1);

添加噪声的语音信号的信噪比是0分贝。

noisePower =总和(noiseSegment。^ 2);cleanPower =总和(音频。^ 2);noiseSegment = noiseSegment。* sqrt (cleanPower / noisePower);noisyAudio =音频+ noiseSegment;

使用stft生成级STFT向量从原始和嘈杂的音频信号。

cleanSTFT = stft(音频,“窗口”,赢了,“OverlapLength”重叠,“FFTLength”,ffTLength);cleanSTFT = abs (cleanSTFT (numFeatures-1:最终,));noisySTFT = stft (noisyAudio,“窗口”,赢了,“OverlapLength”重叠,“FFTLength”,ffTLength);noisySTFT = abs (noisySTFT (numFeatures-1:最终,));

生成8-segment培训STFT预测信号从噪声中检测出来。连续预测是7段之间的重叠。

noisySTFT = [noisySTFT (: 1: numSegments - 1), noisySTFT);stftSegments = 0 (numFeatures numSegments、大小(noisySTFT 2)——numSegments + 1);指数= 1:尺寸(noisySTFT, 2) - numSegments + 1 stftSegments(:,:,索引)= (noisySTFT(:,指数:指数+ numSegments - 1));结束

设置目标和预测。最后这两个变量的维度的数量对应于不同的预测/目标对生成的音频文件。每个预测129 - 8,每个目标129 -是- 1。

目标= cleanSTFT;大小(目标)
ans =1×2129 544
预测= stftSegments;大小(预测)
ans =1×3129 8 544

使用高阵列提取特征

加快处理,提取语音段的特征序列中的所有音频文件数据存储阵列使用高。与内存中的数组,高阵列通常仍未鉴定的直到你所说的收集函数。这延迟评价使您能够快速处理大型数据集。当你最终请求输出使用收集,MATLAB结合排队的计算在可能的情况下,需要通过数据的最小数量。如果你有并行计算工具箱™,你可以在你当地的MATLAB会话使用高数组,或在本地平行池。您还可以运行高数组计算集群上如果你有MATLAB®服务器™安装平行。

首先,将数据存储到一个高的数组。

重置(adsTrain) T =高(adsTrain)
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
T = M×1高细胞数组{234480×1双}{210288×1双}{282864×1双}{292080×1双}{410736×1双}{303600×1双}{326640×1双}{233328×1双}::::

显示器显示的行数(对应数量的文件数据存储),M,尚不得而知。M是一个占位符,直到计算完成。

提取目标和预测STFT级从高表。这一行动创造了新的高数组变量在后续的计算中使用。这个函数HelperGenerateSpeechDenoisingFeatures执行步骤中已经强调了STFT的目标和预测部分。的cellfun命令适用于HelperGenerateSpeechDenoisingFeatures在数据存储每个音频文件的内容。

(目标,预测)= cellfun (@ (x) HelperGenerateSpeechDenoisingFeatures (x,噪音,src), T,“UniformOutput”、假);

使用收集评价目标和预测。

(目标,预测)=收集(目标,预测);
评估高表达式使用并行池“当地”:通过1对1:在42秒完成评估在1分36秒内完成

是一种很好的做法规范化所有功能为零均值和标准差统一。

计算预测的平均值和标准偏差和目标,分别用它们来规范化数据。

预测=猫({}):3,预测指标;noisyMean =意味着(预测(:));noisyStd =性病(预测(:));预测(:)=(预测(:)- noisyMean) / noisyStd;目标=猫({}):2、目标;cleanMean =意味着(目标(:));cleanStd =性病(目标(:));目标(,)=(目标(:)- cleanMean) / cleanStd;

重塑预测和目标所期望的维度深入学习网络。

预测=重塑(预测、大小(预测,1),大小(预测,2),1,大小(预测,3));目标=重塑(目标1 1、大小(目标1),大小(目标2));

您将使用1%的数据训练期间进行验证。验证是有用的检测场景网络过度拟合训练数据。

随机将数据分为训练集和验证集。

第1 = randperm(大小(预测,4));L =圆(0.99 *大小(预测,4));trainPredictors =预测(:,:,:,第1 (1:L));trainTargets =目标(:,:,:,第1 (1:L));validatePredictors =预测(:,:,:,第1 (L + 1:结束));validateTargets =目标(:,:,:,第1 (L + 1:结束));

语音去噪与完全连接层

你首先考虑去噪网络组成的完全连接层。完全连接层中的每个神经元连接到所有的激活与前一层。一个完全连接层增加输入权重矩阵,然后添加一个偏差向量。权重矩阵的尺寸和偏差向量是由层神经元的数量和上一层的激活数量。

定义网络的层。指定输入图像的大小NumFeatures——- - - - - -NumSegments由- 8(129 -在本例中)。定义两个隐藏的完全连接层,每1024个神经元。从纯粹的线性系统,遵循每个隐藏完全连接层与修正的线性单元(ReLU)层。批均值和标准差标准化层规范化的输出。添加一个完全连接层有129个神经元,紧随其后的是一个回归层。

层= [imageInputLayer ([numFeatures numSegments]) fullyConnectedLayer (1024) batchNormalizationLayer reluLayer fullyConnectedLayer (1024) batchNormalizationLayer reluLayer fullyConnectedLayer (numFeatures) regressionLayer];

接下来,指定的培训选项网络。集MaxEpochs3所以,网络使3通过训练数据。集MiniBatchSize128年所以网络看着128训练信号。指定情节作为“训练进步”生成块显示培训进展随着迭代次数的增加。集详细的禁用打印表输出对应于数据图中所示的命令行窗口。指定洗牌作为“every-epoch”洗牌训练序列,每一个时代的开始。指定LearnRateSchedule“分段”减少指定的学习速率的因素(0.9)每次一定数量的时代(1)已经过去了。集ValidationData验证预测和目标。集ValidationFrequency这样,验证每个时期均方误差计算一次。下面的例子使用了自适应时刻估计(亚当)解算器。

miniBatchSize = 128;选择= trainingOptions (“亚当”,“MaxEpochs”3,“InitialLearnRate”1 e-5“MiniBatchSize”miniBatchSize,“洗牌”,“every-epoch”,“阴谋”,“训练进步”,“详细”假的,“ValidationFrequency”、地板(大小(trainPredictors, 4) / miniBatchSize),“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.9,“LearnRateDropPeriod”,1“ValidationData”,{validatePredictors, validateTargets});

列车网络与指定的培训选项和层体系结构使用trainNetwork。因为训练集很大,培训过程可能需要几分钟时间。下载和加载一个从头pre-trained网络而不是训练网络,集doTraining

doTraining =真正的;如果doTraining denoiseNetFullyConnected = trainNetwork (trainPredictors、trainTargets层,选择);其他的url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/SpeechDenoising.zip”;downloadNetFolder = tempdir;netFolder = fullfile (downloadNetFolder,“SpeechDenoising”);如果~存在(netFolder“dir”)disp (文件下载pretrained网络(1 - 8 MB)……”解压缩(url, downloadNetFolder)结束s =加载(fullfile (netFolder“denoisenet.mat”));denoiseNetFullyConnected = s.denoiseNetFullyConnected;cleanMean = s.cleanMean;cleanStd = s.cleanStd;noisyMean = s.noisyMean;noisyStd = s.noisyStd;结束

计算权重的数量完全连接层的网络。

numWeights = 0;指数= 1:元素个数(denoiseNetFullyConnected.Layers)如果isa (denoiseNetFullyConnected.Layers(指数),“nnet.cnn.layer.FullyConnectedLayer”)numWeights = numWeights +元素个数(denoiseNetFullyConnected.Layers(指数).Weights);结束结束流(“权重的数量是% d。\ n”,numWeights);
权重的数量是2237440。

语音去噪与卷积层

考虑使用卷积层而不是完全连接的网络层(3]。一个二维卷积层滑动过滤器适用于输入。可变输入层的垂直、水平移动的过滤器输入,计算权重的点积和输入,然后添加一个偏见。卷积层通常由参数少于完全连接层。

定义中描述的完全卷积网络的层(3),包括16个回旋的层。第一15卷积层组3层,重复5次,与滤波宽度9、5、9、18和过滤器的数量,分别30和8。最后卷积层过滤宽度129和1过滤器。在这个网络中,旋转执行仅在一个方向(沿频率维度),沿着时间维度和过滤器宽度设置为1层除了第一个。类似于完全连接网络,卷积层ReLu和批量标准化层紧随其后。

层= [imageInputLayer ([numFeatures, numSegments]) convolution2dLayer(8[9], 18岁,“步”100年[1],“填充”,“相同”)batchNormalizationLayer reluLayer repmat (30岁的[convolution2dLayer (1 [5]“步”100年[1],“填充”,“相同”1)batchNormalizationLayer reluLayer convolution2dLayer([9], 8日“步”100年[1],“填充”,“相同”1)batchNormalizationLayer reluLayer convolution2dLayer([9], 18日“步”100年[1],“填充”,“相同”)batchNormalizationLayer reluLayer] 4 1) convolution2dLayer ([5 1] 30“步”100年[1],“填充”,“相同”1)batchNormalizationLayer reluLayer convolution2dLayer([9], 8日“步”100年[1],“填充”,“相同”129年)batchNormalizationLayer reluLayer convolution2dLayer ([1], 1,“步”100年[1],“填充”,“相同”)regressionLayer);

的培训选择是相同的选项完全连接网络,除了验证目标信号交换的尺寸与所期望的尺寸一致的回归层。

选择= trainingOptions (“亚当”,“MaxEpochs”3,“InitialLearnRate”1 e-5“MiniBatchSize”miniBatchSize,“洗牌”,“every-epoch”,“阴谋”,“训练进步”,“详细”假的,“ValidationFrequency”、地板(大小(trainPredictors, 4) / miniBatchSize),“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.9,“LearnRateDropPeriod”,1“ValidationData”{validatePredictors、交换(validateTargets [3 1 2 4])});

列车网络与指定的培训选项和层体系结构使用trainNetwork。因为训练集很大,培训过程可能需要几分钟时间。下载和加载一个从头pre-trained网络而不是训练网络,集doTraining

doTraining =真正的;如果doTraining denoiseNetFullyConvolutional = trainNetwork (trainPredictors排列(trainTargets[3 1 2 4]),层,选项);其他的url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/SpeechDenoising.zip”;downloadNetFolder = tempdir;netFolder = fullfile (downloadNetFolder,“SpeechDenoising”);如果~存在(netFolder“dir”)disp (文件下载pretrained网络(1 - 8 MB)……”解压缩(url, downloadNetFolder)结束s =加载(fullfile (netFolder“denoisenet.mat”));denoiseNetFullyConvolutional = s.denoiseNetFullyConvolutional;cleanMean = s.cleanMean;cleanStd = s.cleanStd;noisyMean = s.noisyMean;noisyStd = s.noisyStd;结束

计算权重的数量完全连接层的网络。

numWeights = 0;指数= 1:元素个数(denoiseNetFullyConvolutional.Layers)如果isa (denoiseNetFullyConvolutional.Layers(指数),“nnet.cnn.layer.Convolution2DLayer”)numWeights = numWeights +元素个数(denoiseNetFullyConvolutional.Layers(指数).Weights);结束结束流(“在卷积层权重的数量是% d \ n”,numWeights);
在卷积层权重的数量是31812

网络测试去噪

读取测试数据集。

adsTest = audioDatastore (fullfile (dataFolder“测试”),“IncludeSubfolders”,真正的);

从数据存储中读取一个文件的内容。

[cleanAudio, adsTestInfo] =阅读(adsTest);

确保音频长度的倍数采样率转换器大量毁灭的因素。

L =地板(元素个数(cleanAudio) / decimationFactor);cleanAudio = cleanAudio (1: decimationFactor * L);

将音频信号转换为8 kHz。

cleanAudio = src (cleanAudio);重置(src)

在这个测试阶段,你腐败的演讲与洗衣机噪声不习惯在训练阶段。

噪音= audioread (“洗衣机- 16 - 8 mono - 200 - secs.mp3”);

创建一个随机噪声段从洗衣机噪声向量。

randind =兰迪(元素个数(噪声)——元素个数(cleanAudio) [1]);noiseSegment =噪音(randind: randind +元素个数(cleanAudio) - 1);

添加噪声的语音信号的信噪比是0分贝。

noisePower =总和(noiseSegment。^ 2);cleanPower =总和(cleanAudio。^ 2);noiseSegment = noiseSegment。* sqrt (cleanPower / noisePower);noisyAudio = cleanAudio + noiseSegment;

使用stft生成级STFT向量从嘈杂的音频信号。

noisySTFT = stft (noisyAudio,“窗口”,赢了,“OverlapLength”重叠,“FFTLength”,ffTLength);noisyPhase =角(noisySTFT (numFeatures-1:最终,));noisySTFT = abs (noisySTFT (numFeatures-1:最终,));

生成8-segment培训STFT预测信号从噪声中检测出来。连续预测是7段之间的重叠。

noisySTFT = [noisySTFT (: 1: numSegments-1) noisySTFT);预测= 0 (numFeatures numSegments、大小(noisySTFT 2)——numSegments + 1);指数= 1:(大小(noisySTFT 2)——numSegments + 1)预测(:,:,索引)= noisySTFT(:,指数:指数+ numSegments - 1);结束

规范化的预测平均值和标准偏差计算在训练阶段。

预测(:)=(预测(:)- noisyMean) / noisyStd;

计算去噪STFT级使用预测两个训练网络。

预测=重塑(预测,[numFeatures numSegments 1、大小(预测,3)));STFTFullyConnected =预测(denoiseNetFullyConnected、预测);STFTFullyConvolutional =预测(denoiseNetFullyConvolutional、预测);

规模的输出中使用的平均值和标准偏差训练阶段。

STFTFullyConnected (:) = cleanStd * STFTFullyConnected (:) + cleanMean;STFTFullyConvolutional (:) = cleanStd * STFTFullyConvolutional (:) + cleanMean;

将片面STFT STFT为中心。

STFTFullyConnected = STFTFullyConnected。”。* exp (1 j * noisyPhase);STFTFullyConnected =[连词(STFTFullyConnected (end-1: 1:2,:));STFTFullyConnected];STFTFullyConvolutional =挤压(STFTFullyConvolutional)。* exp (1 j * noisyPhase);STFTFullyConvolutional =[连词(STFTFullyConvolutional (end-1: 1:2,:));STFTFullyConvolutional];

计算去噪语音信号。istft执行逆STFT。使用阶段的嘈杂的STFT向量重构的时域信号。

denoisedAudioFullyConnected = istft (STFTFullyConnected,“窗口”,赢了,“OverlapLength”重叠,“FFTLength”ffTLength,“ConjugateSymmetric”,真正的);denoisedAudioFullyConvolutional = istft (STFTFullyConvolutional,“窗口”,赢了,“OverlapLength”重叠,“FFTLength”ffTLength,“ConjugateSymmetric”,真正的);

情节干净、嘈杂和去噪的音频信号。

t = (1 / fs) *(0:元素个数(denoisedAudioFullyConnected) 1);图次要情节(4 1 1)情节(t, cleanAudio(1:元素个数(denoisedAudioFullyConnected)))标题(“干净的演讲》网格)次要情节(1、2)情节(t, noisyAudio(1:元素个数(denoisedAudioFullyConnected)))标题(《吵闹的演讲》网格)次要情节(4 1 3)情节(t, denoisedAudioFullyConnected)标题(“去噪语音(完全连接层)”网格)次要情节(4,4)情节(t, denoisedAudioFullyConvolutional)标题(“去噪语音(卷积层)”网格)包含(“时间(s)”)

画出干净,噪音大,而且去噪谱图。

h =图;次要情节(4 1 1)谱图(ffTLength cleanAudio,赢,重叠,fs);标题(“干净的演讲》网格)次要情节(1、2)谱图(ffTLength noisyAudio,赢,重叠,fs);标题(《吵闹的演讲》网格)次要情节(4 1 3)谱图(ffTLength denoisedAudioFullyConnected,赢,重叠,fs);标题(“去噪语音(完全连接层)”网格)次要情节(4,4)谱图(ffTLength denoisedAudioFullyConvolutional,赢,重叠,fs);标题(“去噪语音(卷积层)”网格)p = get (h,“位置”);集(h,“位置”,[p (1) 65 (3) 800]);

听吵闹的演讲。

声音(noisyAudio fs)

听去噪语音与完全连接网络层。

声音(denoisedAudioFullyConnected fs)

听去噪语音与卷积网络层。

声音(denoisedAudioFullyConvolutional fs)

听干净的演讲。

声音(cleanAudio fs)

您可以测试数据存储通过调用多个文件testDenoisingNets。函数产生的时域和频域块突出的地位,并返回干净、吵闹,和去噪的音频信号。

[cleanAudio, noisyAudio denoisedAudioFullyConnected denoisedAudioFullyConvolutional] = testDenoisingNets (adsTest、denoiseNetFullyConnected denoiseNetFullyConvolutional, noisyMean, noisyStd, cleanMean, cleanStd);

实时应用程序

这个过程在前一节中通过整个噪声信号的频谱预测。这是不适合实时应用低延迟的要求。

运行speechDenoisingRealtimeApp例如如何模拟流,实时去噪网络的版本。完全连接的应用程序使用网络层。音频帧的长度等于STFT跳的大小,也就是0.25 * 256 = 64个样本。

speechDenoisingRealtimeApp启动一个用户界面(UI)设计与仿真。用户界面允许您调整参数和结果立即反映在模拟。您还可以启用/禁用一个噪声门上运作,去噪输出进一步减少噪音,以及调整攻击时间,发布时间和阈值的噪声门。你可以听吵闹的,清洗或运用音频从UI。

情节清洁范围,噪声和去噪信号,以及噪声门的增益。

引用

[1]https://voice.mozilla.org/en

[2]“深度学习的语音去噪实验”,叮,巴黎Smaragdis Minje Kim INTERSPEECH, 2014年。

[3]“语音增强的一个完全卷积神经网络”,Se Rim公园,金赢得Lee INTERSPEECH, 2017年。