主要内容

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

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

介绍

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

下载所需文件

在详细介绍示例之前,您将下载一个预先训练过的网络和4个音频文件。

url ='http://ssd.mathworks.com/万博1manbetxsupportfiles/audio/CocktailPartySourceSeparation.zip';downloadNetFolder=tempdir;netFolder=fullfile(downloadNetFolder,“CocktailParty资源分离”);如果~exist(netFolder,“dir”)disp('下载预训练的网络和音频文件(5个文件-24.5 MB)…'解压缩(url, downloadNetFolder)终止

问题总结

加载音频文件,包含男性和女性的语音采样在4千赫。请单独听音频文件以作参考。

[mSpeech,Fs]=音频读取(完整文件(netFolder,“MaleSpeech-16-4-mono-20secs.wav”));声音(mSpeech Fs)
[fSpeech] = audioread (fullfile (netFolder,“女性语音-16-4-mono-20sec.wav”)); 声音(fSpeech,Fs)

结合两种语言来源。确保资源在混合中有同等的力量。对混合进行归一化,使其最大振幅为1。

mSpeech=mSpeech/norm(mSpeech);fSpeech=fSpeech/norm(fSpeech);ampAdj=最大值(绝对值([mSpeech;fSpeech]);mSpeech=mSpeech/ampAdj;fSpeech=fSpeech/ampAdj;mix=mSpeech+fSpeech;混合=混合。/max(abs(混合));

将原始信号和混合信号可视化。聆听混合语音信号。此示例显示了一种源分离方案,可从语音混合中提取男性和女性源。

t=(0:numel(mix)-1)*(1/Fs);图(1)子地块(3,1,1)图(t,mSpeech)标题(“男性演讲》网格)在…上子地块(3,1,2)地块(t、fSpeech)名称(“女性演讲”网格)在…上子地块(3,1,3)地块(t、mix)标题(“语音组合”)xlabel(“时间”网格)在…上

听混音。

声音(混合,Fs)

时频表示

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

WindowLength = 128;FFTLength = 128;OverlapLength = 96;赢得=损害(WindowLength,“定期”)图(2)子批次(3,1,1)stft(mSpeech,Fs,“窗口”“重叠长度”,重叠长度,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“男性演讲》)子批次(3,1,2)stft(fSpeech,Fs,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“女性演讲”) subplot(3,1,3) stft(mix, Fs,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“混合演讲”)

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

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

使用理想二元掩模的源分离

在理想的二进制掩码中,掩码单元值为0或1。如果所需源的功率大于特定TF单元中其他源的组合功率,则该单元设置为1。否则,该单元设置为0。

计算出男性说话人的理想二元掩码,然后将其可视化。

P_M=stft(mSpeech,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);P_F=stft(fSpeech,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”)[P_mix,F]=stft(mix,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);binaryMask=abs(P_M)>=abs(P_F);图(3)绘图掩码(binaryMask,WindowLength-重叠长度,F,Fs)

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

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

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

mSpeech_Hard=istft(P_M_Hard,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);fspeech = istft(P_F_Hard,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);图(4)子地块(2,2,1)图(t,mSpeech)轴([t(1)t(end)-11])标题(“原来男性演讲》网格)在…上subplot(2,2,3) plot(t, mspeech - hard) axis([t(1) t(end) -1 1]) xlabel(“时间”)标题(“估计男性讲话”网格)在…上subplot(2,2,2) plot(t,fSpeech) axis([t(1) t(end) -1 1]) title(“原创女性演讲”网格)在…上子地块(2,2,4)图(t,fSpeech_硬)轴([t(1)t(end)-11])标题(“估计女性演讲”)xlabel(“时间”网格)在…上

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

使用理想的软面膜分离源

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

计算男说话人的软掩码。通过将混音STFT乘以男说话人的软掩码来估计男说话人的STFT。通过将混音STFT乘以女说话人的软掩码来估计女说话人的STFT。

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

软掩码=绝对值(P_M)。/(绝对值(P_F)+绝对值(P_M)+每股收益);软掩码=绝对值混合。*软掩码;软掩码=绝对值混合。*(1-软掩码);mSpeech_Soft=istft(P_M_Soft,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);fSpeech_Soft = istft (P_F_Soft,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);

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

图(5)子地块(2,2,1)图(t,mSpeech)轴([t(1)t(end)-11])标题(“原来男性演讲》网格)在…上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(“时间”)标题(“原创女性演讲”网格)在…上子地块(2,2,4)图(t,fSpeech_软)轴([t(1)t(end)-11])xlabel(“时间”)标题(“估计女性演讲”网格)在…上

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

基于深度学习的掩模估计

本例中的深度学习网络的目标是估计上述理想的软面具。该网络估计与男性说话人对应的面具。女性说话人面具直接来自男性面具。

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

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

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

短期融资目标和预测因素

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

读入训练信号,分别由男性和女性说话人400秒左右的语音组成,采样频率为4 kHz。低采样率用于加速训练。调整训练信号,使其长度相同。

maleTrainingAudioFile=“malespeech - 16 - 4 - mono - 405 secs.wav”;femaleTrainingAudioFile =“FemaleSpeech-16-4-mono-405s.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 =“女性语音-16-4-mono-20sec.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/norm(maleSpeechTrain);femaleSpeechTrain=femaleSpeechTrain/norm(femaleSpeechTrain);ampAdj=max(abs([maleSpeechTrain;femaleSpeechTrain]);maleSpeechTrain=maleSpeechTrain/ampAdj;femaleSpeechTrain=femaleSpeechTrain/ampAdj;maleSpeechValidate=maleSpeechValidate/norm(maleSpeechValidate)femaleSpeechValidate=femaleSpeechValidate/norm(femaleSpeechValidate);ampAdj=max(abs([maleSpeechValidate;femaleSpeechValidate]);maleSpeechValidate=maleSpeechValidate/ampAdj;femaleSpeechValidate=femaleSpeechValidate/ampAdj;

创建培训和验证“鸡尾酒会”组合。

mixTrain=maleSpeechTrain+femaleSpeechTrain;mixTrain=mixTrain/max(mixTrain);mixValidate=maleSpeechValidate+femaleSpeechValidate;mixValidate=mixValidate/max(mixValidate);

生成培训STFT。

WindowLength=128;FFTLength=128;OverlapsLength=128-1;Fs=4000;win=hann(WindowLength,“定期”); P_mix0=stft(混合序列,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);P_M=abs(stft(maleSpeechTrain,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”)); P_F=abs(stft(女性Peechtrain,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”));

取混合STFT的对数。用平均值和标准差对值进行归一化。

P_-mix=log(abs(P_-mix0)+eps);MP=mean(P_-mix(:);SP=std(P_-mix(:);P_-mix=(P_-mix-MP)/SP;

生成验证STFTs。取混合STFT的对数。用平均值和标准差对值进行归一化。

P_Val_mix0=stft(mixValidate,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);P_Val_M=abs(stft(maleSpeechValidate,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”));P_Val_F = abs (stft (femaleSpeechValidate“窗口”“重叠长度”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”)xlabel(“输入值”)伊拉贝尔(“概率密度”)

计算训练软掩码。在训练网络时,使用该掩码作为目标信号。

maskTrain = P_M ./ (P_M + P_F + eps);

计算验证软掩码。使用此掩码来评估经过训练的网络发出的掩码。

maskValidate = P_Val_M ./ (P_Val_M + P_Val_F + eps);

要检查目标数据分布是否平滑,请绘制训练数据掩码值的直方图。

图(7)直方图(maskTrain“EdgeColor”,“没有”,“正常化”,“pdf”)xlabel(“输入值”)伊拉贝尔(“概率密度”)

根据预测器和目标信号创建大小为(65,20)的块。为了获得更多的训练样本,在连续块之间使用10段的重叠。

序列长度=20;序列重叠=10;混合序列=0(1+FFT长度/2,序列长度,1,0);掩码序列=0(1+FFT长度/2,序列长度,1,0);loc=1;虽然loc% #好吧maskSequences(:,:,:,结束+ 1)= maskTrain (:, loc: loc + seqLen-1);% #好吧loc = loc + seqOverlap;终止

从验证预测器和目标信号创建大小为(65,20)的块。

mixValSequences=零(1+FFTLENGHT/2,序列号,1,0);maskValSequences=零(1+FFTLENGHT/2,序列号,1,0);序列重叠=序列号;loc=1;虽然loc% #好吧maskValSequences(:,:,:,end+1)=maskValidate(:,loc:loc+seqLen-1);% #好吧loc = loc + seqOverlap;终止

重塑培训和验证信号。

mixSequencesT=重塑(mixSequences,[11(1+FFTLength/2)*序列大小(mixSequences,4)];mixSequencesV=重塑(mixValSequences,[11(1+FFTLength/2)*序列大小(mixValSequences,4)];maskSequencesT=重塑(maskSequences,[11(1+FFTLength/2)*序列大小(maskSequences,4)];maskSequencesV=重塑(maskValSequences,[1(1+fft长度/2)*序列大小(maskValSequences,4)];

定义深度学习网络

定义网络的层。指定输入大小为1×1×1300的图像。定义两个隐藏的完全连接层,每个层有1300个神经元。在每个隐藏的完全连接层后面有一个sigmoid层。批量标准化层将输出的平均值和标准差标准化。添加一个完全连接层,每个层有13个神经元00个神经元,然后是回归层。

节点=(1+fft长度/2)*序号;层=[...imageInputLayer([11(1+FFT长度/2)*序列号],“正常化”,“没有”) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fulllyconnectedlayer (numNodes) BiasedSigmoidLayer(0) regressionLayer;

指定网络的训练选项。集MaxEpochs3.这样网络就可以对训练数据进行三次传递小批量64这样网络才能看到64一次训练信号。设定情节培训进度生成随着迭代次数增加而显示训练进度的图。集冗长的错误的禁用将与绘图中显示的数据相对应的表输出打印到命令行窗口。集洗牌every-epoch在每个历元开始时洗牌训练序列。设置学习进度表分段每次经过一定数量的纪元(1)时,将学习率降低指定的系数(0.1)。设置验证数据到验证预测因子和目标。集验证频率每个历元计算一次验证均方误差。此示例使用自适应矩估计(ADAM)解算器。

maxEpochs=3;miniBatchSize=64;options=trainingOptions(“亚当”,...“MaxEpochs”,maxEpochs,...“最小批量大小”miniBatchSize,...“SequenceLength”,“最长”,...“洗牌”,“every-epoch”,...“冗长”0,...“情节”,“培训进度”,...“验证频率”,地板(尺寸(mixSequencesT,4)/小批量尺寸),...“验证数据”{mixSequencesV, maskSequencesV},...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”,0.9,...“LearnRateDropPeriod”,1);

培训深度学习网络

使用指定的训练选项和层架构来训练网络列车网络.由于训练集很大,训练过程可能需要几分钟。要加载预先训练的网络,请设置溺爱错误的

doTraining=true;如果doTraining CocktailPartyNet = trainNetwork(mixSequencesT,maskSequencesT,layers,options);其他的s=荷载(“CocktailPartyNet.mat”);CocktailPartyNet = s.CocktailPartyNet;终止

将验证预测值传递给网络。输出是估计的掩码。重塑估计的遮罩。

estimatedMasks0=预测(CocktailPartyNet,mixSequencesV);estimatedMasks0=estimatedMasks0';estimatedMasks0=重塑(estimatedMasks0,1+FFT长度/2,numel(estimatedMasks0)/(1+FFT长度/2));

评估深度学习网络

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

图(8)直方图(maskValSequences(:) - estimatedMasks0(:),“EdgeColor”,“没有”,“正常化”,“pdf”)xlabel(“掩码错误”)伊拉贝尔(“概率密度”)

评估软掩模评估

估计男性和女性软面具。通过对软面具设定阈值来估计男性和女性二元面具。

SoftMaleMask=estimatedMasks0;SoftFemaleMask=1-SoftMaleMask;

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

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

将混合短时傅里叶变换与男性软掩模相乘得到估计的男性语音短时傅里叶变换。

P_男性=P_Val_mix0.*软男性面具;

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

maleSpeech_est_soft=istft(P_Male,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“共轭对称”,真的,...“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(“原来男性演讲》)xlabel(“时间”网格)在…上次要情节(2,1,2)情节(t, maleSpeech_est_soft(范围)包含(“时间”)标题(“估计男性语言(软面具)”网格)在…上

声音(声音范围,Fs)

将混合STFT乘以女性软掩码,得到估计的女性语音STFT。使用ISTFT获得估计的男性音频信号。缩放音频。

P_Female = P_Val_mix0 .* sofemalask;femaleSpeech_est_soft = istft (P_Female,“窗口”“重叠长度”OverlapLength,...“FFTLength”,fft长度,“共轭对称”符合事实的...“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,女性语言最软(范围))xlabel(“时间”)标题(“估计女性讲话(软面具)”网格)在…上

声音(女性说话声音柔和(音域),Fs)

评估二进制掩码估计

通过对软掩码设置阈值来估计公、母二进制掩码。

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

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

P_Male = P_Val_mix0 .* HardMaleMask;maleSpeech_est_hard = istft (P_Male,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“共轭对称”,真的,...“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(range))xlabel(“时间”)标题(“估计男性语言(二元面具)”网格)在…上

声音(音域,Fs)

将混合短时傅里叶变换乘以女性二进制掩码得到估计的男性语音短时傅里叶变换。使用ISTFT得到估计的男性音频信号。音频。

P_女性=P_Val_mix0.*硬女性面具;女性说话最硬=istft(P_女性,“窗口”“重叠长度”OverlapLength,...“FFTLength”FFTLength,“共轭对称”,真的,...“FrequencyRange”,“片面的”); femaleSpeech_est_hard=femaleSpeech_est_hard/max(femaleSpeech_est_hard);

形象化估计和原始的女性语言信号。听一听估计的女性演讲。

范围=(numel(win):numel(maleSpeech_est_soft)-numel(win));t=范围*(1/Fs);图(12)子地块(2,1,1)图(t,女性peechvalidate(range))标题(“原创女性演讲”网格)在…上子地块(2,1,2)地块(t,女性言论(范围))标题(“估计女性语音(二进制掩码)”网格)在…上

声音(女性说话最硬(范围),Fs)

分别比较混合、原始雌性和雄性以及估计雌性和雄性的1秒片段的STFT。

范围=7e4:7.4e4;图(13)stft(混合验证(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“混合STFT”)

图(14)子批次(3,1,1)stft(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“男性STFT(实际)”次要情节(3、1、2)stft (maleSpeech_est_soft(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);次要情节(3,1,3)stft (maleSpeech_est_hard(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“男性STFT(估计-二进制掩码)”);

图(15)子批次(3,1,1)stft(女性视觉验证(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“女性STFT(实际)”)子批次(3,1,2)stft(女性语音测试软件(范围)),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“女性STFT(估计-软面罩)”)子地块(3,1,3)stft(女性语言最难(范围),Fs,“窗口”“重叠长度”, 64,...“FFTLength”FFTLength,“FrequencyRange”,“片面的”);标题(“女性STFT(估计-二进制掩码)”)

参考文献

[1] “卷积深度神经网络中的概率二进制掩码鸡尾酒会源分离”,Andrew J.R.Simpson,2015年。

另见

|

相关话题