微信摇一摇搜歌技术原理分析

上传人:第*** 文档编号:31142770 上传时间:2018-02-05 格式:DOC 页数:8 大小:331.50KB
返回 下载 相关 举报
微信摇一摇搜歌技术原理分析_第1页
第1页 / 共8页
微信摇一摇搜歌技术原理分析_第2页
第2页 / 共8页
微信摇一摇搜歌技术原理分析_第3页
第3页 / 共8页
微信摇一摇搜歌技术原理分析_第4页
第4页 / 共8页
微信摇一摇搜歌技术原理分析_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《微信摇一摇搜歌技术原理分析》由会员分享,可在线阅读,更多相关《微信摇一摇搜歌技术原理分析(8页珍藏版)》请在金锄头文库上搜索。

1、1华北水利水电大学微信摇一摇搜歌技术原理分析姓名: 刘 勇 学号: 201215708 2摘要:给出一首歌利用 cool edit 等多轨录音和音频处理软件得出语谱图,然后利用傅里叶变换得到语音波形图,从中找到多个“音乐指纹”p,然后匹配哈希表匹配已知的音乐指纹,如果相同即为同一首歌;而经过版本改进之后的Local Sensitive Hash 局部敏感哈希基于快速近邻搜索,抗噪性更强。关键词:傅里叶变换;音乐指纹;哈希表;局部敏感哈希1、提取音乐指纹首先,一首 MP3 用 cool edit 之类的软件打开将是下图这样,以陈百强的情人片段距离,以下波形图示 20 秒片段。接下来对这个波形做短

2、时傅里叶变换(SFFT) ,可以得到下面这个类似乐谱的图,叫做谱图(spectrogram) ,纵坐标是频率,横坐标是时间。亮的地方代表能量高。每一首乐曲因为乐器、音高不同,所以它们谱图都不同。哪怕是不同的人3用同一伴奏,甚至相同的人分开两次唱,语谱图都是有细微差别的,体现在亮的位置不同上。PS: 傅里叶变换 是可逆的,也可以将 语谱图转化为 波形放出来听,这也是现代频谱作曲流派的方法。既然两首曲子亮的位置不同,我们就可以根据亮点来区分两首歌一不一样。如下图找到谱图上若干个最亮的点,比如下图找到了点 1,点 2,点 3。它们的音高记作 y1,y2,y3, 点 1 和点 2 的横坐标距离记作 d

3、x1, 点 2 和点 3 的横坐标距离记作 dx2。我们用向量 p=y1,y2,y3,dx1,dx2作为这个片段的特征,我们将 p 叫做音乐指 纹。如果两首歌的 p 相同,那么我 们就认为这两首个一样啦!否则就不一样。42、音乐指纹匹配哈希表事实上为了稳定和抗噪,我们可能会对一首歌提取更多的指纹 p,比如 100 个录音环境经常会有噪音,如果匹配中了 50 个以上,我们就认为是同一首歌。而那些不一样的歌,基本上匹配数不会超过个位数。这就是基本原理了,是不是很简单!当然另一个问题就是大数据量了,酷狗的音乐库动辄上百万,总不可能对用户录制的片段一条一条去匹配吧?所以这里我用的不是逐条匹配,而是哈希

4、表匹配。总的说来就是把每个 p 映射成不同整数,比如 p=24,8,46,13,29可以映射成 14335621。每个 p对应着一首歌的某个位置,建库的时候把所有曲目的指纹都插到这个巨大的哈希表中。如下所示。5那么加入我们想查找 14335621 对应的曲子,就可以一瞬间找到。就像查字典一样,找到偏旁部首对应的页数一样。这样即使曲目再多也不怕了。3、局部敏感哈希抗噪性更强 局部敏感哈希 LSH在很多应用领域中,我们面对和需要处理的数据往往是海量并且具有很高的维度,怎样快速地从海量的高维数据集合中找到与某个数据最相似(距离最近)的一个数据或多个数据成为了一个难点和问题。如果是低维的小数据集,我们

5、通过线性查找(Linear Search)就可以容易解决,但如果是对一个海量的高维数据集采用线性查找匹配的话,会非常耗时,因此,为了解决该问题,我们需要采用一些类似索引的技术来加快查找过程,通常这类技术称为最近邻查找6(Nearest Neighbor,AN),例如 K-d tree;或近似最近邻查找(Approximate Nearest Neighbor, ANN),例如 K-d tree with BBF, Randomized Kd-trees, Hierarchical K-means Tree。而 LSH 是 ANN 中的一类方法。我们知道,通过建立 Hash Table 的方式我

