A Review of Algorithms for Audio Fingerprinting笔记

Cano P, Batle E, Kalker T, et al. A review of algorithms for audio fingerprinting[C]//Multimedia Signal Processing, 2002 IEEE Workshop on. IEEE, 2002: 169-173.读书笔记。

    前段时间研究回声消除中的延时估计方法,了解了webrtc的延时估计方法,同时看了另外一个用二元谱差audio fingerprinting方法。看完两个算法后就找到了这篇关于声纹综述性的文章。这篇文章里头不但描述了声音指纹识别的总体框架,并且介绍了大量声纹识别的主要方法。该文章提到声音指纹的多个特征,这些特征都是研究声音信号处理和声音匹配非常有用的特征。这篇文章对声音特征的认识有启发式的意义。

    因为是一篇综述文章没有办法概况得太简练,因此对文章主体部分做了翻译,也借此加深相关算法和名词的印象。其中下面提到的部分名词翻译不太确切,大家可以根据原文理解,下面提到的指纹(figureprint)特指声音指纹,或者简称声纹。

文章结构:

1、介绍

        本文介绍了声音指纹的应用领域,以及声音指纹需要满足的条件。声音指纹算法应该能够处理变速播放、均衡、背景噪声、D/A和A/D和转换编码器等等带来的声音失真。同时声音指纹算法应该具有较小的声音特征复杂度和搜索复杂度。

2、一般架构

        声音指纹识别的一般架构如下:


图1的框架中有两个基本的流程,一个是指纹的抽取,另外一个是匹配算法。指纹要求满足

1)具有区别度;

2)对畸变具有不变性;

3)压缩性好;

4)计算简单。

明显的,以上有的的特征都是相互矛盾,必须牺牲一些性质获得另外一些性质。

    指纹抽取的模块如下图2:


        图2中描述的前置运算包括一些转换信号的方法,其作用在于便于特征的提取。指纹建模块记录最后的指纹表现形式,包括向量、向量轨迹、码本、HMM声音类别的一系列索引、一组错误校验码或者是音乐意义上的高级属性。

        给定了一段声音的声音特征,剩下的问题就是从数据库里头找到最匹配的声音特征。根据文章[1],搜索算法应该满足一下几个条件:

1)快速:对于大的数据库,大量的扫描和距离计算会导致算法非常慢;

2)准确:能够有效地拒绝,同时不要漏掉太多判断;

3)占用内存少:算法要求尽量减小内存开销;

4)容易跟新:算法应该能够方便地加入或删除相关的目标。

3、前置转换

        前置转换将声音信号转换为一组具有相关特征的信号,以便指纹建模模块块使用。选用前置转换的时候需要考虑以下几点:

1)减小维度;

2)感知上有效的参数(类似用于人听觉系统的参数);

3)不变形性和鲁棒性(对于信道失真,噪声,等等);

4)时间相关性(特别在那些使用动态谱的系统中)。

A、预处理

这一步包括把信号离散化并转化成需要格式:例如 16bitPCM,5-44.1khz,单声道格式等等。另外也包括编解码、预增强以及归一化到(-1,1)等等操作。

B、分帧和重叠

分帧和重叠需要考虑信号短时平稳性,精度和帧之间的连续性(包括使用什么窗做变换)。这一步也会影响到计算复杂度。

C、线性变换:谱估计

线性变换背后的思想就是:把一组测度变成新的一组特征集合。选择适当的线性变换,能够有效减少数据冗余。在解相关和信息压缩意义上的最优变换包括KLT,SVD等[9],但是必须考虑其运算复杂度。因此,最常用的仍是时频变换。也有像Lourens[11](为了简化计算)和 Kurth[12](时频分析存在失真时,对严重失真信号建模)等人使用功率测度,本质上说,功率测度也是时频分析的一种,只是它仅仅考虑频点而不考虑相位。

最普遍应用的是FFT,其他一些变换例如DCT,Haar 变换Walsh-Hadamard[2]变换也被使用到这个领域。Richly等人发现DFT和Walsh-Hadamard变换对平移变换不敏感[13],而Mihc ¸ak等人[5]和Burges等人[14]使用的Modulated Complex Transform (MCLT)的方法几乎具有平移不变性[5]。

D、特征抽取

