鸡尾酒会使用深度学习网络进行源分离

这个例子展示了如何使用深度学习网络来分离语音信号。

介绍

鸡尾酒会效应指的是大脑在过滤其他声音和背景噪音的同时,将注意力集中在一个演讲者身上的能力。人类在鸡尾酒会上表现得很好。这个例子展示了如何使用一个深度学习网络将单个的说话者从一个男性和一个女性同时说话的混合语音中分离出来。

问题总结

加载音频文件包含男性和女性语音采样在4khz。个别收听音频文件以供参考。

[mSpeech, Fs] = audioread (“MaleSpeech-16-4-mono-20secs.wav”);声音(mSpeech Fs)
[fSpeech] = audioread (“FemaleSpeech-16-4-mono-20secs.wav”);声音(fSpeech Fs)

合并两个语音源。确保电源在混合中具有同等的功率。将混合信号归一化,使其最大振幅为1。

mSpeech = mSpeech /规范(mSpeech);fSpeech = fSpeech /规范(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);figure(1) subplot(3,1,1) plot(t,mSpeech)“男性演讲》网格)次要情节(3,1,2)情节(t, fSpeech)标题(“女性语言”网格)次要情节(3、1,3)情节(t,混合)标题(“语音组合”)包含(“时间(s)”网格)

听混合音频。

声音(混合,Fs)

时频表示

使用stft将男性、女性和混合语音信号的时频(TF)表示可视化。使用长度为128的Hann窗口,FFT长度为128,重叠长度为96。

WindowLength = 128;FFTLength = 128;OverlapLength = 96;赢得=损害(WindowLength,“周期”);图(2)次要情节(3,1,1)stft (mSpeech Fs,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength)标题(“男性演讲》次要情节(3、1、2)stft (fSpeech Fs,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength)标题(“女性语言”次要情节(3,1,3)stft(混合、Fs、“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength)标题(“混合”演讲)

使用理想时频掩模进行源分离

TF掩模的应用已被证明是一种有效的方法来分离所需的音频信号从竞争的声音。TF掩码是与底层STFT大小相同的矩阵。掩码与底层STFT逐个元素相乘,以隔离所需的源。TF掩码可以是二进制的,也可以是软的。

使用理想的二进制掩码进行源分离

在理想的二进制掩码中,掩码单元的值不是0就是1。如果所需源的功率大于特定TF单元上其他源的总功率,则将该单元设置为1。否则,单元格被设置为0。

计算理想的二进制掩码为男性发言者,然后可视化它。

P_M = stft (mSpeech,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);P_F = stft (fSpeech,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);[P_mix F] = stft(混合,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);binaryMask = abs(P_M) >= abs(P_F);图(3)plotMask(binaryMask,WindowLength - OverlapLength,F,Fs)

通过将混合STFT乘以男性说话者的二进制掩码来估计男性说话者的STFT。通过将混合STFT乘以男性说话者的二进制掩码的倒数来估计女性说话者的STFT。

P_M_Hard = P_mix .*二进制掩码;P_F_Hard = P_mix .* (1-binaryMask);

利用反短时FFT (ISTFT)估计男性和女性的音频信号。可视化估计信号和原始信号。听估计的男性和女性的语音信号。

mspeech h_hard = istft(P_M_Hard,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);fSpeech_Hard = istft (P_F_Hard,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);figure(4) subplot(2,2,1) plot(t,mSpeech)轴([t(1) t(end) -1]) title(“原来男性演讲》网格)subplot(2,2,3) plot(t, mspeech h_hard)轴([t(1) t(end) -1]) xlabel(“时间(s)”)标题(“估计男性演讲》网格)(2,2,2) plot(t,fSpeech)轴([t(1) t(end) -1])“原始女性讲话”网格)subplot(2,2,4) plot(t, fspeech h_hard)轴([t(1) t(end) -1])“估计女性演讲》)包含(“时间(s)”网格)

声音(mSpeech_Hard Fs)
声音(fSpeech_Hard Fs)

使用理想的软掩模进行源分离

在软掩模中,TF掩模单元的值等于所需的源功率与总混合功率的比值。TF单元格的值范围为[0,1]。

计算男性扬声器的软掩模。通过将混合的STFT乘以男性扬声器的软掩模来估计男性扬声器的STFT。通过将混合后的STFT乘以女扬声器的软掩模来估计女扬声器的STFT。

使用ISTFT估计男性和女性的音频信号。

