【问题标题】:c# AudioFingerprinting and Locality Sensitive Hashingc# AudioFingerprinting 和 Locality Sensitive Hashing
【发布时间】:2012-01-27 03:30:09
【问题描述】:

我之前发现过类似的帖子,但没有什么能真正回答这个问题。

在我的指纹识别中,我生成了一个包含 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 的实现,但我不理解它们,所以发布指向它们的链接不会对我有太大帮助。

再次感谢!

【问题讨论】:

    标签: c# audio hash audio-fingerprinting


    【解决方案1】:

    这可能与此重复:Compare two spectogram to find the offset where they match algorithm,您似乎正在尝试为样本中峰值的粗略分布生成直方图。有几种方法可以做到这一点,另一个“例子”在这里:Compare two spectogram to find the offset where they match algorithm

    执行此操作的一种方法是使用峰数据及其分布(随时间变化)的快速傅里叶变换来生成蒸馏形式的样品的粗略等价物。为此,您需要做一些大致类似的事情:

    1. 将样本分成一些离散的部分(比如 1 秒)
    2. 为每个样本部分开发一个与样本近似的指纹(例如获取 5-7 个高低峰,对其进行归一化,然后对它们进行哈希处理
    3. 您现在可以单独保留每个指纹(在一个集合中),或者根据您的需要对序列运行转换以生成单个指纹。大多数情况下,您只需将序列附加在一起即可以 1 秒的间隔获得线性指纹。

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

    这篇关于制作一个粗略的 Java 等效于 Shazaam 的文章是不久前发布的:http://www.redcode.nl/blog/2010/06/creating-shazam-in-java/,可能对您有所帮助。

    【讨论】:

    • 非常感谢。我使用您之前提供的链接来循环遍历所有频率(从 FFT 返回)并找到具有最高幅度的特定范围/存储桶,如上所述。我想我的问题是我可以用这种方法来识别 mp3,但声音数据是一个真正的挑战
    • 样本中的“静态”越多,匹配的可能性就越小。当您使用波形(即纯受约束的声音数据)时,可以对波形进行采样并将 FFT 应用于每个采样并独立查看 FFT,例如用于高音域、中音域和低音域的 FFT。如果您喜欢这个答案,请点赞并接受。
    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2019-06-30
    • 2021-05-26
    • 2011-10-27
    • 2018-05-16
    相关资源
    最近更新 更多