主要内容

基于训练循环卷积神经网络的三维声音事件定位与检测

在本例中,使用预先训练的深度学习模型执行3-D声音事件定位和检测(SELD)。有关该模型及其训练方式的详细信息,请参见利用深度学习训练三维声音事件定位与检测(SELD).SELD模型使用两个b格式双音速音频记录来检测办公室环境中常见的14种声音中的一种的存在和位置。

下载预培训网络

下载预先训练的SELD网络、双音速测试文件和标签。模型体系结构是基于[1]而且[3].作为L3DAS21挑战的一部分,提供了用于训练模型的数据、标签和双声学测试文件[2]

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

加载和检查数据

加载双音速数据。一阶b格式双声录音包含与全向麦克风(W)捕捉到的声压相对应的分量,以及与声压梯度X、Y和Z相对应的前/后、左/右和上/下由沿三个空间轴方向的八字胶囊捕捉到的声压梯度X、Y和Z。

[云母,fs] = audioread(“micA.wav”);mib = audioread(“micB.wav”);

听一段数据。

麦克风=1;频道=2;开始=21.5;停止=39.7;s = [micA,micB];Data = s(round(start*fs):round(stop*fs),channel+(麦克风-1)*4);声音(数据、fs)

绘制波形图。

plotAmbisonics(云母、micB)

利用配套功能,getLabels,以加载与声音事件检测(SED)和到达方向(DOA)相关的地面真相标签。

[sedLabels,doaLabels] = getLabels();

sedLabels是键值随时间变化的t × 1向量,其中值对应14种可能的声音类别之一。键为零表示沉默区域。14种可能的声音类别是:叮当声、键盘声、橱柜声、抽屉声、女性说话声、手指噼啪声、按键叮当声、敲门声、笑声、男性说话声、打印机声、剪刀声、电话声和书写声。

sedLabels
sedLabels =600×1单列向量0 0 0 0 0 0 0 0 0 0 0
soundClasses = getSoundClasses();soundClasses (sedLabels + 1)
ans =1×600分类沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默橱橱柜柜柜柜柜柜柜柜柜柜柜沉默沉默沉默沉默沉默键盘键盘键盘键盘键盘键盘沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打敲打沉默沉默沉默沉默沉默沉默沉默沉默沉默键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键键按键按键按键按键按键沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子剪子沉默沉默沉默敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲敲沉默沉默沉默沉默沉默沉默沉默沉默默笔写写写写写写作写作写作写作写作写作写作写作沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘沉默沉默沉默沉默沉默沉默沉默沉默沉默键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘键盘沉默沉默沉默沉默沉默沉默沉默沉默沉默沉默抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉里的抽屉里抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉抽屉沉默沉默沉默沉默沉默沉默沉默

doaLabels是一个T × 3矩阵,其中T是时间步数,3对应于三维空间中的X、Y和Z轴。

doaLabels
doaLabels =600×30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

在这两种情况下,60秒的基本事实被离散成600个时间步。

执行三维声音事件定位和检测(SELD)

使用支撑物,seldModel,执行SELD。对象封装了在利用深度学习训练三维声音事件定位与检测(SELD).创建模型,然后调用seld双声子数据在时间和空间上探测和定位声音。

如果您有统计和机器学习工具箱™,该模型将平滑应用于使用移动平均线和聚类的决策。

模型= seldModel();[sed,doa] = sell (model,micA,micB);

要可视化系统随时间变化的性能,请调用支持函数plot2d

plot2d (sedLabels doaLabels、sed、doa)

要在三个空间维度上可视化系统的性能,调用支持函数plot3d.您可以移动滑块来可视化在不同时间检测到的声音事件位置。地真源位置由一个半透明球体确定。预测的信号源位置由一个圆和原信号源之间用虚线连接。

plot3d (sedLabels doaLabels、sed、doa);

SELD是一个4D问题,因为你是在三维空间和一维时间中定位声源。要在4D中检查系统的性能,调用支持函数plot4d.的plot4d功能随时间播放3d图和相应的双声子记录。

