资源描述:
《微信摇一摇搜歌技术原理分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、微信摇一摇搜歌技术原理分析姓名:刘勇学号:201215708摘要:给出一首歌利用cooledit等多轨录咅和咅频处理软件得出语谱图,然后利用傅里叶变换得到语音波形图,从中找到多个“音乐指纹”p,然后匹配哈希表匹配已知的音乐指纹,如果相同即为同一首歌;而经过版木改进之后的Se^itiveHash局部敏感哈希基于快速近邻搜索,抗噪性更强。关键词:傅里叶变换;音乐指纹;哈希表;局部敏感哈希1、提取音乐指纹首先,一首MP3用⑺Of之类的软件打开将是K图这样,以陈百强的《情人》片段距离,以下波形图示秒片段。接下来对这个波形做短时傅里叶变换(SFF7;,可以得到下面这个类似乐谱的图,叫做谱图(spe
2、etrograiAA),纵坐标是频率,横坐标是时间。亮的地方代表能量高。每一首乐曲因为乐器、音高不同,所以它们谱图都不同。哪怕是不同的人用同一伴奏,甚至相同的人分开两次唱,语谱图都是有细微差别的,体现在亮的位置不同上。050100150200260300360PS:傅里叶变换是可逆的,也可以将语谱图转化为波形放出来听,这也是现代频谱作曲流派的方法。既然两首曲子亮的位置不同,我们就可以根据亮点来区分两首歌一不一样。如下图找到谱图上若干个最亮的点,比如下图找到了点1,点点3。它们的音高记作点1和点2的横坐标距离记作dxi,点之和点3的横坐标距离记作3x2。我们用向量作为这个片段的特征,我们将
3、P叫做音乐指纹。如果两首歌的P相同,那么我们就认为这两首个一样啦!否则就不一样。2、音乐指纹匹配哈希表事实上为了稳定和抗噪,我们可能会对一首歌提取更多的指纹P,比如个录音环境经常会有噪音,如果匹配中了50个以上,我们就认为是同一首歌。而那些不一样的歌,基本上匹配数不会超过个位数。这就是基木原理了,是不是很简单!当然另一个问题就是大数据量了,酷狗的音乐库动辄上百万,总不可能对用户录制的片段一条一条去匹配吧?所以这里我用的不是逐条匹配,而是哈希表匹配。总的说来就是把每个p映射成不同整数,比如2,46,可以映射成1433S621。每个p对应着一首歌的某个位置,建库的时候把所有曲目的指纹都插到这
4、个巨大的哈希表中。如下所示。01299999999那么加入我们想查找14335621对应的曲子,就可以一瞬间找到。就像查字典一样,找到偏旁部首对应的页数一样。这样即使曲0再多也不怕了。3、局部敏感哈希抗噪性更强局部敏感哈希LSH在很多应用领域中,我们而对和需要处理的数据往往是海量并且具有很高的维度,怎样快速地从海量的高维数据集合屮找到与某个数据最相似(距离最近)的一个数据或多个数据成为了一个难点和问题。如果是低维的小数据集,我们通过线性查找(LinearSearch)就可以容易解决,但如果是对一个海量的高维数据集采用线性查找匹配的话,会非常耗时,因此,为了解决该问题,我们需耍采用一些类似
5、索引的技术来加快奔找过程,通常这类技术称为最近邻奔找(NearestNeighbor,AN),例如K-dtree;或近似最近邻查找(ApproximateNearestNeighbor,ANN),例如K-dtreewithBBF,RandomizedKd-trees,HierarchicalK-meansTree。而LSH是ANN中的一类方法。我们知道,通过建立HashTable的方式我们能够得到O⑴的齊找时间性能,其屮关键在于选取一个hashfunction,将原始数据映射到相对应的桶内(bucket,hashbin),例如对数据求模:h=xmodw,w通常为一个素数。在对数据集进行h
6、ash的过程中,会发生不同的数据被映射到了同一个桶中(即发生了冲突collision),这一般通过再次哈希将数据映射到其他空桶内来解决。这是普通Hash方法或者叫传统Hash方法,其与LSH有些不同之处。blog.csdn.net/icvpr1*0••局部敏感哈希¥意图(from:PiotrIndyk)LSH的基本思想是:将原始数据空间中的两个相邻数据点通过相同的映射或投影变换(projection)后,这两个数据点在新的数据空间屮仍然相邻的概率很人,而不相邻的数据点被映射到同一个桶的概率很小。也就是说,如果我们对原始数据进行一些hash映射后,我们希望原先相邻的两个数据能够被hash到
7、相同的桶内,具有相同的桶号。对原始数据集合中所有的数据都进行hash映射后,我们就得到了一个hashtable,这些原始数据集被分散到了hashtable的桶内,每个桶会落入一些原始数据,属于同一个桶内的数据就有很人可能是相邻的,当然也存在不相邻的数据被hash到了同一个桶内。因此,如果我们能够找到这样一些hashfunctions,使得经过它们的哈希映射变换后,原始空间中相邻的数据落入相同的桶内的话,那么我们在该数据集合中进行近邻