音频指纹匹配 - 找到最接近的匹配

时间:2013-07-23 19:31:33

标签: python audio-fingerprinting

我使用pfcalc从声音片段获取音频指纹。它们看起来像这样:

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 ..

我试图将一个wistle与一个鸟叫相匹配。

3 个答案:

答案 0 :(得分:1)

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

我不确定我是否理解你要做的事情“我试图将一个wistle与鸟叫相匹配”,但我认为你要做的事情不会用音频指法来解决,因为它的设计是为了识别“几乎相似的“音频内容。

答案 1 :(得分:1)

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

./fpcalc -raw audio.wav

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

Python示例

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

并计算差异。

答案 2 :(得分:0)

指纹方法无法满足您的需求!

我见过Mel频率倒谱系数(MFFCs)来解决这类问题......

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