文章目录
音频模式识别是机器学习领域的一个重要研究课题,它包括音频标注、声音场景分类、音乐分类、语音情感分类和声音事件检测等任务。近年来,神经网络已被应用于解决音频模式识别问题。然而,以前的系统是建立在特定数据集上的,数据集时长有限。
最近,在计算机视觉和自然语言处理中,在大规模数据集上进行预训练的系统已经很好地推广到一些任务上了。然而,在大规模数据集上进行音频模式识别的预训练系统的研究还很有限。本文提出了在大规模音频数据集上训练的预训练音频神经网络(PANN)。
本文提出了一种同时使用对数-梅尔谱和波形作为输入特征的Wavegram-Logmel-CNN结构。本文最好的PAN系统在AudioSet标签上达到了最先进的平均精度0.439 (mAP),超过了之前最好的系统0.392。本文将PAN迁移到六个音频模式识别任务中,并在其中几个任务中展示了最先进的性能。
源码和预训练模型见: https://github.com/qiuqiangkong/audioset_tagging_cnn
音频模式识别的一个里程碑是AudioSet的发布,这是一个包含超过5,000小时的527个声音类别的音频记录的数据集。AudioSet没有发布原始音频记录,而是发布了从预先训练的卷积神经网络中提取的音频片段的编码特征。一些研究人员已经研究了具有编码特征的 building systems。
然而,编码特征可能不是音频记录的最佳表示,这可能限制那些系统的性能。在本文中,提出了使用多种神经网络对原始音频集录音进行训练的预训练音频神经网络(PANN)。本文显示了几个PAN系统比以前最先进的音频标记系统性能更好。我们还研究了PANN的音频标记性能和计算复杂性。
我们提出将PANN迁移到其他音频模式识别任务中。以前的研究人员已经研究了音频标记的迁移学习。例如,在《Transfer learning by supervised pre-training for audio-based music classification》中提出的百万首歌曲数据集上对音频标签系统进行预训练,从预训练的卷积神经网络(CNN)中提取的编码特征被用作第二阶段分类器的输入,例如神经网络或支持向量机(SVMs)。在MagnaTagATune和声学场景数据集上预先训练的系统在其他音频标记任务上进行了微调。这些迁移学习系统主要使用音乐数据集进行训练,并且限于比AudioSet更小的数据集。
本文的主要工作包括:
音频标记是音频模式识别的一项基本任务,其目的是预测音频片段中音频标记的存在与否。音频标记的早期工作包括使用手动设计的特征作为输入,如音频能量、过零率和梅尔频率倒谱系数(MFCC)。
生成模型,包括高斯混合模型(GMM)、隐马尔可夫模型(HMM)和判别支持向量机(SVMS)已经被用作分类器。最近,卷积神经网络(CNN)等基于神经网络的方法被用来预测音频记录的标签。基于CNN的系统在几个DCASE挑战任务中取得了最先进的性能,包括声学场景分类和声音事件检测。
然而,这些作品中的许多都集中在特定的任务上,声音类的数量有限,并且没有被设计成识别广泛的声音类。本文重点是在AudioSet上训练大规模的PANNs来解决一般的音频标记问题。




以前的音频标记系统是基于Log Mel谱图的,这是一种手工制作的功能。为了提高性能,一些研究人员提出建立一维CNN,直接在时域波形上操作。例如,戴等人提出了一种基于一维CNN的声学场景分类方法,Lee等人提出了一种新的分类方法。
以前的一维CNN系统没有比以对数-梅尔谱作为输入训练的系统性能更好。以前的时域CNN系统的一个特点是它们不是被设计来捕获频率信息的,因为在一维CNN系统中没有频率轴,所以它们不能捕获具有不同基音偏移的声音事件的频率模式。
频率模式对于音频模式识别很重要,例如,具有不同基音移位的声音属于同一类别。波形图被设计用来学习一维CNN系统中可能缺乏的频率信息。通过从数据中学习一种新的时频变换,波形图还可以改进手工制作的对数MEL频谱图。然后,波形图可以取代对数梅尔谱图作为输入特征,从而产生我们的波形图CNN系统。我们还将Wavegram和log Mel谱图作为新的特征相结合,构建了Wavegram-LogmelCNN系统,如图1所示。

