这个例子展示了如何使用深度学习网络分离语音信号。
鸡尾酒会效应指的是大脑在过滤掉其他声音和背景噪音的同时专注于单个说话者的能力。人类在鸡尾酒会问题上表现得很好。这个例子展示了如何使用深度学习网络从一男一女同时讲话的语音组合中分离出单个发言者。
在详细介绍示例之前,您将下载一个预先训练过的网络和4个音频文件。
url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/CocktailPartySourceSeparation.zip”;downloaddnetfolder = tempdir;netfolder = fullfile(downloadnetfolder,“CocktailPartySourceSeparation”);如果~存在(netFolder“dir”) disp (下载预先训练的网络和音频文件(5个文件- 24.5 MB)…解压缩(url, downloadNetFolder)结束
加载音频文件,包含男性和女性的语音采样在4千赫。请单独听音频文件以作参考。
[mSpeech, Fs] = audioread (fullfile (netFolder,“MaleSpeech-16-4-mono-20secs.wav”));声音(mSpeech Fs)
[fSpeech] = audioread (fullfile (netFolder,“FemaleSpeech-16-4-mono-20secs.wav”));声音(FSPeech,FS)
结合两种语言来源。确保资源在混合中有同等的力量。对混合进行归一化,使其最大振幅为1。
mspeech = mspeech / norm(mspeech);fspeech = fspeech / norm(fspeech);ampadj = max(abs([mspeech; fspeech]));mspeech = mspeech / ampadj;fspeech = fspeech / ampadj;mix = mspeech + fspeech;mix = mix ./ max(abs(mix));
形象化原始和混合信号。听混合语音信号。这个例子展示了一个从语音混合中提取男性和女性源的源分离方案。
t =(0:元素个数(混合)1)* (1 / Fs);图(1)subplot(3,1,1) plot(t,mSpeech) title(“男性演讲》网格)在次要情节(3,1,2)情节(t, fSpeech)标题(“女性语言”网格)在次要情节(3、1,3)情节(t,混合)标题(“语音组合”)包含(“时间(s)”网格)在
听混音。
声音(混合,Fs)
使用stft
可视化雄性,母,混合语音信号的时频(TF)表示。使用长度128,FFT长度为128的Hann窗口,重叠长度为96。
WindowLength = 128;FFTLength = 128;OverlapLength = 96;赢得=损害(WindowLength,“周期”);图(2)subplot(3,1,1) stft(mSpeech, Fs,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“男性演讲》) subplot(3,1,2) stft(fSpeech, f, f)“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“女性语言”) subplot(3,1,3) stft(mix, Fs,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“混合”演讲)
应用TF掩模已被证明是一种有效的方法从竞争的声音中分离所需的音频信号。TF掩模是一个与底层STFT大小相同的矩阵。掩模与底层STFT逐单元相乘,以隔离所需的源。TF掩码可以是二进制的,也可以是软的。
在理想的二进制掩模中,掩模单元值为0或1.如果所需源的功率大于特定TF单元格处的其他源的组合电源,则该单元将设置为1.否则,该单元格设置为0。
为男性演讲者计算理想的二元掩模,然后将其可视化。
P_M = stft (mSpeech,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);p_f = stft(fspeech,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);[p_mix,f] = stft(混合,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);binarymask = abs(p_m)> = abs(p_f);图(3)PlotMask(BinaryMask,WindowLength- overtaplength,F,FS)
通过将混合STFT乘以男性说话人的二进制掩码来估计男性语音STFT。通过将混合STFT乘以男性说话人二进制掩码的倒数来估计女性语音STFT。
P_M_Hard = P_mix .* binarmask;P_F_Hard = P_mix .* (1-binaryMask);
使用逆短时间FFT (ISTFT)估计男性和女性音频信号。可视化估计和原始信号。听估计的男性和女性的语音信号。
mspeech = istft(P_M_Hard,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);fspeech = istft(P_F_Hard,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);图(4)subplot(2,2,1) plot(t,mSpeech) axis([t(1) t(end) -1 1]) title(“原来男性演讲》网格)在subplot(2,2,3) plot(t, mspeech - hard) axis([t(1) t(end) -1 1]) xlabel(“时间(s)”)标题(“估计男性演讲》网格)在subplot(2,2,2) plot(t,fSpeech) axis([t(1) t(end) -1 1]) title(“原始女性演讲”网格)在子图(2,2,4)绘图(t,fspeech_hard)轴([t(1)t(end)-1 1])标题(“估计女性演讲”)包含(“时间(s)”网格)在
声音(mSpeech_Hard Fs)
声音(fSpeech_Hard Fs)
在软掩模中,TF掩模单元值等于所需的源功率与总混合功率的比值。TF细胞的值在[0,1]范围内。
计算公喇叭的软掩码。通过将混合STFT乘以男性扬声器的软掩模来估计男性扬声器的短时傅里叶变换。通过将混合STFT乘以女性发言人的软掩模来估计女性发言人的STFT。
使用ISTFT估计男性和女性音频信号。
softMask = abs (P_M)。/ (abs (P_F) + abs (P_M) + eps);P_M_Soft = P_mix .* softMask;P_F_Soft = P_mix .* (1-softMask);mSpeech_Soft = istft (P_M_Soft,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);fSpeech_Soft = istft (P_F_Soft,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);
可视化估计和原始信号。听估计的男性和女性的语音信号。注意,结果非常好,因为掩码是在完全了解分离的男性和女性信号的情况下创建的。
图(5)subplot(2,2,1) plot(t,mSpeech) axis([t(1) t(end) -1 1]) title(“原来男性演讲》网格)在subplot(2,2,3) plot(t, mspeech - soft) axis([t(1) t(end) -1 1]) title(“估计男性演讲》网格)在subplot(2,2,2) plot(t,fSpeech) axis([t(1) t(end) -1 1]) xlabel(“时间(s)”)标题(“原始女性演讲”网格)在subplot(2,2,4) plot(t, fspeech - soft) axis([t(1) t(end) -1 1]) xlabel(“时间(s)”)标题(“估计女性演讲”网格)在
声音(mSpeech_Soft Fs)
声音(fSpeech_Soft Fs)
在该示例中,深度学习网络的目标是估计上述理想的软掩模。网络估计对应于男性扬声器的掩模。女性扬声器掩模直接来自阳面罩。
基本的深度学习培训方案如下所示。预测器是混合(公+雌性)音频的幅度谱。目标是与男性扬声器相对应的理想软面罩。回归网络使用预测器输入来最小化其输出和输入目标之间的均方误差。在输出时,音频STFT使用输出幅度频谱和混合信号的相位转换回时域。
您使用短时傅里叶变换(STFT)将音频转换为频域,窗口长度为128个样本,重叠为127,以及HANN窗口。通过丢弃对应于负频率的频率样本来将光谱矢量的大小降低到65(因为时域语音信号是真实的,这不会导致任何信息丢失)。预测器输入由连续的20个STFT向量组成。输出是65×20软掩模。
你用训练过的网络来估计男性的讲话。输入到训练网络的是混合(男性+女性)语音音频。
本节演示如何从训练数据集生成目标和预测器信号。
阅读训练信号,分别由男性和女性演讲者的约400秒的讲话组成,采样频率为4khz。采用低采样率来提高训练速度。修剪训练信号,使它们的长度相同。
maleTrainingAudioFile =“malespeech - 16 - 4 - mono - 405 secs.wav”;femaleTrainingAudioFile =“femalespeech - 16 - 4 - mono - 405 secs.wav”;maleSpeechTrain = audioread (fullfile (netFolder maleTrainingAudioFile));femaleSpeechTrain = audioread (fullfile (netFolder femaleTrainingAudioFile));L = min(长度(maleSpeechTrain), (femaleSpeechTrain));maleSpeechTrain = maleSpeechTrain (1: L);femaleSpeechTrain = femaleSpeechTrain (1: L);
读取验证信号,其中包括来自男性和女性扬声器的20秒的演讲,在4 kHz上采样。修剪验证信号,以使它们具有相同的长度
maleValidationAudioFile =“MaleSpeech-16-4-mono-20secs.wav”;femaleValidationAudioFile =“FemaleSpeech-16-4-mono-20secs.wav”;maleSpeechValidate = audioread (fullfile (netFolder maleValidationAudioFile));femaleSpeechValidate = audioread (fullfile (netFolder femaleValidationAudioFile));L = min(长度(maleSpeechValidate), (femaleSpeechValidate));maleSpeechValidate = maleSpeechValidate (1: L);femaleSpeechValidate = femaleSpeechValidate (1: L);
将训练信号缩放到相同的功率。将验证信号放大到相同的功率。
maleSpeechTrain = maleSpeechTrain /规范(maleSpeechTrain);femaleSpeechTrain = femaleSpeechTrain /规范(femaleSpeechTrain);ampAdj = max (abs ([maleSpeechTrain; femaleSpeechTrain]));maleSpeechTrain = maleSpeechTrain / ampAdj;femaleSpeechTrain = femaleSpeechTrain / ampAdj;maleSpeechValidate = maleSpeechValidate /规范(maleSpeechValidate);femaleSpeechValidate = femaleSpeechValidate /规范(femaleSpeechValidate);ampAdj = max (abs ([maleSpeechValidate; femaleSpeechValidate]));maleSpeechValidate = maleSpeechValidate / ampAdj;femaleSpeechValidate = femaleSpeechValidate / ampAdj;
创建培训和验证“鸡尾酒会”混合。
mixTrain =男性语音列车+女性语音列车;mixTrain = mixTrain / max(mixTrain);mixValidate = maleSpeechValidate + femaleSpeechValidate;mixValidate = mixValidate / max(mixValidate);
STFTs生成培训。
WindowLength = 128;FFTLength = 128;OverlapLength = 128 - 1;Fs = 4000;赢得=损害(WindowLength,“周期”);p_mix0 = stft(混音器,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);P_M = abs (stft (maleSpeechTrain“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”));p_f = abs(stft(FemaleSpTreain,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”));
取混合STFT的对数。用平均值和标准差对值进行归一化。
P_mix = log(abs(P_mix0) + eps);议员=意味着(P_mix (:));SP =性病(P_mix (:));P_mix = (P_mix - MP) / SP;
生成验证STFTs。取混合STFT的对数。用平均值和标准差对值进行归一化。
p_val_mix0 = stft(mixvalidate,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);P_Val_M = abs (stft (maleSpeechValidate“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”));P_Val_F = abs (stft (femaleSpeechValidate“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”));P_Val_mix = log(abs(P_Val_mix0) + eps);议员=意味着(P_Val_mix (:));SP =性病(P_Val_mix (:));P_Val_mix = (P_Val_mix - MP) / SP;
当神经网络的输入具有合理的平滑分布并被归一化时,神经网络的训练是最容易的。为了检查数据分布是否平滑,绘制训练数据的STFT值的直方图。
图(6)直方图(P_mix“EdgeColor”,“没有”,“归一化”,“pdf”)包含(“输入值”) ylabel (“概率密度”)
计算训练软掩码。在训练网络时,将此掩模作为目标信号。
maskTrain = P_M ./ (P_M + P_F + eps);
计算验证软掩码。使用此掩码来评估经过训练的网络发出的掩码。
maskValidate = P_Val_M ./ (P_Val_M + P_Val_F + eps);
为了检查目标数据的分布是否平滑,绘制训练数据掩模值的直方图。
图(7)直方图(maskTrain“EdgeColor”,“没有”,“归一化”,“pdf”)包含(“输入值”) ylabel (“概率密度”)
从预测器和目标信号创建大小为(65,20)的块。为了得到更多的训练样本,在连续的块之间使用10个分段的重叠。
seqLen = 20;seqOverlap = 10;mixSequences = 0 (1 + FFTLength/2,seqLen,1,0);maskSequences = 0 (1 + FFTLength/2,seqLen,1,0);loc = 1;而loc% #好吧maskSequences(:,:,:,结束+ 1)= maskTrain (:, loc: loc + seqLen-1);% #好吧loc = loc + seqOverlap;结束
从验证预测器和目标信号创建大小为(65,20)的块。
mixValSequences = 0 (1 + FFTLength/2,seqLen,1,0);maskValSequences = 0 (1 + FFTLength/2,seqLen,1,0);seqOverlap = seqLen;loc = 1;而loc% #好吧maskValsequences(::::,end + 1)= maskvalidate(:,loc:loc + seqlen-1);% #好吧loc = loc + seqOverlap;结束
重塑训练和验证信号。
mixsequencest =重塑(混音序列,[1 1(1 + fftlength / 2)* seqlen大小(mixsequences,4)]);mixsequencesv =重塑(mixvalsequencess,[1(1 + fftlength / 2)* seqlen大小(mixvalsequences,4)]);maskSequencest = RESHAPE(MASKSEQUENCES,[1 1(1 + FFTLENTH / 2)* SEQLEN尺寸(masksequences,4)]);MaskSequencesV = RESHAPE(MaskValsequences,[1(1 + FFTLength / 2)* SEQLEN尺寸(MaskValsequences,4)]);
定义网络的层次。指定输入大小为尺寸为1 × 1 × 1300的图像。定义两个隐藏的完全连接层,每个层有1300个神经元。跟随每一个隐藏的完全连接的层与乙状体层。批处理归一化层对输出的平均值和标准偏差进行归一化。添加一个有1300个神经元的完全连接层,然后是一个回归层。
numNodes = (1 + FFTLength/2) * seqLen;层= [......imageInputLayer([1 1 (1 + FFTLength/2)*seqLen],“归一化”,“没有任何”) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(0) regressionLayer;
指定网络的训练选项。集MaxEpochs
来3.
因此,网络使三次通过训练数据。集MiniBatchSize
来64
这样网络才能看到64
每次训练信号。集情节
来训练进步
生成随着迭代次数增加而显示训练进度的图。集详细的
来假
禁用将与绘图中显示的数据相对应的表输出打印到命令行窗口。集洗牌
来every-epoch
在每个时代开始时播放训练序列。集LearnRateSchedule
来分段
每经过一定数量的纪元(1),学习率就降低一个指定的因子(0.1)。集ValidationData
到验证预测因子和目标。集验证频繁
以便每个历元计算一次验证均方误差。本例使用自适应矩估计(ADAM)求解器。
maxepochs = 3;minibatchsize = 64;选项=培训选项(“亚当”,......“MaxEpochs”,maxepochs,......“MiniBatchSize”miniBatchSize,......“SequenceLength”,“最长”,......“洗牌”,“every-epoch”,......“详细”0,......“阴谋”,“培训 - 进展”,......“验证职业”、地板(大小(mixSequencesT, 4) / miniBatchSize),......“ValidationData”{mixSequencesV, maskSequencesV},......“LearnRateSchedule”,“分段”,......“LearnRateDropFactor”, 0.9,......“LearnRateDropPeriod”1);
使用指定的训练选项和层架构来训练网络trainNetwork
.由于训练集很大,训练过程可能需要几分钟。要加载预先训练的网络,请设置doTraining
来假
.
dotraining = true;如果doTraining CocktailPartyNet = trainNetwork(mixSequencesT,maskSequencesT,layers,options);其他的s =负载(“CocktailPartyNet.mat”);CocktailPartyNet = s.CocktailPartyNet;结束
将验证预测器传递给网络。输出是估计的掩码。重塑估计掩码。
估计Massk0 =预测(Cocktailpartynet,MixSequencesV);估计masks0 =估计masks0。';估计阵列0 = REHAPE(估计MASKS0,1 + FFTLENGHER长/ 2,NUMER(估计MASKS0)/(1 + FFTLENGHENT / 2));
绘制实际掩码和预期掩码之间的误差直方图。
图(8)直方图(maskValSequences(:) - estimatedMasks0(:),“EdgeColor”,“没有”,“归一化”,“pdf”)包含(“面具错误”) ylabel (“概率密度”)
估计男性和女性的软口罩。通过对软掩码设置阈值来估计公、母二进制掩码。
softmalemask =估计masks0;SoftFemaleMask = 1 - SoftMaleMask;
缩短混合STFT以匹配估计掩模的大小。
P_Val_mix0 = P_Val_mix0(:, 1:尺寸(SoftMaleMask 2));
将混合短时傅里叶变换与男性软掩模相乘得到估计的男性语音短时傅里叶变换。
P_Male = P_Val_mix0 .* SoftMaleMask;
使用ISTFT得到估计的男性音频信号。音频。
maleSpeech_est_soft = istft (P_Male,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“ConjugateSymmetric”,真的,......“FrequencyRange”,“单向的”);malespeech_est_soft = malespeech_est_soft / max(abs(malespeech_est_soft));
可视化估计和原始的男性语言信号。听取估计的软片男性演讲。
=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);图(9)subplot(2,1,1) plot(t,maleSpeechValidate(range)) title(“原来男性演讲》)包含(“时间(s)”网格)在次要情节(2,1,2)情节(t, maleSpeech_est_soft(范围)包含(“时间(s)”)标题(“估计男性语言(软面具)”网格)在
声音(malespeech_est_soft(范围),fs)
将混合短时傅里叶变换与女性软掩模相乘得到估计的女性语音短时傅里叶变换。使用ISTFT得到估计的男性音频信号。音频。
P_Female = P_Val_mix0 .* sofemalask;femaleSpeech_est_soft = istft (P_Female,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”,fftlength,“ConjugateSymmetric”,真的,......“FrequencyRange”,“单向的”);femaleSpeech_est_soft = femaleSpeech_est_soft / max(femaleSpeech_est_soft);
可视化估计和原始的女性信号。听取估计的女性言论。
range = (numel(win):numel(maleSpeech_est_soft) - numel(win));t = range * (1/Fs);图(10)subplot(2,1,1) plot(t,femaleSpeechValidate(range)) title(“原始女性演讲”网格)在次要情节(2,1,2)情节(t, femaleSpeech_est_soft(范围)包含(“时间(s)”)标题(“估计女性语言(软面具)”网格)在
声音(femaleSpeech_est_soft(范围)、Fs)
通过对软掩码设置阈值来估计公、母二进制掩码。
HardMaleMask = SoftMaleMask >= 0.5;HardFemaleMask = SoftMaleMask < 0.5;
将混合短时傅里叶变换乘以男性二值掩模得到估计的男性语音短时傅里叶变换。使用ISTFT得到估计的男性音频信号。音频。
P_Male = P_Val_mix0 .* HardMaleMask;maleSpeech_est_hard = istft (P_Male,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“ConjugateSymmetric”,真的,......“FrequencyRange”,“单向的”);maleSpeech_est_hard = maleSpeech_est_hard / max(maleSpeech_est_hard);
可视化估计和原始的男性语言信号。听估计二元掩模男性讲话。
=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);图(11)subplot(2,1,1) plot(t,maleSpeechValidate(range)) title(“原来男性演讲》网格)在次要情节(2,1,2)情节(t, maleSpeech_est_hard(范围)包含(“时间(s)”)标题(“估计男性语言(二元面具)”网格)在
声音(malespeech_est_hard(范围),fs)
将混合短时傅里叶变换乘以女性二进制掩码得到估计的男性语音短时傅里叶变换。使用ISTFT得到估计的男性音频信号。音频。
P_Female = P_Val_mix0 .* HardFemaleMask;femaleSpeech_est_hard = istft (P_Female,“窗口”, 赢,'overlaplencth'OverlapLength,......“FFTLength”FFTLength,“ConjugateSymmetric”,真的,......“FrequencyRange”,“单向的”);FemaleSpeech_EST_HARD = FEMALESPEECH_EST_HARD / MAX(FEMALESPECH_EST_HARD);
形象化估计和原始的女性语言信号。听取估计的女性言论。
=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);图(12)subplot(2,1,1) plot(t,femaleSpeechValidate(range)) title(“原始女性演讲”网格)在次要情节(2,1,2)情节(t, femaleSpeech_est_hard(范围)标题(“估计女性言语(二元掩码)”网格)在
声音(femaleSpeech_est_hard(范围)、Fs)
比较混合、原始女性和男性、估计女性和男性的一秒片段的STFTs。
范围= 7E4:7.4E4;图(13)STFT(MixValidate(范围),FS,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“混合STFT”)
图(14)次要情节(3,1,1)stft (maleSpeechValidate(范围),Fs,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“男性STFT(实际)”次要情节(3、1、2)stft (maleSpeech_est_soft(范围),Fs,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);次要情节(3,1,3)stft (maleSpeech_est_hard(范围),Fs,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(男性STFT(估计-二元掩模));
图(15)子图(3,1,1)stft(FemaleSpeCheValidate(范围),FS,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“女性STFT(实际)”次要情节(3、1、2)stft (femaleSpeech_est_soft(范围),Fs,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“女性STFT(估计-软面膜)”次要情节(3,1,3)stft (femaleSpeech_est_hard(范围),Fs,“窗口”, 赢,'overlaplencth',64,......“FFTLength”FFTLength,“FrequencyRange”,“单向的”);标题(“雌性Stft(估计 - 二元面膜)”)
[1]卷积深神经网络中的“概率二进制掩模鸡尾酒派对源分离”,Andrew J.R. Simpson,2015。