音乐数据的比较

时间:2010-05-12 14:11:29

标签: comparison string-comparison

我正在寻找如何比较音乐的理论,算法和类似方法。更具体地说,我正在研究如何检测具有不同比特率或可能略有不同变化的音乐曲目(无线电与专辑版本),但听起来不一样。

此案例包括Grooveshark,Youtube等服务,其中包含重复曲目的批次。我也对文本比较感兴趣(Britney Spers vs Britney Spears,他们偏离了多远等等)虽然这是次要的,但我已经在这个领域有了一些资源。

我最感兴趣的是编解码器无关的比较技术和算法(假设是“原始”流),但是特定于编解码器的资源很受欢迎。

我知道诸如musicbrainz.org之类的项目,但没有进一步调查过,如果这些项目对这项工作有所帮助,我们会感兴趣。

2 个答案:

答案 0 :(得分:3)

就比较名称而言,您可能需要查看Levenshtein distance算法。给定两个字符串,它将计算距离测量值,可用作捕获重复项的基础。

我个人在我为一个应用程序开发的工具中使用它,该工具具有相当大的数据库,其中包含大量重复数据库。将它与我的域相关的一些其他数据比较结合使用,我能够将我的工具指向应用程序数据库并快速找到许多重复的记录。不要说谎,我觉得看起来很酷很酷。

实施起来很快,这是一个C# version

public int CalculateDistance(string s, string t) {
    int n = s.Length; //length of s
    int m = t.Length; //length of t
    int[,] d = new int[n + 1, m + 1]; // matrix
    int cost; // cost

    // Step 1
    if (n == 0) return m;
    if (m == 0) return n;

    // Step 2
    for (int i = 0; i <= n; d[i, 0] = i++) ;
    for (int j = 0; j <= m; d[0, j] = j++) ;
    // Step 3
    for (int i = 1; i <= n; i++) {
        //Step 4
        for (int j = 1; j <= m; j++) {
            // Step 5
            cost = (t.Substring(j - 1, 1) == s.Substring(i - 1, 1) ? 0 : 1);

            // Step 6
            d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost);
        }
    }

    // Step 7
    return d[n, m];
}

答案 1 :(得分:1)

我在这里写了一个类似的答案:Music Recognition and Signal Processing

在研究界,找到两个信号之间相似性的问题(直到环境失真,如噪音,速度,音调或比特率的轻微变化)被称为 audio (or music) fingerprinting 。这个主题至少已经研究了十年。这个早期(经常被引用)paper by Haitsma and Kalker清楚地描述了这个问题并提出了一个简单的解决方案。

在同一首歌的两个版本之间找到音乐相似性的问题称为 cover song identification 。这个问题也被大量研究,但仍然被认为是开放的。

基于内容的音乐搜索的两个最受欢迎的商业解决方案可能是MidomiShazam

我相信这可以解决你的问题。查看Google学术搜索,了解这些问题的最新解决方案。 ISMIR程序可在线免费获取。