为了建立波形图,我们首先将一维CNN应用于时间域波形。一维CNN从卷积层开始,滤波器层的长度为11,步长为5,以减小输入的大小。这会立即将输入长度减少到原来的1/5,从而减少内存使用量。紧随其后的是三个卷积块,其中每个卷积块由分别具有1和2膨胀的两个卷积层组成,被设计来增加卷积层的感受野。
我们将一维CNN层的输出大小表示为T×C,其中T是帧的数量,C是频道的数量。我们通过将C个通道分成C/F组来将该输出重塑为大小为T×F×C/F的张量,其中每组具有F个频率单元。我们称这个张量为波形图。波形图通过在每个C/F通道中引入F个频率仓来学习频率信息。我们在提取的波形图上应用了第II-A节中描述的CNN14作为主干架构,这样我们就可以公平地比较基于波形图和对数梅尔谱的系统。像CNN14这样的二维CNN可以捕获波形图上的时频不变模式,因为在波形图中核既沿时间轴卷积又沿频率轴卷积。
此外,我们可以将波形图和对数MEL谱图合并为新的表示法。这样,我们就可以利用来自时间域波形和对数MEL谱图的信息。该组合沿通道尺寸进行。波形图为音频标记提供了额外信息,补充了对数MEL谱图。图1显示了Wavegram-Logmel-CNN的体系结构。
在这一部分中,我们介绍了AudioSet标签的数据处理,包括数据均衡和数据增强。数据平衡是一种用于在高度不平衡的数据集上训练神经网络的技术。数据增强是一种用于增强数据集的技术,以防止系统在训练期间过度适应。
可用于训练的音频片段的数量因声音类别而异。例如,有90多万个音频片段属于“演讲”和“音乐”两个类别。另一方面,只有几十个音频片段属于“牙刷”这一类别。不同声音类别的音频片段数量具有长尾分布。
在训练期间,训练数据以小批方式输入到PAN。如果没有数据平衡策略,音频剪辑将从AudioSet统一采样。因此,在训练过程中,更有可能对具有更多训练片段的声音类进行采样,例如《讲话》。在极端情况下,小批量中的所有数据可能属于同一声音类别。这将导致PAN过度适应训练片段较多的声音类,而不适合训练片段较少的声音类。为了解决这一问题,我们设计了一种均衡采样策略来训练PANN。也就是说,从所有声音类别中大致相等地对音频片段进行采样,以构成小批量。我们使用术语“大约”是因为一个音频片段可能包含一个以上的标签。
数据增强是防止系统过度匹配的一种有用方法。AudioSet中的一些声音类只包含少量(例如数百个)训练片段,这可能会限制PANN的性能。我们在训练期间应用Mixup和SpeAugment来增加数据。
以前关于音频迁移学习的工作主要集中在音乐标记上,并且局限于比AudioSet更小的数据集。首先,我们在图2(A)中演示了PAN的训练。这里,DAudioSet是AudioSet数据集,X0、Y0分别是训练输入和目标。FCAudioSet是用于AudioSet标记的完全连接层。在本文中,我们提出对以下迁移学习策略进行比较。
首先,我们评估了PANN在AudioSet标注上的性能。然后,将神经网络转移到多个音频模式识别任务中,包括声学场景分类、一般音频标注、音乐分类和语音情感分类。
AudioSet是一个具有527个声音类别的本体的大规模音频数据集[1]。AudioSet中的音频片段是从Y ouTube视频中提取的。训练集由2,063,839个音频片段组成,其中包括22,160个音频片段的“平衡子集”,其中每个声音类别至少有50个音频片段。评估集由20,371个音频片段组成。
我们没有使用[1]提供的嵌入功能,而是在2018年12月使用[1]提供的链接下载了AudioSet的原始音频波形,并忽略了无法再下载的音频片段。我们成功下载了1,934,187个完整训练集的音频片段(94%),包括20,550个平衡训练集的音频片段(93%)。我们成功地下载了评估数据集的18,887个音频片段。如果音频片段短于10秒,我们就用静默将其填充到10秒。考虑到来自Y ouTube的大量音频片段是单声道的,采样率很低,我们将所有音频片段转换为单声道,并将其重新采样到32 kHz。
对于基于对数-梅尔谱图的CNN系统,对具有1024[33]大小的汉明窗口和320个样本的跳跃大小的波形应用STFT。此配置导致每秒100帧。在[33]之后,我们应用64个Mel滤波器组来计算对数Mel谱图。MEL组的下限和上限截止频率设定为50 Hz和14 kHz,以消除低频噪波和锯齿效果。我们使用torchlibrosa1,librosa[46]函数的一个PyTorch实现,将LOG MEL谱图提取构建到PANN中。10秒音频片段的对数MEL谱图的形状为1001×64。额外的一帧是由于在计算短时傅里叶变换时应用“中心”参数造成的。使用批大小为32的ADAM[47]优化器和学习率为0.001的优化器进行训练。系统使用单卡Tesla-V100-PCIe-32 GB进行训练,每个系统需要大约3天的时间从头开始训练600k次。
均平均精度(MAP)、曲线下平均面积(MAUC)和d素数被用作AudioSet标签的官方评估指标。AP是召回和查准率曲线下的区域,AP不依赖于真负例的数量,因为准确率和召回率都不取决于真负例的数量。另一方面,AUC是反映真阴性影响的假阳性率和真阳性率(召回)下的区域。D-素数[1]也被用作度量,并且可以直接从AUC[1]计算。所有指标都是按个别类别计算的,然后求所有类别的平均值。



我们提出了在AudioSet上训练的用于音频模式识别的预训练音频神经网络(PANN)。为了建立PANN,人们研究了多种神经网络。我们提出了一种从波形中学习的波形图特征,以及一种在音频集标记中实现最先进性能的波形图-对数-有线电视新闻网,存档了0.439的mAP。我们还研究了PANN的计算复杂性。我们证明了PANN可以被转移到广泛的音频模式识别任务中,并且性能优于以前的几个最先进的系统。当对新任务的少量数据进行微调时,PANN可能会很有用。在未来,我们将把PAN扩展到更多的音频模式识别任务。
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
Ruby初学者努力简单地将这个@@people散列的值打印到控制台classPerson#haveafirst_nameandlast_nameattributewithpublicaccessorsattr_accessor:first_nameattr_accessor:last_name#haveaclassattributecalled`people`thatholdsanarrayofobjects@@people=[]#havean`initialize`methodtoinitializeeachinstancedefinitialize(first_name,last_
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:AmazonAPIlibraryforPython?我正在寻找一个AmazonAPI,它可以让我:按书名或作者查找书籍显示书籍封面获取有关每本书的信息(价格、评级、评论数、格式、页数等)Python或Ruby库都可以(我只想要最容易使用的库)。有什么建议么?我知道在SO上还有其他一些关于此的帖子,但这些API似乎很快就过时了。[几个月前我尝试了几个建议的Ruby库,但无法让它们中的任何一个工作。]