softMask = abs (P_M)。/ (abs (P_F) + abs (P_M) + eps);P_M_Soft = P_mix .*软掩码;P_F_Soft = P_mix .* (1-softMask);mSpeech_Soft = istft (P_M_Soft,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);fSpeech_Soft = istft (P_F_Soft,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);

可视化估计信号和原始信号。听估计的男性和女性的语音信号。注意,结果是非常好的,因为面具是在充分了解分离的男性和女性信号的情况下创建的。

figure(5) subplot(2,2,1) plot(t,mSpeech)轴([t(1) t(end) -1]) title(“原来男性演讲》网格)subplot(2,2,3) plot(t, mspeech h_soft)轴([t(1) t(end) -1]) title(“估计男性演讲》网格)subplot(2,2,2) plot(t,fSpeech)轴([t(1) t(end) -1]) xlabel(“时间(s)”)标题(“原始女性讲话”网格)subplot(2,2,4) plot(t, fspeech h_soft)轴([t(1) t(end) -1]) xlabel(“时间(s)”)标题(“估计女性演讲》网格)

声音(mSpeech_Soft Fs)
声音(fSpeech_Soft Fs)

使用深度学习的掩码估计

本例中深度学习网络的目标是估计上面描述的理想软掩码。网络估计与男性说话者对应的掩码。该女扬声器掩模直接派生自该男性掩模。

基本深度学习培训方案如下图所示。预测器是混合(男性+女性)音频的幅度谱。目标是理想的软面具对应的男性发言者。回归网络使用预测器输入来最小化其输出与输入目标之间的均方误差。在输出端,利用输出的幅度谱和混合信号的相位将音频STFT转换回时域。

使用短时傅里叶变换(STFT)将音频转换为频域,窗口长度为128个样本,重叠为127个,还有一个Hann窗口。通过删除对应于负频率的频率样本(因为时域语音信号是真实的,这不会导致任何信息丢失),可以将谱向量的大小减小到65。预测器输入由20个连续的STFT向量组成。输出是一个65×20的软掩码。

你使用训练过的网络来估计男性的语言。输入到训练网络的是混合(男性+女性)语音音频。

STFT的目标和预测器

本节演示如何从训练数据集生成目标和预测信号。

分别以4khz采样,读取由男性和女性说话者大约400秒的语音组成的训练信号。低采样率被用来加快训练。修剪训练信号,使它们的长度相等。

maleTrainingAudioFile =“malespeech - 16 - 4 - mono - 405 secs.wav”;femaleTrainingAudioFile =“femalespeech - 16 - 4 - mono - 405 secs.wav”;maleSpeechTrain = audioread (maleTrainingAudioFile);femaleSpeechTrain = audioread (femaleTrainingAudioFile);L = min(长度(maleSpeechTrain), (femaleSpeechTrain));maleSpeechTrain = maleSpeechTrain (1: L);femaleSpeechTrain = femaleSpeechTrain (1: L);

分别以4khz采样,读取由男性和女性说话者大约20秒的语音组成的验证信号。修剪验证信号,使它们具有相同的长度

maleValidationAudioFile =“MaleSpeech-16-4-mono-20secs.wav”;femaleValidationAudioFile =“FemaleSpeech-16-4-mono-20secs.wav”;maleSpeechValidate = audioread (maleValidationAudioFile);femaleSpeechValidate = audioread (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 / max(mixTrain);mixValidate = maleSpeechValidate + femaleSpeechValidate;mixValidate = mixValidate / max(mixValidate);

STFTs生成培训。

WindowLength = 128;FFTLength = 128;OverlapLength = 128 - 1;Fs = 4000;赢得=损害(WindowLength,“周期”);P_mix0 = stft (mixTrain,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);P_M = abs (stft (maleSpeechTrain“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength));P_F = abs (stft (femaleSpeechTrain“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength));

由于STFT输入是实数,所以STFT是共轭对称的。减少stft到他们唯一的样本。

N = 1 + FFTLength/2;P_mix0 = P_mix0 (n - 1:最终,);P_M = P_M (n - 1:最终,);P_F = P_F (n - 1:最终,);

取混合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,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”,FFTLength);P_Val_M = abs (stft (maleSpeechValidate“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength));P_Val_F = abs (stft (femaleSpeechValidate“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength));P_Val_mix0 = P_Val_mix0 (n - 1:最终,);P_Val_M = P_Val_M (n - 1:最终,);P_Val_F = P_Val_F (n - 1:最终,);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;混合序列= 0 (1 + FFTLength/2,seqLen,1,0);maskSequences = 0 (1 + FFTLength/2,seqLen,1,0);loc = 1;loc <大小(P_mix 2)——seqLen mixSequences(::,:,结束+ 1)= P_mix (:, loc: loc + seqLen-1);% #好吧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 < size(P_Val_mix,2) - seqLen mixValSequences(:,:,:,end+1) = P_Val_mix(:,loc:loc+seqLen-1);% #好吧maskValSequences(:,:,:,结束+ 1)= maskValidate (:, loc: loc + seqLen-1);% #好吧loc = loc + seqOverlap;结束

