2012-08-24 48 views
-1

我們想要用Java編程語言創建一個系統來比較兩個音頻文件並獲得比較的百分比。文件正在被轉換爲指紋作爲字節數組。比較兩個字節數組並獲取Java中的百分比?

任何人都可以幫助我給出一個解決方案來比較兩個字節數組並獲得百分比的相似性嗎?

+2

*比較*按字節比較*百分比含義字節*是不等字節的比例?順便說一句,沒有必要去我們的大寫鎖定和多標點符號。 ;) – brimborium

+0

到目前爲止您嘗試了什麼?難度在於獲取音頻的PCM樣本,還是用於比較的算法? – helios

+1

在個別樣本級別進行比較將爲除了相同文件以外的任何事物生成一個固定的零。或者說,這個價值將會像是隨機的「短」對比。 –

回答

2

使用musicg API。您必須使用Wave對象,而不是它們的指紋,但是如果您可以生成指紋,則可以輕鬆獲取對象Wave

Wave waveA = ... 
Wave waveB = ... 
FingerprintSimilarity similarity; 
similarity = waveA.getFingerprintSimilarity(waveB); 
float result = getSimilarity(); 

result是作爲浮點數的相似度。乘以100得到一個百分比

+0

感謝您的快速回復。我們使用'musicg'[鏈接](https://sites.google.com/site/musicgapi/)作爲我們的指紋生成器。我們被卡住的部分是如何將生成的音頻文件的指紋與另一個生成的指紋進行比較。我們得到的指紋是字節數組。 –

+0

非常感謝。這真的幫助我們很多。 :) –

+1

@DinishaTennakoon您可以通過投票並接受最佳答案(最能幫助您的答案)來獎勵有幫助的答案。使用灰色向上箭頭和複選標記來執行此操作。 ;) – brimborium

2
/** Returns percentage (0.0-100.0) of not matching bytes. If arrays are not of equal length, nonexisting bytes in the smaller array will be treated as not matching. */ 
public double compareByteArrays(byte[] a, byte[] b) { 
    int n = Math.min(a.length, b.length), nLarge = Math.max(a.length, b.length); 
    int unequalCount = nLarge - n; 
    for (int i=0; i<n; i++) 
    if (a[i] != b[i]) unequalCount++; 
    return unequalCount * 100.0/nLarge; 
} 

這實際上只是比較字節本身(如標題中所述)。你也可以在你的兩個向量(特徵空間中的距離)之間做某種距離。或者你可以做一百萬的事情之一,你可以找到google scholar ...

編輯:您告訴我們您使用musicg-API,因此你可以比較不同的波是這樣的:

String track1 = "track1.wav", track2 = "track2.wav"; 
Wave wave1 = new Wave(track1), wave2 = new Wave(track2); 

FingerprintSimilarity similarity; 

// compare fingerprints: 
similarity = wave1.getFingerprintSimilarity(wave2); 
System.out.println("clip is found at " 
       + similarity.getsetMostSimilarTimePosition() + "s in " 
       + song1+" with similarity " + similarity.getSimilarity()); 
+0

感謝您的快速回復。我們使用'musicg'鏈接作爲我們的指紋生成器。我們被卡住的部分是如何將生成的音頻文件的指紋與另一個生成的指紋進行比較。我們得到的指紋是字節數組。 –

+0

@DinishaTennakoon我爲* musicg-api * – brimborium

+0

添加了代碼示例非常感謝。這真的幫助我們很多。 :) –

0

啊哈!我發現了用指紋比較兩個波形文件的功能。 ,沒有工作的musicg-API函數是= FingerprintSimilarityComputer

這裏是我的C#代碼,但你的JAVA想法太:

public static int MatchFingerPrint(Byte[] SuspectFingerPrint, Byte[] SampleFingerPrint) 
     { 

      FingerprintSimilarityComputer fpComputer = new FingerprintSimilarityComputer(SuspectFingerPrint, SampleFingerPrint); 
      FingerprintSimilarity fpmSimilarity = fpComputer.getFingerprintsSimilarity(); 
      return (int)(fpmSimilarity.getScore()*100.0f); 
     }