plot4d(云母(:1)、sedLabels doaLabels, sed, doa)

支持功能

情节Ambisonics

函数plotAmbisonics(云母、micB)随着时间的推移,图b格式的双生成学% plotAmbisonics(云母,micB)绘制收集的双离子记录云母和micB。通道是沿着4 × 2瓷砖的行绘制的%布局(W,X,Y,Z)。图的第一列对应于的数据%麦克风A和第二列对应麦克风B的数据。图(1)tiledlayout (4,2 TileSpacing =“紧”) t = linspace(0,60,size(micA,1));nexttile plot(t,micA(:,1)) title(“麦克风”) yL = ylabel(“W”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”)轴([t(1),(结束),-0.2,0.2])组(gca, Xticklabel = []) nexttile情节(t, micB(: 1)标题(B“麦克风”)轴([t(1),(结束),-0.2,0.2])组(gca, Yticklabel = [], XtickLabel = []) nexttile情节(t,云母(:,2))yL = ylabel (“X”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”)轴([t(1),(结束),-0.2,0.2])组(gca, Xticklabel = []) nexttile情节(t, micB(:, 2)轴([t(1),(结束),-0.2,0.2])组(gca, Yticklabel = [], Xticklabel = []) nexttile情节(t,云母(:,3))yL = ylabel (“Y”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”)轴([t(1),(结束),-0.2,0.2])组(gca, Xticklabel = []) nexttile情节(t, micB(:, 3)轴([t(1),(结束),-0.2,0.2])组(gca, Yticklabel = [], Xticklabel = []) nexttile情节(t, micB (:, 4) yL = ylabel (“Z”FontWeight =“大胆”);设置(yL、旋转= 0)轴([t(1),(结束),-0.2,0.2])包含(“时间(s)”) nexttile情节(t, micB(:, 4)轴([t(1),(结束),-0.2,0.2])组(gca, Yticklabel =[])包含(“时间(s)”结束

时间序列

函数plotTimeSeries (sed、价值观)绘制时间序列plot2d利用% plotTimeSeries(sed,values)绘制颜色编码% SED或DOA估计。colors = getColors();持有Ii = 1: numl (sed) CLS = sed(Ii);如果CLS > 0 x = [ii-1,ii];Y = repelem(values(ii),2);情节(x, y,颜色= {cls}颜色,线宽= 8)结束结束持有网格结束

图2 d

函数plot2d (sedLabels doaLabels、sed、doa)图2D% plot2d(sedLabels,doaLabels,sed,doa)为sed, sed地面创建绘图%真值、DOA估计和DOA地面真值。Fh =图(2);set(fh,Position=[100 100 800 800]) SoundClasses =[“监狱”“键盘”“橱柜”“抽屉”“女性”“手指折断”...“钥匙”“敲门”“笑”“男性”“打印机”“剪刀”“电话”“写”];tiledlayout (5 2 TileSpacing =“紧”) nexttile([2,1]) plotTimeSeries(sedLabels,sedLabels);ylib ([0.5,14.5]) ylabel(“类”)标题(“地面实况”set(gca,Xticklabel=[]) nexttile([2,1]) plotTimeSeries(sed,sed);ylim([0.5,14.5]) title(“预测”) set(gca,Yticklabel=[],XtickLabel=[]) nexttile plotTimeSeries(sedLabels,doaLabels(:,1));yL = ylabel(“X”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) set(gca,Xticklabel=[]) nexttile plotTimeSeries(sed,doa(:,1));set(gca,Yticklabel=[],XtickLabel=[]) nexttile plotTimeSeries(sedLabels,doaLabels(:,2));yL = ylabel(“Y”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) set(gca,Xticklabel=[]) nexttile plotTimeSeries(sed,doa(:,2));set(gca,Yticklabel=[],XtickLabel=[]) nexttile plotTimeSeries(sedLabels,doaLabels(:,3));包含(“帧”) yL = ylabel(“Z”FontWeight =“大胆”);集(yL、旋转= 0,VerticalAlignment =“中间”HorizontalAlignment =“正确”) nexttile plotTimeSeries(sed,doa(:,3));包含(“帧”)设置(gca YtickLabel = [])结束

绘制三维

函数data = plot3d(sedLabels,doaLabels,sed,doa,nvargs)图3-D% plot3d(sedLabels,doaLabels,sed,doa)创建一个三维图形%滑块。移动滑块可以移动图中的帧。的位置%记录位于原点。声音事件的位置是一个半透明的球体。。估计声音的位置%事件用一个用一条线连接到原点的填充圆来表示。的的估计声音事件类和真正的声音事件类%当前帧显示在图上。% plot3d(sedLabels,doaLabels,sed,doa, incleslider =false)创建一个3d图%,但不添加滑块和关联的回调。此格式的% plot由plot4d利用。参数sedLabels doaLabels sed doa nvargs。incleslider = true;结束创建包含绘图信息的数据结构。数据。sedLabels = sedLabels;数据。doaLabels = doaLabels;数据。Sed = Sed;数据。Doa = Doa;数据。Colors = getColors(); data.SoundClasses = [“监狱”“键盘”“橱柜”“抽屉”“女性”“手指折断”...“钥匙”“敲门”“笑”“男性”“打印机”“剪刀”“电话”“写”];创建图形。如果nvargs。IncludeSlider数据。FigureHandle =图(3);其他的数据。FigureHandle =图(4);结束(数据集。FigureHandle位置=[680400640580],颜色=“k”菜单条=“没有”工具栏=“没有”初始化绘图。data = initialize3DPlot(data);为3-D图添加滑块。如果nvargs。incleslider N = numel(data.sedLabels);帧= 1/N;b = uicontrol(Parent=data.)FigureHandle风格=“滑块”位置= 20570,20,...值=帧* 80分钟= 1 / N, max = 1,单位=“像素”...SliderStep =(20岁的1 / N / N));cbk = @(es,ed)update3DPlot(. value,data);addlistener (b, ContinuousValueChange = cbk);结束结束

初始化三维绘图

函数data = initialize3DPlot(data)初始化3-D图形% data = initialize3DPlot(data)创建3-D图并初始化直线,%点,以及包含在图中的曲面。数据被附加到%包含图形属性的句柄。确保图形是可见的。data.FigureHandle.Visible =“上”初始化连接原点到预测位置的线状图。。数据。YPlot = plot3([0,1],[0,1],[0,1],”:“颜色=“k”线宽= 1.5);持有data.YPlot.Visible =“关闭”初始化标记预测位置的点图。。数据。YPlotDot = plot3(0,0,0,“o”、MarkerSize = 8 MarkerEdgeColor =“k”线宽= 2,MarkerFaceColor =“k”);data.YPlotDot.Visible =“关闭”初始化标记目标位置的球体。。[x,y,z] =球;数据。TPlotDot = surf(x,y,z,FaceAlpha=0.2,EdgeColor=“没有”FaceColor =“b”);data.TPlotDot.Visible =“关闭”创建一个球体来标记原点。。这就是双音阶麦克风已定位。光[X,Y,Z] =球(8);surf(X*0.15,Y*0.15,Z*0.15,FaceColor=[0.3010 0.7450 0.9330],LineWidth=0.25);在3-D图上创建“墙”以帮助3-D可视化。补丁((2.2,2.2,2.2,2.2),(2.2,2.2,-2.2,-2.2),(-2.2,2.2,2.2,-2.2),3、2、1、2,FaceAlpha = 0.5, FaceColor =“插值函数”);补丁((2.2,2.2,-2.2,-2.2),(2.2,2.2,2.2,2.2),(-2.2,2.2,2.2,-2.2),3、2、1、2,FaceAlpha = 0.5, FaceColor =“插值函数”)补丁((2.2,2.2,-2.2,-2.2),(2.2,-2.2,-2.2,2.2),(-2.2,-2.2,-2.2,-2.2),3、2、1、2,FaceAlpha = 0.5, FaceColor =“插值函数”在3-D图上创建指导方针,以帮助3-D可视化。plot3 ([0], [0], [-2.2, 0]) plot3 ([0], [2.2, 0], [0]) plot3 ([2.2, 0], [0], [0])%设置坐标轴限制。Xlim ([-2,2]) ylim([-2,2])添加轴标签。包含(“X”,颜色= 0、0.4470、0.7410);ylabel (“Y”,颜色= 0、0.4470、0.7410);zlabel (“Z”颜色=(0、0.4470、0.7410),旋转= 0);甘氨胆酸集(XColor = 0、0.4470、0.7410,YColor = 0、0.4470、0.7410,ZColor =(0、0.4470、0.7410))初始化基础真理和预测标签的注释。。注释(“文本框”,(0.4, 0.2, 0.6, 0.1),字符串=“基本事实:”FitBoxToText =“上”颜色=“k”EdgeColor =“没有”FontWeight =“大胆”);注释(“文本框”,(0.4, 0.17, 0.4, 0.1),字符串=预测:“FitBoxToText =“上”颜色=“k”EdgeColor =“没有”FontWeight =“大胆”);数据。GTAnnotation =注释(“文本框”,(0.55, 0.2, 0.6, 0.1),字符串=”“FitBoxToText =“上”颜色=“k”EdgeColor =“没有”FontWeight =“大胆”);数据。PredictedAnnotation = annotation(“文本框”,(0.55, 0.17, 0.4, 0.1),字符串=”“FitBoxToText =“上”颜色=“k”EdgeColor =“没有”FontWeight =“大胆”);网格网格平等的持有结束

更新3d图

函数update3DPlot(时间、数据)UPDATE3DPLOT更新3d Plot% update3DPlot(timeFrame,data)更新3d图来显示数据%对应于指定的时间段。timeFrame = round(timeFrame*numel(data.sedLabels));如果data.sedLabels(timeFrame) > 0打开图的可见性。data.TPlotDot.Visible =“上”;data.GTAnnotation.Visible =“上”获取当前目标声音类。gtClass = data.SoundClasses{data.sedLabels(timeFrame)};获取当前位置坐标和SED颜色代码。doa = data.doaLabels(timeFrame,:);tcol = data.Colors{data.sedLabels(timeFrame)};%更新目标球。[x,y,z] =球;R = 0.2;data.TPlotDot.XData = x*r + doa(1);data.TPlotDot.YData = y*r + doa(2);data.TPlotDot.ZData = z*r + doa(3);data.TPlotDot.FaceColor = tcol;data.TPlotDot.MarkerEdgeColor = tcol;其他的关闭plot的可见性。data.TPlotDot.Visible =“关闭”;data.GTAnnotation.Visible =“关闭”将当前目标声音类设置为静音,并将颜色编码为%的黑色。gtClass =“沉默”;tcol =“k”结束如果data.sed(timeFrame) > 0打开图的可见性。data.PredictedAnnotation.Visible =“上”;data.YPlot.Visible =“上”;data.YPlotDot.Visible =“上”获取当前预测的声音类别。pClass = data.SoundClasses{data.sed(timeFrame)};获取当前位置坐标和SED颜色代码。doa = data.doa(timeFrame,:);pcol = data.Colors{data.sed(timeFrame)};%更新预测行。data.YPlot.XData = [0,doa(1)];data.YPlot.YData = [0,doa(2)];data.YPlot.ZData = [0,doa(3)];data.YPlot.Color = pcol;%更新预测点。data.YPlotDot.XData = doa(1);data.YPlotDot.YData = doa(2);data.YPlotDot.ZData = doa(3);data.YPlotDot.Color = pcol;data.YPlotDot.MarkerEdgeColor = pcol;data.YPlotDot.MarkerFaceColor = pcol;其他的关闭plot的可见性。data.YPlot.Visible =“关闭”;data.YPlotDot.Visible =“关闭”;data.PredictedAnnotation.Visible =“关闭”将当前预测的声音类别设置为静音,颜色编码为%的黑色。pClass =“沉默”;pcol =“k”结束更新注释字符串并对其进行颜色编码。如果Isequal (tcol,pcol) col =“b”其他的坳=“r”结束data.GTAnnotation.String = gtClass;data.GTAnnotation.Color = col;data.PredictedAnnotation.String = pClass;data.PredictedAnnotation.Color = col;drawnow结束

图4 d

函数plot4d (audioToPlay sedLabels doaLabels, sed, doa)图4D% plot4d(audioToPlay,sedLabels,doaLabels,sed,doa)创建的“电影”%地面真相和估计的声音事件在3-D环境随时间的变化。电影实时运行,并将audioToPlay播放到默认值。%声音设备。创建一个audioDeviceWriter对象来播放流音频。adw = audioDeviceWriter(SampleRate=32e3);创建并填充一个dsp。AsyncBuffer读取音频数据块。buff = dsp.AsyncBuffer(size(audioToPlay,1));写(浅黄色,audioToPlay);创建一个没有滑块的3d图形。。data = plot3d(sedLabels,doaLabels,sed,doa, incleslider =false);drawnow真实的和预测的标签定义的分辨率为0.1秒。创建一个%标记矢量,只在必要时更新3-D图。Changepoints = 0.1:0.1:60;初始化计数器。Idx = 1;elapsedTime = 0;%循环时,音频数据未读取。迷。NumUnreadSamples ~ = 0如果到达变更点,则更新绘图。。如果elapsedTime>changepoints(idx) update3DPlot(idx/600,data) idx = idx+1结束写一个数据块到你的声卡。。adw(读(迷,400));向前推经过的时间。elapsedTime = elapsedTime + 400/32e3;结束结束

选取颜色

函数colors = getColors()获取颜色% colors = getColors()返回14种惟一颜色的单元格数组。定义14种颜色来对声音类进行颜色编码。颜色= {(0,0.4470,0.7410),(0.8500,0.3250,0.0980),(0.9290,0.6940,0.1250),(0.4940,0.1840,0.5560),...(0.4660 0.6740 0.1880)、(0.3010 0.7450 0.9330)、(0.6350 0.0780 0.1840),(0.2,1),0.6,0,0.6,...[0.6, 0.6, 0], [0.6, 0.3, 0], [0, 0.4, 0.2], [0.2, 0, 0.4], [1, 0.6, 0.6]};结束

参加声音课程

函数soundClasses = getSoundClasses()获取声音类(键)和值之间的映射。soundClasses = categorical([“沉默”“监狱”“键盘”“橱柜”“抽屉”“女性”“手指折断”...“钥匙”“敲门”“笑”“男性”“打印机”“剪刀”“电话”“写”]);结束

参考文献

Sharath Adavanne, Archontis Politis, Joonas Nikunen,和Tuomas Virtanen,“使用卷积递归神经网络的声音事件定位和重叠源检测,”上面。信号的过程。第13卷第1期。1, pp. 34-48, 2019。

Eric Guizzo, Riccardo F. Gramaccioni, Saeid Jamili, Christian Marinoni, Edoardo Massaro, Claudia Medaglia, Giuseppe Nachira, Leonardo Nucciarelli, Ludovica Paglialunga, Marco Pennese, Sveva Pepe, Enrico Rocchi, Aurelio Uncini和Danilo Comminiello《L3DAS21挑战:3D音频信号处理的机器学习》,2021年。

[3]曹寅,孔秋强,Turab Iqbal,安凤燕,王文武,Mark D. Plumbley,“基于两级策略的复音事件检测和定位”,arXiv预印本:arXiv:1905.00268v4, 2019。

Baidu
map