重塑培训和验证信号。

mixSequencesT =整形(mixSequences, [1 1 (1 + FFTLength/2) * seqLen size(mixSequences,4)]);mixSequencesV =整形(mixValSequences, [1 1 (1 + FFTLength/2) * seqLen size(mixValSequences,4)]);maskSequencesT =整形(maskSequences, [1 1 (1 + FFTLength/2) * seqLen size(maskSequences,4)]);maskSequencesV =整形(maskValSequences,[1 1 (1 + FFTLength/2) * seqLen size(maskValSequences,4)]);

定义深度学习网络

定义网络的层。指定输入尺寸为大小为1×1×1300的图像。定义两个隐藏的完全连接的层,每个层有1300个神经元。每个隐藏的全连接层后面都有一个sigmoid层。批处理归一化层对输出的均值和标准差进行归一化处理。添加一个包含1300个神经元的全连接层,然后是一个回归层。

numNodes = (1 + FFTLength/2) * seqLen;层= [...imageInputLayer([1 1 (1 + FFTLength/2)*seqLen]),“归一化”,“没有”batchNormalizationLayer (numNodes)完全连接层(numNodes)完全连接层(numNodes)完全连接层(numNodes)完全连接层(numNodes)完全连接层(numNodes)

指定网络的培训选项。集MaxEpochs3.使网络对训练数据进行三次遍历。集MiniBatchSize64所以这个网络看起来64一次一个训练信号。集情节训练进步随着迭代次数的增加,生成显示训练进度的图。集详细的若要禁用将与图中显示的数据对应的表输出打印到命令行窗口中,请执行以下操作。集洗牌every-epoch在每个纪元开始时洗牌训练顺序。集LearnRateSchedule分段每次通过一定数量的epoch(1)时,将学习率降低一个指定的因子(0.1)。集ValidationData到验证预测器和目标。集ValidationFrequency这样,验证均方误差每历元计算一次。本例使用自适应矩估计(ADAM)求解器。

maxEpochs = 3;miniBatchSize = 64;选择= trainingOptions (“亚当”,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“SequenceLength”,“最长”,...“洗牌”,“every-epoch”,...“详细”0,...“阴谋”,“训练进步”,...“ValidationFrequency”、地板(大小(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;结束

将验证预测器传递给网络。输出是估计的掩码。重塑预估的面具。

estimatedMasks0 =预测(CocktailPartyNet mixSequencesV);estimatedMasks0 = estimatedMasks0。”;estimatedMasks0 =整形(estimatedMasks0,1 + FFTLength/2,numel(estimatedMasks0)/(1 + FFTLength/2));

评估深度学习网络

绘制实际掩码和期望掩码之间的误差直方图。

图(8)直方图(maskValSequences(:) - estimatedMasks0(:)“EdgeColor”,“没有”,“归一化”,“pdf”)包含(“面具错误”)ylabel (“概率密度”)

评估软掩模估计

估计男性和女性的软口罩。通过对软掩码进行阈值化来估计男性和女性二元掩码。

SoftMaleMask = estimatedMasks0;SoftFemaleMask = 1 - SoftMaleMask;

缩短混合STFT以匹配估计的遮罩大小。

P_Val_mix0 = P_Val_mix0(:, 1:尺寸(SoftMaleMask 2));

将混合STFT与男性软掩模相乘,得到估计的男性语音STFT。

P_Male = P_Val_mix0 .* SoftMaleMask;

将单边STFT转换为居中STFT。

P_Male = [conj(P_Male(end-1:-1:2,:)];P_Male];

使用ISTFT获得估计的男性音频信号。音频。

maleSpeech_est_soft = istft (P_Male,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength,“ConjugateSymmetric”,真正的);maleSpeech_est_soft = maleSpeech_est_soft / max(abs(maleSpeech_est_soft));

设想估计的和原始的男性语音信号。听估计软面具男性讲话。

=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);figure(9) subplot(2,1,1) plot(t,maleSpeechValidate(range))“原来男性演讲》)包含(“时间(s)”网格)次要情节(2,1,2)情节(t, maleSpeech_est_soft(范围)包含(“时间(s)”)标题(“预估男性语言(软面具)”网格)

声音(maleSpeech_est_soft(范围)、Fs)

将混合的STFT与女性的软掩模相乘,得到估计的女性语音STFT。使用ISTFT获得估计的男性音频信号。音频。

P_Female = P_Val_mix0 .* SoftFemaleMask;P_Female = [conj(P_Female(end-1:-1:2,:));P_Female];femaleSpeech_est_soft = istft (P_Female,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength,“ConjugateSymmetric”,真正的);femaleSpeech_est_soft = femaleSpeech_est_soft / max(femaleSpeech_est_soft);

设想估计的和原始的女性信号。听一下估计的女性演讲。

range = (numel(win):numel(maleSpeech_est_soft) - numel(win));t = range * (1/Fs);figure(10) subplot(2,1,1) plot(t,femaleSpeechValidate(range))“原始女性讲话”网格)次要情节(2,1,2)情节(t, femaleSpeech_est_soft(范围)包含(“时间(s)”)标题(“女性语音评估(软面具)”网格)

声音(femaleSpeech_est_soft(范围)、Fs)

评估二进制掩码估计

通过对软掩码进行阈值化来估计男性和女性二元掩码。

HardMaleMask = SoftMaleMask >= 0.5;HardFemaleMask = SoftMaleMask < 0.5;

将混合STFT乘以男性二进制掩码,得到估计的男性语音STFT。使用ISTFT获得估计的男性音频信号。音频。

P_Male = P_Val_mix0 .* HardMaleMask;P_Male = [conj(P_Male(end-1:-1:2,:)];P_Male];maleSpeech_est_hard = istft (P_Male,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength,“ConjugateSymmetric”,真正的);maleSpeech_est_hard = maleSpeech_est_hard / max(maleSpeech_est_hard);

设想估计的和原始的男性语音信号。听估计二进制掩码男性的讲话。

=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);figure(11) subplot(2,1,1) plot(t,maleSpeechValidate(range))“原来男性演讲》网格)次要情节(2,1,2)情节(t, maleSpeech_est_hard(范围)包含(“时间(s)”)标题(“估计男性语音(二进制掩码)”网格)

声音(maleSpeech_est_hard(范围)、Fs)

将混合的STFT与女性的二进制掩码相乘,得到估计的男性语音STFT。使用ISTFT获得估计的男性音频信号。音频。

P_Female = P_Val_mix0 .* HardFemaleMask;P_Female = [conj(P_Female(end-1:-1:2,:));P_Female];femaleSpeech_est_hard = istft (P_Female,“窗口”,赢了,“OverlapLength”OverlapLength,“FFTLength”FFTLength,“ConjugateSymmetric”,真正的);femaleSpeech_est_hard = femaleSpeech_est_hard / max(femaleSpeech_est_hard);

可视化估计和原始的女性语音信号。听一下估计的女性演讲。

=(元素个数(赢得):元素个数(maleSpeech_est_soft)元素个数(赢得));t = range * (1/Fs);figure(12) subplot(2,1,1) plot(t,femaleSpeechValidate(range))“原始女性讲话”网格)次要情节(2,1,2)情节(t, femaleSpeech_est_hard(范围)标题(“估计女性语音(二进制掩码)”网格)

声音(femaleSpeech_est_hard(范围)、Fs)

比较一秒片段的STFTs,原母材和公材,以及估计的母材和公材。

= 7 e4:7.4e4范围;图(13)stft (mixValidate(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“混合STFT”)

图(14)次要情节(3,1,1)stft (maleSpeechValidate(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“男性STFT(实际)”次要情节(3、1、2)stft (maleSpeech_est_soft(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“男性STFT(预估-柔软面具)”次要情节(3,1,3)stft (maleSpeech_est_hard(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“男性STFT(估计-二进制掩码)”);

图(15)次要情节(3、1、1)stft (femaleSpeechValidate(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“女性STFT(实际)”次要情节(3、1、2)stft (femaleSpeech_est_soft(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题(“女性STFT(预估-柔软面具)”次要情节(3,1,3)stft (femaleSpeech_est_hard(范围),Fs,“窗口”,赢了,“OverlapLength”,64,“FFTLength”FFTLength)标题("女性STFT(估计-二进制掩码)")

参考文献

[1]“卷积深度神经网络中二进制掩码鸡尾酒党信源分离的概率性”,安德鲁·j·r·辛普森,2015。