这一步中有大量的算法用于产生最后的声音特征向量,这些算法目标在于减少维同时增加对失真的鲁棒性。很多算法运用了人的感知学知识来提取有用的参数,使用频谱critical-band分析抽取重要的特征,例如文章[6]和[15]用到MFCC。文章[7]使用平度测度算法,这种方法可以估计某一个频带中语音或者是噪声的质量。Papaodysseus等人[16]提出频带表示向量(band representative vectors)的方法,它是一个有序的频带中突出音调的索引列表(例如峰值和明显幅度)。每个频带的能量也被Kimura等人作为特征[3]。Haitsma等人使用33个Bark-scaled的频带来获得它们的哈希字符串,它是能量带的差的符号(同时在时间和频率轴上计算)[4]。

然而Sukitanon和Atlas等人声称当声音信道发生失真时,谱估计和相关的特征将变得不准确[8]。他们提出了一种调试频率分析方法来描述音频信号的时变表现,他们把19个Bark空间子带滤波器能量的调制频率估计的几何均值最为特征。

音乐信息检索的方法用到的特征能够改善声音匹配的有效性,这些特征包括调和性(harmonicity)、带宽、响度[15]和ZCR等等。

另外Burges等人提出常用的启发式的特征未必是最优特征[14],他们提出一个种改进KL变换的定向主分量分析方法(Oriented Principal Component Analysis ,OPCA),在没有监督的情况下,用这种方法寻找最优的特征。如果PCA(KL)方法找到了最大化信号方差的正交方向,那么OPCA能够将一些预定义失真纳入考量,获得一组可能非正交的方向。

E、后处理

在获得特征后,为了更好地衡量其时变的变量,特征对于时间的高阶导数也被引入到信号模型中。论文[6]和[17]就用到了级联的MFCC以及能量的一阶和二阶导数作为特征向量。某些系统只用到特征的导数而不是绝对特征[7],[12]。使用特征导数往往会放大噪声[10],但同时能够滤除线性是不变或者是慢变信号带来的畸变(例如均衡)。倒谱均值归一化(Cepstrum Mean Normalization ,CMN)方法就能用于减小线性慢变的信道失真[17]。如果使用了欧几里得距离,建议使用均值减法(mean subtraction)和归一化方差变量。一些系统例如[6],[17]会用变换(如PCA)压缩特征值向量。

当然三元化[13]、二元化[4],[12]这种非常低精度的量化方法也广泛应用。量化的目的就在于增加算法对于失真的鲁棒性([4],[12])、归一化([13])、易于硬件实现、减少内存使用以及方便后续模块的处理。文章[5]和[12]中,二元序列要求提取错误校验字。在文章[5]中,为了减少指纹的冲突概率,使用离散化来增加随机性。

4、指纹模型

指纹模型模块通过一帧一帧地计算主要分量的方式获得一系列的特征向量。在空余的时间里,改善整个数据库和当前录音的冗余,能够有效减少指纹大小。

通过综合全首歌的多维向量序列到一个向量的是指纹的一种非常简明的形式。Etantrum[18]计算出一段30秒的音频信号中基于16个子带滤波能量的方差和均值的向量,并用512个比特来标记。这个标记随着原始的语音一起传输到服务器用于识别。Musicbrainz的TRM标记[19]包括这么一组向量:平均过零率、估计的每分钟节拍数BPM、平均谱和其它反映一段语音(26s)的特征。上面的两个例子计算效率非常高并且指纹形式非常简洁。这些方法被用于关联MP3文件到数据库(题目、作者等等),并且它具有特异性,服务端和客户端要求低复杂度,音频流剪切和广播要求鲁棒性。

指纹也可以是一组特征序列(跟踪轨迹、轨迹等),例如文章[15],当然这些序列也可以是二元或者三元的,例如文章[4]。文章[16]使用二元编码的频带表示向量序列作为指纹来减少内存使用。

一些系统,例如[15]和[19],特征包括高级音乐意义的属性,例如像节奏(BPM)或者是突出的基音。

为了找到次优的启发式特征,Burges[14]等人使用OPCA的多层次来减少时间意义上特征向量的本地统计冗余。另外,减少维度、对于平移和倾斜额外的鲁棒性也是设计变换需要考虑的因素。

一首歌里的“全局冗余”在文章[17]中也有探索。如果假设多个音频段的某些特征是相似的,那么可以通过聚类特征向量获得更加简洁的表现形式。这样可以通过码本的形式来简洁表示这些特征向量或者特征向量组。这种近似会导致音频的时间变化特性消失。如果像文章[7]一样,把短时的统计特性也收集起来,结果可以获得高识别率和快速的匹配。这是因为考虑到了时间相关的特性和减少了序列的长度。