6、们能够得到 O(1)的查找时间性能,其中关键在于选取一个 hash function,将原始数据映射到相对应的桶内(bucket, hash bin),例如对数据求模:h = x mod w,w 通常为一个素数。在对数据集进行 hash 的过程中,会发生不同的数据被映射到了同一个桶中(即发生了冲突 collision),这一般通过再次哈希将数据映射到其他空桶内来解决。这是普通 Hash 方法或者叫传统 Hash 方法,其与 LSH 有些不同之处。局部敏感哈希示意图( from: Piotr Indyk)LSH 的基本思想是:将原始数据空间中的两个相邻数据点通过相同的映射或投影变换(projec

7、tion)后,这两个数据点在新的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小。也就是说,如果我们对原始数据进行一些 hash 映射后,我们希望原先相邻的两个数据能够被 hash 到相同的桶内,具有相同的桶号。对原始数据集合中所有的数据都进行 hash 映射后,我们就得到了一个 hash table,这些原始数据集被分散到了 hash table 的桶内,每个桶会落入一些原始数据,属于同一个桶内的数据就有很大可能是相邻的,当然也存在不相邻的数据被 hash 到了同一个桶内。因此,如果我们能够找到这样一些 hash functions,使得经过它们的哈希映射变换后,原始

8、空间中相邻的数据落入相同的桶内的话,那么我们在该数据集合中进行近邻查找就变得容易了,我们只需要将查询数据进行哈希映射得到其桶号,然后取出该桶号对应7桶内的所有数据,再进行线性匹配即可查找到与查询数据相邻的数据。换句话说,我们通过 hash function 映射变换操作,将原始数据集合分成了多个子集合,而每个子集合中的数据间是相邻的且该子集合中的元素个数较小,因此将一个在超大集合内查找相邻元素的问题转化为了在一个很小的集合内查找相邻元素的问题,显然计算量下降了很多。那具有怎样特点的 hash functions 才能够使得原本相邻的两个数据点经过 hash变换后会落入相同的桶内?这些 hash

9、 function 需要满足以下两个条件:1)如果 d(x,y) d1, 则 h(x) = h(y)的概率至少为 p1;2)如果 d(x,y) d2, 则 h(x) = h(y)的概率至多为 p2;其中 d(x,y)表示 x 和 y 之间的距离,d1 d2, h(x)和 h(y)分别表示对 x 和 y 进行 hash 变换。满足以上两个条件的 hash functions 称为(d1,d2,p1,p2)-sensitive。而通过一个或多个(d1,d2,p1,p2)-sensitive 的 hash function 对原始数据集合进行 hashing生成一个或多个 hash table 的过

10、程称为 Locality-sensitive Hashing。使用 LSH 进行对海量数据建立索引(Hash table)并通过索引来进行近似最近邻查找的过程如下:1. 离线建立索引(1)选取满足 (d1,d2,p1,p2)-sensitive 的 LSH hash functions;(2)根据对查找结果的准确率(即相邻的数据被查找到的概率)确定 hash table 的个数 L,每个 table 内的 hash functions 的个数 K,以及跟 LSH hash function 自身有关的参数;(3)将所有数据经过 LSH hash function 哈希到相应的桶内,构成了一个或

11、多个 hash table;2. 在线查找(1)将查询数据经过 LSH hash function 哈希得到相应的桶号;8(2)将桶号中对应的数据取出;(为了保证查找速度,通常只需要取出前 2L个数据即可);(3)计算查询数据与这 2L 个数据之间的相似度或距离,返回最近邻的数据;LSH 在线查找时间由两个部分组成: (1 )通过 LSH hash functions 计算hash 值(桶号)的时间;(2 )将查询数据与桶内的数据进行比较计算的时间。因此,LSH 的查找时间至少是一个 sublinear 时间。为什么是 “至少”?因为我们可以通过对桶内的属于建立索引来加快匹配速度,这时第(2)

12、部分的耗时就从O(N)变成了 O(logN)或 O(1)(取决于采用的索引方法)。LSH 为我们提供了一种在海量的高维数据集中查找与查询数据点(query data point)近似最相邻的某个或某些数据点。需要注意的是,LSH 并不能保证一定能够查找到与 query data point 最相邻的数据,而是减少需要匹配的数据点个数的同时保证查找到最近邻的数据点的概率很大。音乐检索对于一段音乐或音频信息,我们提取其音频指纹(Audio Fingerprint)来表征该音频片段,采用音频指纹的好处在于其能够保持对音频发生的一些改变的鲁棒性,例如压缩,不同的歌手录制的同一条歌曲等。为了快速检索到与

13、查询音频或歌曲相似的歌曲,我们可以对数据库中的所有歌曲的音频指纹建立 LSH 索引,然后通过该索引来加快检索速度。结语:当然实际上还有很多细节需要考虑,我通常用 matlab 做研究,用 C+做实际系统。由于这是一个巨大的检索结构,因此哪怕是 1 个字节乘上 100万都是巨大的开支。百万首歌构建的哈希表内存占用甚至可以达到100Gb。C+在控制内存、优化速度上非常有优势。由于 STL, BOOST 等标准库并不能满足这种特殊需要,在重写了内存池,哈希表等最底层的数据结构,经过 8 个版本的改进优化后,目前 单曲的搜索速度可以在百万级的数据库上小9于 0.02 秒,准确率 98%以上。Local Sensitive Hash 局部敏感哈希基于快速近邻搜索,抗噪性更强。微信摇一摇搜歌,其原理也是基于局部敏感哈希的。其原理是以内存和搜索时间为代价,获得更高的召回率。所以在复杂的环境下,识别效果更好。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号