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

Python 音频指纹匹配-查找最接近的匹配,python,audio-fingerprinting,Python,Audio Fingerprinting,我正在使用fpcalc从声音剪辑中获取音频指纹。它们看起来像这样: AQAAE9GSKVOkLEOy5PlQE0d9fId7HD-aHD_xhMeRrKORLseX44etHD8AYcAgSrEjDKFAsIGIFAJZ AQAAE1M9RUkW1NGFH0d4HcnyJIlw4UW17HiyPMHt4B18EX2go9qJTz_eJzgBgBg4CphigUCMGCWFAcAw AQAAAA AQAAE5ISLVOkTEF-QfURpkGZHHeeIpehB3HMoRKaikbTKHvQ

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

AQAAE9GSKVOkLEOy5PlQE0d9fId7HD-aHD_xhMeRrKORLseX44etHD8AYcAgSrEjDKFAsIGIFAJZ

AQAAE1M9RUkW1NGFH0d4HcnyJIlw4UW17HiyPMHt4B18EX2go9qJTz_eJzgBgBg4CphigUCMGCWFAcAw

AQAAAA
AQAAE5ISLVOkTEF-QfURpkGZHHeeIpehB3HMoRKaikbTKHvQNnlwpIdOxNHHY_IPJttlAECEI8BBAAgFAiigAA
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]
现在我录制一个声音并按指纹,它可能是这样的:

AQAAE9GSKVOkLEOy5PlQE0d9fId7HD-aHD_xhMeRrKORLseX44etHD8AYcAgSrEjDKFAsIGIFAJZ

AQAAE1M9RUkW1NGFH0d4HcnyJIlw4UW17HiyPMHt4B18EX2go9qJTz_eJzgBgBg4CphigUCMGCWFAcAw

AQAAAA
AQAAE5ISLVOkTEF-QfURpkGZHHeeIpehB3HMoRKaikbTKHvQNnlwpIdOxNHHY_IPJttlAECEI8BBAAgFAiigAA
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]
现在,我正在查看数据库,使用levenshtein距离查找最接近的匹配项,如下所示:

AQAAE9GSKVOkLEOy5PlQE0d9fId7HD-aHD_xhMeRrKORLseX44etHD8AYcAgSrEjDKFAsIGIFAJZ

AQAAE1M9RUkW1NGFH0d4HcnyJIlw4UW17HiyPMHt4B18EX2go9qJTz_eJzgBgBg4CphigUCMGCWFAcAw

AQAAAA
AQAAE5ISLVOkTEF-QfURpkGZHHeeIpehB3HMoRKaikbTKHvQNnlwpIdOxNHHY_IPJttlAECEI8BBAAgFAiigAA
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与鸟叫声相匹配。指纹方法无法满足您的需要

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


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

指纹法不能满足您的需要

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


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

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


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

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


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

使用-raw选项运行fpcalc,以获得需要比较的32位整数

./fpcalc -raw audio.wav
为了便于比较,请将每个指纹转换为20位:

Python示例

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

并计算差异。

使用-raw选项运行fpcalc,以获得需要比较的32位整数

./fpcalc -raw audio.wav
为了便于比较,请将每个指纹转换为20位:

Python示例

fps_20 = [x >> 12 for x in fps]
并计算差异