主要内容

训练滤波器和网络的三维语音增强

在本例中,使用预训练的深度学习模型执行语音增强。有关该模型及其训练方式的详细信息,请参见利用深度学习训练三维语音增强网络(音频工具箱).语音增强模型是一种端到端深度波束形成器,采用b格式双声子音频记录并输出增强的单音语音信号。

下载Pretrained网络

下载预训练语音增强(SE)网络、双音速测试文件和标签。模型体系结构是基于[1]而且[4],在L3DAS21挑战任务1的基线系统中实现[2].模型训练的数据和双音速测试文件是提供的一部分[2]

downloadFolder = matlab.internal.examples.downloadSupportFile (“音频”“speechEnhancement / FaSNet.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) netFolder = fullfile(dataFolder,“speechEnhancement”);目录(netFolder)

加载和检查数据

下载干净的演讲稿,然后听一听。

[cleanSpeech, fs] = audioread (“cleanSpeech.wav”);soundsc (cleanSpeech fs)

在L3DAS21挑战中,“干净的”语音文件从LibriSpeech数据集中提取并增强,以获得合成三维声学场景,其中包含一个随机放置的扬声器和办公室环境中典型的背景噪声的其他声源。数据被编码为b格式的双相电路。加载双音速数据。一阶b格式双声道对应于全向麦克风(W)捕捉到的声压和声压梯度X、Y和Z,对应于沿三个空间轴方向的八字胶囊捕捉到的前/后、左/右和上/下。

[ambisonicData, fs] = audioread (“ambisonicRecording.wav”);

听一段双声子数据。

频道=1;soundsc (ambisonicData(:,频道),fs)

使用支持函数来绘制干净语音和噪声双声子数据compareAudio

compareAudio (cleanSpeech ambisonicData SampleRate = fs)

为了可视化清洁语音和噪声双声子数据的谱图,使用支持函数compareSpectrograms

compareSpectrograms (cleanSpeech ambisonicData)

梅尔谱图是听觉启发的谱图转换,它强调、弱化和模糊频率,类似于听觉系统。为了可视化干净语音和噪声双声子数据的mel谱图,使用支持函数compareSpectrograms并设置梅尔

