Java プログラミング言語でシステムを作成して、2 つのオーディオ ファイルを比較し、比較のパーセンテージを取得したいと考えています。ファイルは、バイト配列としてフィンガープリントに変換されています。
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;
}
これは、実際にはバイト自体を比較するだけです(タイトルで尋ねられたように)。2 つのベクトル間のある種の距離 (特徴空間での距離) を行うこともできます。または、 Google Scholarで見つけることができる他の何百万ものことのいずれかを行うことができます...
編集: musicg-apiを使用しているとのことでしたので、次のように異なる Wave を比較できます。
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());
musicg API を使用します。フィンガープリントではなくオブジェクトを使用する必要がありWave
ますが、フィンガープリントを生成できれば、Wave
オブジェクトを簡単に取得できます。
Wave waveA = ...
Wave waveB = ...
FingerprintSimilarity similarity;
similarity = waveA.getFingerprintSimilarity(waveB);
float result = similarity.getSimilarity();
result
フロートとの類似性です。パーセンテージを得るには100を掛けます
あはは!2 つの wave ファイルをフィンガープリントで比較する機能を見つけました。仕事をする 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);
}