4

我正在寻找如何比较音乐的理论、算法和类似的东西。更具体地说,我正在研究如何对具有不同比特率或可能略有不同变化(收音机版本与专辑版本)但听起来相同的音乐曲目进行重复检查。

这方面的用例包括 Grooveshark、Youtube 等服务,它们会在其中获得大量重复曲目。我也对文本比较感兴趣(Britney Spers vs Britney Spears,他们偏离了多远等),尽管这是次要的,我已经有一些资料可以在这方面进行。

我最感兴趣的是与编解码器无关的比较技术和算法(假设是“原始”流),但对编解码器特定的资源表示赞赏。

我知道诸如 musicbrainz.org 之类的项目,但尚未对其进行进一步调查,如果此类项目对这项工作有所帮助,我会很感兴趣。

4

2 回答 2

3

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

我个人在我为一个应用程序开发的工具中使用了它,该应用程序具有相当大的数据库,其中包含大量重复项。将它与与我的领域相关的一些其他数据比较结合使用,我能够将我的工具指向应用程序数据库并快速找到许多重复的记录。不会撒谎,我认为看到实际操作非常酷。

它甚至可以快速实现,这是一个C# 版本

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];
}
于 2010-05-12T14:27:00.410 回答
1

我在这里写了一个类似的答案:音乐识别和信号处理

在研究界,寻找两个信号之间相似性的问题(直到环境失真,如噪声、节奏、音高或比特率的轻微变化)被称为音频(或音乐)指纹识别。这个话题已经被深入研究了至少十年。Haitsma 和 Kalker 的这篇早期(并且经常被引用)的论文清楚地描述了这个问题并提出了一个简单的解决方案。

在同一首歌曲的两个版本之间寻找音乐相似性的问题被称为翻唱歌曲识别。这个问题也被大量研究,但仍然被认为是开放的。

基于内容的音乐搜索最流行的两种商业解决方案可能是MidomiShazam

我相信这可以解决您的问题。查看 Google Scholar 以了解这些问题的最新解决方案。ISMIR程序可在线免费获得

于 2010-05-18T17:35:14.833 回答