文章[6]和[17]使用了指纹模型来进一步减少全局冗余,这个原理对于语音搜索非常具有启发意义。在语音中,使用声音类别的字母表,例如,电话能够用于分段原始语音信号变成文本,这样能够大大地减小冗余而不丢失太多的信息。同样地,可以把一段声音看成是由有限个声音类别组成的句子。例如感知上相同的打鼓声音大量出现在流行音乐中。这种近似产生服从于声音类别表的由一系列索引组成指纹。这些声音类别可以通过无监督的聚类算法和用HMM模型建模来估计。信号时间上的统计建模能够减少局部的冗余。指纹留存着声音随着时间变化的信息,表现为声音类别一组索引。

文章[5]中,离散的序列被映射到误差校验字的字典中。在文章[12]中,误差校验码在以索引方法为基的空间中。

5、距离和搜索方法

A、距离

距离测度是一个与模型类型非常相关的概念。相关性在比较向量序列的时候广泛使用。文章[15]中,应用了欧几里得距离和为处理不同长度序列的欧几里得轻微变种。在文章[8]中,使用根据熵估计获得最近邻属性作为距离。在向量特征序列被量化的系统中,Manhattan距离(二元时为汉明距离)被广泛应用[4]。Mihcak等人[5]称,指数伪范数(“Exponential Pseudo Norm” (EPN))的另一种误差测度能够比线性范数更合适区分距离的远近。

目前我们展示一种根据模板匹配范式的识别架构[9]:参考样本(存储在数据库里的指纹)和测试样本(从未知音频抽取的指纹)使用相同的格式并且更加相同的距离测度(例如汉明距离、相关性等等)做对比。在某些系统中,只有参考样本的指纹才作为真正的指纹,这些指纹可以被简洁地建模为码本或者是一组HMM的索引,例如文章[7],[17]。在这些例子中,通过直接比较未知音频的特征序列与知识库中存储的参考信号指纹获得距离测度。在文章[7]中,通过特征向量序列与不同的码本匹配来计算距离测度。对于每个码本,误差是累积的。未知的音频信号分频到具有最小累积误差的类别中。在文章[17]中,使用Viterbi算法揉和特征序列和指纹(其特征为描述在HMM声音类别中一组串联的索引),最后在数据库中选出最可能的通路。

B、搜索方法

除了指纹匹配中距离测度的定义,如何有效地把未知语音与可能几百万个指纹做对比也是系统易用性的基本问题。匹配算法依赖于指纹信号表现形式。向量空间能够利用空间存储算法的高效性[1]。在一个匹配发生时,一般的目标是建立数据结构、索引并且减小匹配距离计算次数。正如Chavez等人所述,大部分基于索引的算法近似地搜索等价类别结构集合,舍弃另一些类别,最后搜索剩下的部分[20](例子在文章[3])。用更简单的距离来快速评估许多假设,以及使用索引方法来克服复杂距离的蛮力匹配的想法在CBID相关的文章中有体现,例如[21]。Haitsma等人提出一种指纹的可能性片段的索引,它能够指向歌曲的位置。对于文章[4]中的穷尽搜索中,候选歌曲和位置列表能够非常有效并且提供精确的搜索。在文章[6]中,使用了启发式的方法,它类似于在计算生物学中匹配DNA的方法,这能够提升指纹是一系列符号的系统的搜索速度。Kurth等人在文章[12]中提到了使用从声音二元序列抽取的码字作为索引。这些方法尽管非常快速,但是用于建立索引的关键字会导致漏警错误。正如文章[22]中证明的,为了保证没有漏警,用于舍弃不可能假设简单的距离必须低于更复杂距离的下界。

6、假设检验

略。





