本文是音频指纹系统的权威论文,被引用近500次,除了一些背景信息、验证性分析和实验结果,翻译了大部分内容。
原文下载:http://www.nhchau.com/files/AudioFingerprint-02-FP04-2.pdf
具有高度鲁棒性的音频指纹识别系统
摘要
本文提出一个音频指纹系统。将一首未知音频段的指纹作为指纹数据库的查询,数据库包括大量歌曲的指纹,用于识别出查询的音频段。系统核心是一个高度鲁棒性的指纹提取方法和一个高效的指纹搜索策略,保证了在有限的计算资源下搜索大规模的指纹数据库。
1. 背景介绍
指纹系统有着悠久的历史,而近年来多媒体指纹系统在学术上和工业上也越来越受关注。多媒体指纹的主要目的是建立两个多媒体对象感知等价的高效机制:并不是通过直接比较对象(规模大),而是比较其对应的指纹(规模小)。大多数用到指纹技术的系统中,大规模的多媒体对象指纹和对应的元数据(歌手名,标题,专辑名等)会存储在数据库里。指纹相当于元数据的索引。待识别的多媒体内容的元数据通过计算其指纹来检索,并用它的指纹查询指纹/元数据的数据库。使用多媒体的指纹比使用元数据的优点:
1) 指纹相对较小,存储需求降低
2) 指纹中移除了不相关的感知,对比效率提高
3) 需搜索的数据集更小,搜索效率提高
指纹系统通常包括两部分:提取指纹的方法,在指纹数据库中高效搜索匹配指纹的方法。
本文描述了一个适用于很多应用场景的音频指纹系统。第2章定义了音频指纹的概念,第3章阐释了可能的应用场景,注重音频指纹系统的技术方面。第4章为指纹提取,第5章为指纹搜索。
2. 音频指纹概念
2.1 音频指纹定义
音频指纹可以看成是音频对象的摘要。指纹函数F要映射一个位数很多的音频对象X,到一个只有限定位数的指纹上。
哈希函数将很大的对象X映射到很小的哈希值上(换句话说就是消息摘要)。哈希函数通过比较哈希值H(X)和H(Y)来比较对象X和Y。数学上前者严格等价意味着后者严格等价,只有极低的错误率,设计适当的哈希函数错误率只有2^(-n),n为哈希值的位数。用哈希函数还有高效的方法检测一个大数据集Y={Yi}中是否存在数据项X,只需存储{hi=H(Yi)},用H(X)与其比较即可。
有了上述特性,有人认为哈希函数可以作为指纹函数的备选。但是,哈希函数给出的是严格数学等价,而我们需要的是感知上的相似。比如同一首歌的CD版和MP3版,对于人的听觉系统感觉是一样的,但是他们的波形区分很大。感知上相似,但数学上完全不同。哈希函数不能判断感知等价,并且它对位很敏感:对象有一位不同,哈希值会完全不同。
又有人提出,能否设计这样一个指纹函数,感知相似的对象有数学等价的指纹。这个函数是可以设计出的,但是对感知相似性建模根本不可能。因为感知相似性没有传递性。比如X和Y相似,Y和Z相似,无法推出X和Z相似。但是用上述函数建模会得到X和Z相似。
本文提出了一种指纹函数,相似的音频对象有相似的指纹。且不相似的对象有很大概率得出不相似的指纹。数学上描述为,设指纹函数F,门限T,对象X和Y相似,那么有很大概率得到||F(X)-F(Y)||<=T;不相似则有很大概率得到||F(X)-F(Y)||>T。
2.2 音频指纹系统参数
(1) 鲁棒性:考虑到信号劣化的问题,实现强鲁棒性应该选择不变的感知特征作为指纹(至少在一定程度上不变)。最好的情况就是,严重退化的音频仍然能得到非常相似的指纹。通常用漏报率衡量。感知相似的音频段的指纹不同导致无法匹配时,就会发生漏报。
(2) 可靠性:用误报率衡量。将音频段识别错误的概率。
(3) 指纹大小:为了保证搜索速度,指纹存储于内存中。通常用每秒比特数或每首歌的比特数表示。指纹大小决定了指纹数据库服所需要的内存资源。
(4) 粒度:识别所需的音频段最小时长。粒度取决于不同应用。某些应用中整首歌都用来识别,而另一些则只需音频的一小段即可识别。
(5) 搜索速度和可扩展性:音频指纹系统若商用,搜索速度和可扩展性是关键参数。系统要做到在有限的计算资源上,在10万量级的数据库中搜索,速度在毫秒量级。
五个基本参数相互影响很大。比如想要粒度小,则需要提取更大规模的指纹,以保证可靠性。这是由于误报率和指纹大小成反比。又如设计更强鲁棒性的指纹,搜索速度就会提升。这是由于指纹搜索是近邻搜索,相似的指纹必须要找到。如果特征鲁棒性更强,近邻就会更相似,搜索速度就能提升。
3. 应用
3.1 广播监测
用于自动生成收音机、电视或网络广播的播放列表。监测中心是存储指纹的服务器,从监测站点从地区广播频道提取音频指纹,中心站点收集指纹,自动生成播放列表。
3.2 音频连接
将音频和一些附加信息连接起来。如车载收音机中加入识别歌曲按钮,或指纹应用能够“听”收音机的歌曲,记录到PC的声卡中,按下“信息”按钮显示包含当前播放歌曲的网页,按下“购买”按钮在网上购买专辑等。
3.3 文件共享的过滤技术
例如音乐共享与下载网站Napster,由于版权问题,Napster必须防止用户下载正版音乐。但是用户通过故意拼写错误还是能下载。后Napster引入音频指纹系统,能够高效过滤掉正版音乐,即使在拼写错误的情况下。通过指纹系统可靠的元数据,还能以名字对音乐进行组织,并保证下载的音乐和标题对应。
3.3 自动音乐库组织
目前PC用户的电脑上一般都有数百首歌曲,来自CD或共享网站上,但是元数据经常不一致,不完整,甚至不正确。若有一个包含正确元数据的音频指纹库,那么这些歌曲就能很好的组织起来。
4. 音频指纹提取
4.1 指导原则
音频指纹在于捕捉音频的相关感知特征。提取和搜索指应该简便快捷,较好的适应小粒度,以方便有较高需求的应用(如手机识别)。设计实现音频指纹策略之前,先确定一些基本问题如下:
最突出的问题就是:哪种特征最合适。目前的文献普遍认为相关特征分为两类:语义特征和非语义特征。语义特征如:类型,节拍,情感。这些特征通常比较直观,用来对音乐分类,生成播放列表等。非语义特征通常是数学上的性质,人不能直接从音乐“读出”这些特征。典型的例子如音频平坦度。本文选择非语义特征的原因:
(1) 语音特征通常没有清晰明确的意义。在分类中,不同人可能会有不同的分类结果。并且,语义可能随时间变化。如25年前的摇滚现在被看做轻音乐。这些都让数学分析更加困难。
(2) 语义特征一般更难计算。
(3) 语义特征不普遍适用。如节拍不适用于经典音乐。
第二个问题就是指纹的表示。比较明显的方法是用实数数组表示,数组的每个元素表示某个基本感知特征的权重。另一个方法和哈希函数的思想类似,用位串表示数字化指纹。为了降低搜索复杂度,本文采用第二种方法。因为第一种方法意味着相似度度量会有实数的加减乘法。而用位表示指纹用位运算就能比较指纹。这种方案下,并不要求二进制指纹在每一位有很强的鲁棒性。允许指纹用数千位表示,以保证在不匹配位数相对较高时仍有可靠的识别结果。
最后一个问题是指纹的粒度。应用中不保证待识别的音频是完整的。所以我们采取一种称为“指纹流”的策略,通过将子指纹分成足够小的单位片段(就是帧)来实现。包含足够多的帧,就能保证识别的鲁棒性和可靠性。
4.2 提取算法
大多数指纹提取算法都基于以下方法。首先是将音频信号分帧,计算每帧的特征,选取信号劣化时仍不变的特征(至少一定程度上不变)。常用的音频特征:傅里叶系数,MFCC,谱平坦度,锐度,LPC系数等,还会用到导数,均值,方差等。提取的特征用分类算法(如HMM或量化)映射为更紧凑的表示。单个帧的紧凑表示称为“子指纹”。全局指纹程序就是把音频流转换为子指纹流。一个子指纹包含的数据不足以识别音频段。包含足够数据识别音频段的基本单位(决定了粒度)被称为“指纹块”。
本文的指纹提取策略基于这种流的方法。对每个11.6毫秒的片段,提取一个32位的子指纹。一个指纹块包括256个子指纹,对应3秒的粒度(0.0116*256≈3)。策略的概述如图1所示。音频信号首先分为相互重叠的帧,帧长0.37秒,用汉明窗给出权值,重叠因子31/32。这个策略保证每11.6毫秒提取一个子指纹。即提取的帧和数据库中的帧边界最多相差5.8毫秒。较大的重叠保证在最坏情况下,音频段的子指纹和数据库中对应的片段仍很相似,并缓慢变化。图2a显示了一个提取指纹块中,随时间轴缓慢变化参数的例子。
图1指纹提取策略概述
最重要的感知音频特征在频域。用傅里叶变换计算频谱。由于傅里叶变换对不同帧边界的相位敏感,而人类听觉系统(HAS)对相位不敏感,所以只保留频谱的绝对值(能量谱密度)。
为了抽取每帧的32位子指纹值,选取33个不重叠的频带。这些频带范围从300Hz到2000Hz(HAS的频谱范围),以对数距离为间隔。选对数间隔是由于HAS响应的频带近似为对数。实验证实能量的不同(同时在时域和频域)对很多处理方法都具有鲁棒性。如果定义帧n在频带m的能量为E(n,m),帧n的第m位子指纹为F(n,m),子指纹的位正式定义为(见图1中的灰色方框,T为延时元件):
图2是从歌曲“O Fortuna”的片段中提取的一个256个32位子指纹(指纹块)。位的值为1对应白色像素,0对应黑色。图2a和2b分别表示同一片段的CD和MP3(32Kbps)的指纹块。理想状态下它们应该完全相同,但是由于压缩,一些位在恢复时出错。这些位错误用做指纹策略中的相似度度量,在图2c中表示。
图2 (a)原始音乐段指纹块,(b)压缩的指纹块,
(c)黑点显示a和b的不同,即位错误(BER=0.078)
上述算法的需要的计算资源是有限的。由于算法只考虑2KHz以下的频段,原始音频首先会被降采样为5KHz单声道音频。设计子指纹防止信号劣化,所以可以用简便的降采样滤波器,同时不会降低性能。一般用16拍FIR滤波器。计算量最大的是帧的傅里叶变换。降采样后的帧长为2048个采样点。采用定点实数值FFT,指纹算法在PDA和手机上能够高效运行。
4.3 误报分析
如果两个3秒的音频信号的指纹块的汉明距离(位错误数)小于门限T,那么称两个信号近似。门限T直接决定误报率Pf(即不相似信号判定为相似的概率)。T越小,Pf越小,但漏报率Pn越大(即相似信号判定为不相似的概率)。
分析过程略。
4.4 鲁棒性实验结果
记录指纹提取策略在不同程度的信号劣化情况下的结果。具体结果略
5. 数据库搜索
5.1 搜索算法
实质是找到最相似的指纹,而不是精确查找。设指纹库包含10000首歌,平均长度5分钟。相应的子指纹大约有2.5亿个。为了识别来自未知音频的指纹块,要在数据库中找到最相似的指纹块。就是说,需要在2.5亿个子指纹中,找到位错误率最小的位置。暴力搜索的话,需要比较2.5亿次,计算机每秒约处理20万个指纹块,一次暴力搜索需要20分钟。
本文提出一种高效搜索算法。不同于暴力搜索计算每个位置的位错误率(BER),这种方法只计算一些候选位置的BER。候选以极大概率包含数据库中的最佳匹配点。
上述改进算法简述如下:假设至少有一个子指纹在数据库最佳位置有完全相同的匹配,以这个假设生成候选位置。若假设成立,在数据库这个唯一匹配的位置上,查询的指纹块的其中一个子指纹能完全匹配上。为了证实假设的有效性,图4中的点显示了图2中每个子指纹的位错误数。可见确实有若干个子指纹完全正确。若假设图2a的原指纹已经入库,那么它的位置就在图2b的候选位置中。
图4图2b对于图2a的位错误率
数据库的匹配位置通过图6的数据库结构恢复得到。指纹数据库包括一个查找表(LUT),其中包括所有可能的32位子指纹作为入口。每个入口指向一个列表,每个列表元素是一个指针,指向这个32位子指纹在实际指纹列表中的位置。实际系统中,由于内存的限制,包含2^32个入口不可行。并且查找表LUT是稀疏的,因为放在内存中的歌曲是有限的。所以这里用哈希表替代查找表。
再来计算一下在10000首歌数据库上,每次识别时指纹块比较操作的平均次数。包含2.5亿子指纹,列表中每个位置的平均出现次数是0.058(=2.5*10^8/ 2^32)(可见若用LUT,列表会很稀疏)。假设所有可能的子指纹等可能出现,每次识别的指纹块平均比较次数为15次(=0.058*256)。实际上,由于子指纹的非均匀分布,指纹比较次数提高20倍,约300次,搜索时间为1.5毫秒。
图6指纹数据库设计
那么,若至少有一个子指纹没有错误的假设不成立呢?答案是假设对有轻微的信号劣化的音频信号几乎都成立。然而,对严重劣化的信号假设不成立。图5显示了一个指纹块的每个子指纹均有错误的例子。所以检测所有位置,记录汉明距离为1的子指纹而非为0的。这会多出33次指纹比较(与原子指纹汉明距离为1的有33个,即只有1位不同),还是可接受的。但如果要处理子指纹最小位错误是3的,指纹比较次数上升为5489,这就不可接受了。但是翻转位数越多,非均匀因子20就越小。如考虑子指纹的32位都可以翻转,那么退化为暴力搜索,因数降为1。
图5灰线为每个子指纹的位错误率,黑线为最可靠位的错误概率
由于翻转位数的随机性,会产生更多的候选位置,很快就会导致搜索时间不可接受。我们提出用软解码信息的方法。即,估计并使用一个指纹的位被正确恢复的概率。
子指纹通过比较能量差异获得。若能量差异接近门限,那么位就有可能错误。相反,若能量差异比门限大很多,那么位错误率就低。得到了子指纹每一位的可靠性信息,将子指纹扩展为可能的子指纹列表。假设最有可能的子指纹在数据库最佳位置有完美匹配,指纹块就能用上文方法识别。每位分配一个1-32的可靠性排名,1表示最不可靠,32表示最可靠。这种方法就能实现只翻转一些最不可靠的位,生成一个最可靠子指纹列表。更精确的说,列表包含所有最大不可靠位数为N的子指纹。若可靠性信息准确,例如子指纹有3位错误,那么可靠性为1,2,3的位就是错误的,设指纹块每个子指纹最小位错误是3,每个子指纹生成8(=2^3)个子指纹就能识别,比上文中比较所有汉明距离为3的子指纹的方法快686倍。
实际应用中可靠性信息并不准确(例如可靠性低的位是正确的,反之亦然),所以提升并不十分显著,但还是有意义的。图5中,每个子指纹的最小位错误数为1,如前所述,通过生成33个候选位置能识别指纹块。图5还包含最可靠位的错误概率。从图中可见,第1个子指纹有8个错误,这8个错误位不是8个最不可靠位,因为其中一位可靠度为27。所以可靠性信息并不一直可靠。再考虑第130个子指纹,只有1个位错误,该位可靠度为3,就是说这个指纹块翻转3位才能指向指纹库中的正确位置。
依然通过图6描述搜索算法的工作过程。图6中指纹块最后一个子指纹是0x00000001。首先找到数据库中0x00000001的位置,图中可见查找表的0x00000001只指向一个位置,歌曲1中的位置p。计算指纹块和歌曲1对应位置(p-255到p)的子指纹位错误率。如果位错误率低于门限0.35,指纹块属于歌曲1的概率很大。否则,就是由于歌曲不在数据库中,或者子指纹有1位错误。假设子指纹有位错误,且最不可靠位是第0位。那么下一个最可能的候选就是0x00000000。图6显示,0x00000000有两个候选位置:分别在歌曲1和歌曲2,若指纹块和歌曲1,2中对应位置的位错误率低于门限,那么就会分布匹配为歌曲1,2。若都高于门限,其他可能的子指纹就会被用来生成更多的候选位置,或者换成指纹块中其他子指纹做相同的操作。如果指纹块中256个子指纹都用来生成候选,且没有低于门限的匹配,那么算法认为无法识别歌曲。
5.2 实验结果
略
6. 结论
本文提出一种新的音频指纹方法。每11.8毫秒提取一个32位子指纹,根据时域和频域的能量变化生成子指纹。指纹块包括256个子指纹,是识别歌曲的基本单位。指纹数据库包括一个两阶段搜索算法,算法只在候选位置进行指纹比对,候选位置由子指纹搜索选出。对应2.2节的参数,系统归纳如下:
(1) 鲁棒性:指纹提取有很强鲁棒性。甚至能识别录音的音乐和手机传输的音乐。
(2) 可靠性:4.3节得出了误报率模型。设定门限0.35,误报率为3.6*10^(-20)
(3) 指纹大小:每11.8毫秒提取一个32位子指纹,指纹大小为2.6kbit/s
(4) 粒度:指纹块包括256子指纹,对应3秒的音频,用作识别的基本单位。
(5) 搜索速度和可扩展性:20000首歌曲的数据库,每秒能处理几十个查询请求
后续研究集中于特征提取技术和优化搜索算法。