1

我正在使用 fpcalc 从声音剪辑中获取音频指纹。它们看起来像这样:

AQAAE9GSKVOkLEOy5PlQE0d9fId7HD-aHD_xhMeRrKORLseX44etHD8AYcAgSrEjDKFAsIGIFAJZ

AQAAE1M9RUkW1NGFH0d4HcnyJIlw4UW17HiyPMHt4B18EX2go9qJTz_eJzgBgBg4CphigUCMGCWFAcAw

AQAAAA

现在我录制一个声音并对其进行指纹识别,它可能看起来像这样:

AQAAE5ISLVOkTEF-QfURpkGZHHeeIpehB3HMoRKaikbTKHvQNnlwpIdOxNHHY_IPJttlAECEI8BBAAgFAiigAA

现在我查看我的数据库以使用 levenshtein 距离找到最接近的匹配项,如下所示:

def levenshtein_distance(first, second):
    """Find the Levenshtein distance between two strings."""
    if len(first) > len(second):
        first, second = second, first
    if len(second) == 0:
        return len(first)
    first_length = len(first) + 1
    second_length = len(second) + 1
    distance_matrix = [[0] * second_length for x in range(first_length)]
    for i in range(first_length):
       distance_matrix[i][0] = i
    for j in range(second_length):
       distance_matrix[0][j]=j
    for i in xrange(1, first_length):
        for j in range(1, second_length):
            deletion = distance_matrix[i-1][j] + 1
            insertion = distance_matrix[i][j-1] + 1
            substitution = distance_matrix[i-1][j-1]
            if first[i-1] != second[j-1]:
                substitution += 1
            distance_matrix[i][j] = min(insertion, deletion, substitution)
    return distance_matrix[first_length-1][second_length-1]

我没有得到好的结果,因为声音与我给它的样本不匹配。

我这样做正确吗?那里有更好的指纹库吗?我使用python或ruby ..

我试图将哨子与鸟叫声相匹配。

4

3 回答 3

2

首先,您不应该直接比较代码字符串。我不知道 pfcalc 基于哪种算法,但它很可能会在音频输入的每一帧上测量一些音频特征(如能量、mfcc ......如上所述)。这些特征可能是整数值,然后将其转换为字符串(或 base64 字符串)。因此比较这些字符串的值没有任何意义(除非您试图识别相同的音频内容)。

我不确定我是否完全理解您要做什么“我正在尝试将哨子与鸟叫相匹配”,但我认为您要做的事情不会使用音频指法来解决,因为它旨在识别“几乎相似”音频内容。

于 2013-08-24T13:10:33.897 回答
2

使用 -raw 选项运行 fpcalc 可以为您提供需要比较的 32 位整数。

./fpcalc -raw audio.wav

为了便于比较,将每个指纹转换为 20 位:

Python 示例

fps_20 = [x >> 12 for x in fps]

并计算差异。

于 2014-10-13T08:57:51.177 回答
1

指纹方法不能很好地满足您的需求!

我见过梅尔频率倒谱系数(MFFC)来解决这类问题......

还有其他方法,如何提取一组描述符(平均不规则性、平均质心、标准差不规则性、MFCC)并使用一种分类方法(随机森林、MLP)!

于 2013-07-30T13:44:16.553 回答