我使用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与一个鸟叫相匹配。
答案 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)!