代码之家  ›  专栏  ›  技术社区  ›  Christian P.

音乐数据比较[关闭]

  •  4
  • Christian P.  · 技术社区  · 14 年前

    我正在寻找理论,算法和类似的,如何比较音乐。更具体地说,我正在研究如何对具有不同比特率或稍有不同变种(收音机与专辑版本)的音乐曲目进行重复检查,但在其他方面声音是相同的。

    这方面的用例包括grooveshark、youtube等服务,在这些服务中 许多 重复的曲目。我也对文本比较感兴趣(布兰妮·斯珀斯和布兰妮·斯皮尔斯,他们偏离了多远,等等),尽管这是次要的,我已经有了一些资料可以在这方面继续。

    我最感兴趣的是编解码器不可知比较技术和算法(假设一个“原始”流),但编解码器特定的资源是值得赞赏的。

    我知道musicbrainz.org这样的项目,但还没有深入研究过,如果这些项目能在这方面有所帮助,我会感兴趣的。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community George Stocker    7 年前

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

    在研究界,发现两个信号之间的相似性的问题被称为 audio (or music) fingerprinting . 这个话题已经研究了至少十年。这是早期的(并且经常被引用) paper by Haitsma and Kalker 清楚地描述问题并提出一个简单的解决方案。

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

    也许基于内容的音乐搜索最流行的两种商业解决方案是 Midomi Shazam .

    我相信这能解决你的问题。查看谷歌学者,了解这些问题的最新解决方案。这个 ISMIR 在线免费提供诉讼程序。

        2
  •  3
  •   Nathan Taylor    14 年前

    就比较姓名而言,你可能想看看 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];
    }