Audio-Fingerprinting 是一个音乐指纹识别系统,使用的语言为 JAVA,同时需要用到 MySQL 数据库(虽然不是必须的,但这个系统采用他保存指纹和音乐信息)。他包含了指纹生成,数据库存储,和简易的服务器和客户端。他通过生成和记录音乐指纹,能够识别来自麦克风、文件等各个来源的音乐,并且有很高的抗噪性,同时他对文件属性和音乐质量不敏感。你可以使用服务器给手机或者其他程序提供音乐识别服务。你可以根据需求调节里面的参数,当前参数是为了在较短时间识别来自极大噪声和失真的音源,1500个左右的文件将产生接近24000000个指纹数 据。如果你只用于识别文件并且没有严重的噪声与失真,你可以修改参数,1个文件只需要少量指纹就可以识别,对于噪声较低的音源10s 200个指纹已经满足大多需求。简易使用方法需要安装MySQL,并执行Fingerprint. sql, 同时你可能需要修改max_allowed_packet参数,因为添加歌曲需要发送较大的包,我采用的参数是32M。修改MysqlDB中的数据库信息为你的数据库信息,如:private final String url = "jdbc:mysql://127.0.0.1:3306/musiclibary?user=yecheng"; private final String user = "yecheng"; private final String password = "yecheng";添加文件的方法:Ps:你可以重写添加的方法或者制作脚本或者直接使用其他软件实现转码功能,目前他能够从%title%}}%album%}}%artist%的文件名中获得信息。将文件转码为WAV,采样率为8000。调用Insert,参数为文件名或者文件夹。搜索音乐你可以调用Search 文件名搜索。在数据库较大的情况推荐采用运行Server,使用Client 文件名搜索。主要参数介绍Fingerprint:NPeaks:一个周期中每个子带的峰值点的个数 fftSize:FFT的窗口大小 overlap:FFT的窗口重叠大小 C:一个周期包含多少个窗口 peakRange:取峰值点时与多大范围的邻居比较 range_time:取点对的时候的时间范围,单位为秒 range_freq:取点对的时候的频率范围,单位为频率 Band:分成的子带,值对应FFT产生的数组索引 minFreq:最小频率 maxFreq:最大频率 minPower:最小能量修改的建议:提高识别率:减小minPower, 增加Band、NPeaks、range_time降低数据量:增大minPower,减小Band、NPeaks、rang_time其中建议先修改Band和minPower。Server:port:服务器的端口Client:ip:服务器的ip port:服务器的端口性能与效果数据量:音乐库为1500首歌,指纹数量为24000000个左右,服务器稳定后占用内存约340M。速度:处理器i7-3632QM,添加1500首歌用时约1919秒,一首歌约用时1.3秒。使用服务器查找10s的歌曲用时约0.2秒(不考虑客户端读取文件的时间)。准确度:对噪声较低的音频有很高的识别率,对噪声较高的也有接近商用的准确率,但是相对来说如果对于未出现在曲库的歌曲,也有一定的误报率。抗噪性:能够抵抗较强的失真和噪声,可以参考我给的测试音频。工作原理参考文档:ShazamMel scale本算法实现类似Shazam,首先我计算出音频的频谱图,将频谱根据频率分成若干子带,对每个子带查找若干个峰值点,本算法子带划分基于Mel频率。将获得的峰值点根据频率、时间范围组成点对。本算法的取点对频率范围为在子带内,其目的在于减少点对的数目并且提高分布式能力。取点对的时间范围为1s-4s。你可以根据需要修改这些参数。 标签:Audio
高动态范围 (High Dynamic Range,简称HDR) 视频是指能够显示更广泛亮度区域和更丰富细节的视频格式。为了在标准的显示设备上播放HDR视频,需要进行色调映射 (Tone Mapping) 处理,将HDR视频转换为标准动态范围 (Standard Dynamic Range,简称SDR) 视频。 《高动态范围视频的色调映射算法比较评价》是一篇综述性文章,对目前的色调映射算法进行了对比和评估。 首先,文章介绍了需要解决的问题,即如何保留HDR视频的丰富细节和对比度,同时适应不同的SDR显示设备,使得观众在任何显示设备上都能够获得良好的观看体验。 接下来,文章列举了几种主要的色调映射算法,并对它们进行了详细分析和比较。比如,全局映射算法主要通过压缩整个亮度范围来适应SDR设备,但可能会损失细节;局部映射算法则更加注重保留细节,但可能导致亮度不连续性;基于图像分割的算法可以在图像不同区域中应用不同的映射策略,但需要更多的计算资源。 在比较过程中,文章对每种算法的映射质量、计算复杂度和实时性等指标进行了评估。并举例说明了不同算法在真实HDR视频上的应用效果。 最后,文章总结了各种算法的优缺点,并提出了未来研究的方向。例如,如何在保留细节的同时提高计算效率,以适应高分辨率和高帧率的HDR视频。同时,如何结合人眼感知和动态映射策略,以提供更好的观看体验。 综上所述,《高动态范围视频的色调映射算法比较评价》通过详细分析和比较不同的色调映射算法,为高动态范围视频的后续研究和开发提供了重要参考和指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值