-1

我们想用 Java 编程语言创建一个系统来比较两个音频文件并获得比较的百分比。这些文件正在被转换为字节数组的指纹。

谁能帮我提供一个解决方案来比较两个字节数组并以百分比形式获得相似度?

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;
}

这实际上只是比较字节本身(如标题中所述)。您还可以在两个向量之间做某种距离(特征空间中的距离)。或者你可以做你可以在谷歌学者上找到的一百万件其他事情中的一件......

编辑:您告诉我们您使用的是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

使用音乐 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

啊哈!我找到了通过指纹比较两个波形文件的功能。完成这项工作的 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 回答