-1

Java プログラミング言語でシステムを作成して、2 つのオーディオ ファイルを比較し、比較のパーセンテージを取得したいと考えています。ファイルは、バイト配列としてフィンガープリントに変換されています。

2 つのバイト配列を比較し、類似度をパーセンテージで取得するための解決策を教えてくれる人はいますか?

4

3 に答える 3

3
/** 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());
于 2012-08-24T08:55:40.040 に答える
2

musicg API を使用します。フィンガープリントではなくオブジェクトを使用する必要がありWaveますが、フィンガープリントを生成できれば、Waveオブジェクトを簡単に取得できます。

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

resultフロートとの類似性です。パーセンテージを得るには100を掛けます

于 2012-08-24T08:53:59.290 に答える
0

あはは!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);
        }
于 2012-12-17T22:24:41.707 に答える