compareSpectrograms (cleanSpeech ambisonicData经=“梅尔”

执行3d语音增强

使用支撑物,seModel,以增强语音效果。的seModel打开此示例时,类定义在当前文件夹中。对象封装了开发的SE模型利用深度学习训练三维语音增强网络(音频工具箱).创建模型,然后调用enhanceSpeech对双音数据进行语音增强。

模型= seModel (netFolder);enhancedSpeech = enhanceSpeech(模型、ambisonicData);

听增强版的演讲。通过从下拉菜单中选择所需的声源,您可以将增强的语音收听体验与干净的语音或嘈杂的双声源数据进行比较。

soundSource =enhancedSpeech;soundsc (soundSource fs)

在时域上比较干净语音、噪声语音和增强语音的谱图和梅尔谱图。

compareAudio (cleanSpeech ambisonicData enhancedSpeech)

compareSpectrograms (cleanSpeech ambisonicData enhancedSpeech)

compareSpectrograms (cleanSpeech ambisonicData enhancedSpeech,经=“梅尔”

语音到文本应用的语音增强

比较语音增强系统在下游语音到文本系统上的性能。使用wav2vec 2.0语音到文本模型。该模型需要一次性下载预先训练的权重才能运行。如果你还没有下载wav2vec的权重,首先调用speechClient将提供下载链接。

创建wav2vec 2.0语音客户端执行转录。

转录器= speechClient (“wav2vec2.0”分割=“没有”);

使用清洁语音、双音数据和增强语音执行语音到文本的转录。

cleanSpeechResults = speech2text(誊写员、cleanSpeech fs)
“我告诉你这不是毒药,她哭了”
noisySpeechResults = speech2text(誊写员,ambisonicData(:,渠道),fs)
结果=“我告诉你,她哭的不是帕佐娜。”
enhancedSpeechResults = speech2text(誊写员、enhancedSpeech fs)
结果=“我告诉你这不是毒药,她哭了。”

电信应用语音增强

用短时客观可解性(STOI)测量[5]比较语音增强系统的性能。STOI已被证明与噪声语音的可解性高度相关,通常用于评价语音增强系统。

计算双向声学全向信道的STOI,以及增强语音的STOI。完全可理解性的得分是1分。

stoi (cleanSpeech ambisonicData(:,渠道),fs)
ans = 0.6950
stoi (cleanSpeech enhancedSpeech fs)
ans = 0.8393

参考文献

[1]罗,易,聪汉,尼玛·梅斯加拉尼,Enea Ceolini,和刘诗芝。FaSNet:用于多麦克风音频处理的低延迟自适应波束形成。2019年IEEE自动语音识别和理解研讨会(ASRU), 260-67。SG,新加坡:IEEE, 2019。https://doi.org/10.1109/ASRU46091.2019.9003849

[2] Guizzo, Eric, Riccardo F. Gramaccioni, Saeid Jamili, Christian Marinoni, Edoardo Massaro, Claudia Medaglia, Giuseppe Nachira,等。L3DAS21挑战:3D音频信号处理的机器学习。在2021年IEEE第31届信号处理机器学习国际研讨会(MLSP)上,1-6。黄金海岸,澳大利亚:IEEE, 2021。https://doi.org/10.1109/MLSP52302.2021.9596248

[3]鲁克斯,乔纳森勒,等。“特别提款权——半生不熟还是做得很好?”2019 - 2019 IEEE声学、语音和信号处理国际会议(ICASSP), 2019, pp. 626-30。DOI.org (Crossref)https://doi.org/10.1109/ICASSP.2019.8683855

[4]骆,易,等。双路RNN:时域单通道语音分离的高效长序列建模。ICASSP 2020 - 2020 IEEE声学、语音和信号处理国际会议(ICASSP), IEEE, 2020, pp. 46-50。DOI.org (Crossref)https://doi.org/10.1109/ICASSP40776.2020.9054266

Taal, Cees H., Richard C. Hendriks, Richard Heusdens, Jesper Jensen。一种时频加权噪声语音可解性预测算法。《IEEE音频、语音和语言处理汇刊》19日,没有。7(2011年9月):2125-36。https://doi.org/10.1109/TASL.2011.2114881

支持功能

比较音频

函数compareAudio(目标,x, y,参数)绘制干净的语音,b格式的双元性和预测语音随着时间的推移,%参数目标x y =[]参数。SampleRate = 16 e3结束numToPlot = 2 + ~isempty(y);f =图;tiledlayout (4 numToPlot TileSpacing =“紧凑”TileIndexing =“columnmajor”f.Position = [f.Position(1),f.Position(2),f.Position(3)*numToPlot,f.Position(4)];t =(0:(大小(x, 1) 1)) / parameters.SampleRate;xmax = max (x (:));xmin = min (x (:));nexttile(1,[4,1]) plot(t,target,Color=[0 0.4470 0.7410])轴ylabel (“振幅”)包含(“时间(s)”)标题(“洁净言论(目标资料)”网格)nexttile(5) plot(t,x(:,1),Color=[0.8500 0.3250 0.0980]) title(噪声语音(b格式双声子数据))轴([t(1),(结束),xmin, xmax])组(gca, Xticklabel = [], YtickLabel =[])网格yL = ylabel (“W”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile(6) plot(t,x(:,2),Color=[0.8600 0.3150 0.0990]) axis([t(1),t(end),xmin,xmax]) set(gca,Xticklabel=[],YtickLabel=[])网格yL = ylabel (“X”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile(7) plot(t,x(:,3),Color=[0.8700 0.3050 0.1000]) axis([t(1),t(end),xmin,xmax]) set(gca,Xticklabel=[],YtickLabel=[])网格yL = ylabel (“Y”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile(8)情节(t) x(:, 4),颜色=[0.8800 0.2950 0.1100])轴([t(1),(结束),xmin, xmax])包含(“时间(s)”)设置(gca YtickLabel =[])网格yL = ylabel (“Z”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”如果numToPlot==3 nexttile(9,[4,1]) plot(t,y,Color=[0 0.4470 0.7410])轴包含(“时间(s)”)标题(“强化演讲”网格)甘氨胆酸集(YtickLabel = [])结束结束

比较色

函数compareSpectrograms(目标,x, y,参数)绘制干净语音的谱图,b格式和预测语音随时间的变化。参数目标x y =[]参数。SampleRate = 16 e3参数。经=“线性”结束fs = parameters.SampleRate;开关参数。经情况下“线性”fn = @ (x)谱图(x,损害(圆(0.03 * fs),“周期”)、圆(0.02 * fs)轮(0.03 * fs), fs,“单向的”“权力”“桠溪”);情况下“梅尔”fn = @ (x) melSpectrogram (x, fs);结束numToPlot = 2 + ~isempty(y);f =图;tiledlayout (4 numToPlot TileSpacing =“紧”TileIndexing =“columnmajor”f.Position = [f.Position(1),f.Position(2),f.Position(3)*numToPlot,f.Position(4)];Nexttile (1,[4,1]) fn(target) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;标题(“干净的演讲》) nexttile(5) fn(x(:,1)) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;set(gca,Yticklabel=[],XtickLabel=[],Xlabel=[])“W”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”)标题(噪声语音(b格式双声子数据)) nexttile(6) fn(x(:,2)) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;set(gca,Yticklabel=[],XtickLabel=[],Xlabel=[])“X”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile(7) fn(x(:,3)) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;set(gca,Yticklabel=[],XtickLabel=[],Xlabel=[])“Y”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile(8) fn(x(:,4)) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;set(gca,Yticklabel=[])“Z”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”如果numToPlot==3 nexttile(9,[4,1]) fn(y) fh = gcf;fh.Children(1)定格(1).Visible =“关闭”;集(gca, Yticklabel = [], Ylabel =[])标题(“强化演讲”结束结束

短时客观可解性(STOI)测度

函数度量= stoi (t, y, fs)短时客观可解性测度(STOI)% metric = stoid(t,y,fs)返回短时客观可解性%测量(STOI)在[1]和[2]中定义。T是清晰的语音信号,% y为预测语音信号,fs为采样率。%的引用C. H. Taal, R. C. Hendriks, R. Heusdens和J. Jensen。一个短期时频加权噪声的客观可解性测度%的演讲。声学、语音和信号处理(ICASSP),页% 4214 - 4217。IEEE 2010。C. H. Taal, R. C. Hendriks, R. Heusdens和J. Jensen。一个算法时频加权噪声语音的可解性预测。IEEE音频,语音和语言处理汇刊,% 19(7): 2125 - 2136年,2011年。%定义参数designFs = 10 e3;windowLength = 256;fttLength = 512;numBands = 15;cf1 = 150;前1/3倍频带的中心频率(以Hz为单位)。N = 30;中级可解性的帧数β= -15;信号失真比(SDR)下限clipConstant = 10 ^(β/ 20);energyThreshold = 40;%语音动态范围如果fs ~= designFs t = cast(resample(double(t),designFs,fs),like=t);y =投(重新取样(双(y), designFs, fs),如= y);结束%删除无声帧[t、y] = removeSilentFrames (t y energyThreshold windowLength);计算幅值短时傅里叶变换T = stft (T, FFTLength = fttLength窗口=损害(windowLength),...OverlapLength = windowLength / 2, FrequencyRange =“单向的”);Y = stft (Y, FFTLength = fttLength窗口=损害(windowLength),...OverlapLength = windowLength / 2, FrequencyRange =“单向的”);T = abs (T);Y = abs (Y);设计频域倍频滤波器组fb = designOctaveFilterBank (designFs fttLength、numBands cf1);%应用倍频滤波器组T = fb * T;Y = fb * Y;计算清晰度测量djm = 0 (numBands、长度(N:大小(T, 2)));m = N:大小(T, 2)分离N个连续tf单位的区域Tj = T (:, (m n + 1): m);Yj = Y (:, (m n + 1): m);%计算αα=√总和(Tj。^ 2,2)。/ sum (Yj。^ 2,2));alphaYj = Yj。*α;ypi = min (alphaYj Tj + Tj * clipConstant);% Eq 3从[1]% Eq 4从[1]yn = Ypj -均值(Ypj,2);xn = Tj -均值(Tj,2);djm (: m n + 1) =点(xn. / vecnorm (xn 2 2), yn. / vecnorm (yn 2 2), 2);结束%在所有波段和帧的平均中等清晰度(eq 5 in% [1])度量=意味着(djm (:));%删除无声帧函数[tS,yS] = removeSilentFrames(t,y,eThreshold,N) win = hanning(N);结核病=缓冲区(t、N, N / 2,“nodelay”);tbwin =结核病。*赢;frameEnergy = 20 * log10 (vecnorm (tbwin)。/√(N));掩码= (frameEnergy-max (frameEnergy) + eThreshold) > 0;tS = tbwin;tS(: ~面具)= [];tS = tS(1:N/2,2:end) + tS(N/2+1:end,1:end-1);tS =[结核(1:N / 2,1); tS(:);结核病(N / 2 + 1:结束,结束)];yb =缓冲区(y, N, N / 2,“nodelay”);ybwin = yb。*赢;y = ybwin;y(: ~面具)= [];yS = yS(1:N/2,2:end) + yS(N/2+1:end,1:end-1);y = [yb (1: N / 2,1); y (:), yb (N / 2 + 1:结束,结束)];结束%设计八度滤波器组函数fb = designOctaveFilterBank(fs,fftLength,numBands,cf1);f = f (1: (fftLength / 2 + 1));k = 0: (numBands-1);cf = 2。^ (k / 3) * cf1;fl =√(2 ^ (k / 3) * cf1)。* 2 ^ ((k - 1) / 3) * cf1);fr =√(2 ^ (k / 3) * cf1)。* 2 ^ ((k + 1) / 3) * cf1);fb = 0 (numBands元素个数(f));fp = f ';[~, bandLow] = min ((fp-fl)。^ 2);[~, bandHigh] = min ((fp-fr)。^ 2);1:numel(cf) fb(ii,bandLow(ii):(bandHigh(ii)-1)) = 1;结束结束结束
Baidu
map