2013-07-23 93 views
1

我使用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或紅寶石..

我試圖匹配一個哨子到一個鳥叫。

回答

0

指紋的方法不適合您的需求!

我看到梅爾頻率倒譜系數(MFFCs)來解決此類問題...

還有其他的方法,如何提取一組描述符(平均不規則,質心均值,標準差不規則,MFCC )並使用一種分類方法(Random Forest,MLP)!

1

首先,你不應該直接比較代碼字符串。我不知道pfcalc是基於哪種算法,但很可能它會在音頻輸入的每個幀上測量一些音頻特徵(如上面提到的能量,mfcc ...)。這些功能可能是整數值,然後轉換爲字符串(或base64字符串)。因此,比較這些字符串的值沒有任何意義(除非您嘗試識別相同的音頻內容)。

我不確定我是否理解你正在嘗試做什麼「我試圖將一隻哨子匹配到一隻鳥叫」,但我認爲你不會使用音頻指紋來解決這個問題,因爲它旨在識別「幾乎相似」的音頻內容。

1

使用-raw選項運行fpcalc,爲您提供需要比較的32位整數。

./fpcalc -raw audio.wav 

對於一個非常便於比較,每個指紋轉換爲20位:

Python示例

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

和計數的差值。