C#音频指纹技术与局部敏感哈希

3
我之前找到了一些类似的帖子,但没有一个真正回答了我的问题。
在我的指纹识别中,我生成了一个包含5个整数的记录集。例如: 33,42,88,121,194
这些对应于具有最高幅度的频率,用于特定音乐样本。 例如:对于30毫秒的音频样本,我有以下频率桶:
0-40 40-80 80-120 120-180 180-250
我试图生成一个哈希(宽容性的),它将为33,42,88,121,194生成与以下值相同的哈希:
33,43,88,122,195
其中频率存在轻微差异时,会形成类似的哈希。
首先,这是局部敏感哈希(LSH)吗?因为我读到这是音频指纹识别的最佳方法。
如果不是,请问是否能提供一些伪代码或C#函数,以实现我正在寻找的功能?我已经阅读了关于LSH、Matlab和Perl实现的文章,但我并不理解它们,所以向它们的链接并不会对我太有帮助。
再次感谢!
1个回答

0

这可能是一个重复的问题:比较两个频谱图以找到它们匹配的算法的偏移量,看起来你试图做的是为样本中峰值的粗略分布生成直方图。有几种方法可以做到这一点,另一个“示例”在这里:比较两个频谱图以找到它们匹配的算法的偏移量

其中一种方法是使用峰值数据及其(随时间)分布的快速傅里叶变换,以产生样本的精简形式的粗略等效物。要做到这一点,您可以大致按以下方式操作:

  1. 将样本分成若干个离散部分(比如1秒)
  2. 对于每个样本部分,开发一个指纹来近似表示该样本(比如取5-7个高低峰值,对它们进行归一化,然后哈希它们)
  3. 现在你可以将每个指纹单独保存(在一个集合中),或者在序列上运行变换以生成一个单一的指纹,具体取决于你的需求。大多数情况下,你只需要将这些序列连接起来,以获得1秒间隔的线性指纹。

要比较指纹,你需要对第二个样本运行相同的过程,然后使用Diff算法进行比较,使用一些“模糊”来确定它们之间的接近程度。你需要在两个维度上比较指纹,即离散指纹的顺序和每个样本的总体差异。

关于如何制作一个粗略的Java版Shazaam的文章已经发布了一段时间:http://www.redcode.nl/blog/2010/06/creating-shazam-in-java/,可能对你有所帮助。


感谢您之前提供的链接,我使用它来循环遍历所有频率(从FFT返回)并找到特定范围/桶中具有最高振幅的频率。我想我的问题在于,我可以使用这种方法识别mp3文件,但是对于声音数据是一个真正的挑战。 - user1112324
样本中的"静态"越多,匹配的可能性就越小。当您处理波形(即纯约束语音数据)时,可以对波形进行采样并对每个采样应用FFT,然后独立地查看FFT,例如高频范围、中频范围和低频范围。如果您喜欢这个答案,请点赞和接受。 - GrayWizardx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接