我有两个目录,其中包含约 20 GB 的音乐文件(主要是 mp3,一些 ogg),我想检测所有重复的歌曲。有两个复杂的因素:
- 一首歌曲在两个目录中可能有不同的文件名。
- 包含同一首歌曲的两个文件可能具有不同的 ID3 标签,因此具有不同的校验和。
解决这个问题的好方法是什么?
我有两个目录,其中包含约 20 GB 的音乐文件(主要是 mp3,一些 ogg),我想检测所有重复的歌曲。有两个复杂的因素:
解决这个问题的好方法是什么?
我过去的做法是使用来自 Music IP 的 genpuid。闭源软件创建文件的音频指纹,无论格式、id3、校验和等如何。
更多信息可以在这里找到。
这应该确保最多的正重复匹配并最大限度地减少误报。它还可以正确标记不正确的 id3 标签。
这是我会做的(或以前做过的)......
……瞧!(或者如果您阅读 digg:“...利润!”)
/mp
ID3/OGG-equiv 艺术家和歌曲元标签是否准确?如果是,您可以使用它们。
编辑:如果他们不是,也许他们可以被制作成......如果你只处理整个专辑,有几个工具可以根据曲目的数量和长度获取所有标签数据。
如果您正在处理专辑和单个文件的混合,它会变得更加复杂。
如果您有一个可以解析文件的库,您可以对音频数据运行哈希。如果歌曲是不同的翻录或已重新压缩/转码/等,这对您没有帮助。
我确信那里有更优雅的解决方案 - 但如果音频数据是等效的,那么剥离 ID3 标签和散列应该可以解决问题。散列后,您可以根据需要将 ID3 标签放回去。
或许Last.fm API会很有用。它包括一个 track.getInfo 调用,该调用返回 XML,包括曲目的长度、艺术家姓名、曲目编号等。您可以比较曲目并查看它们是否有超过 N 个字段相等,如果是,则假设它们是相同的曲目。
不过,我不知道他们是否会同意你提交 40gb 音乐的 API 请求。
像这样的事情怎么样:找到一个库来获取 mp3 的长度以及指向音频数据的指针(看起来有几个库可以做到这一点),根据歌曲长度进行第一次通过过滤器,然后对于具有匹配长度的歌曲校验和它们的音频数据。与此脚本类似,用于查找重复文件/图像。
ffTES的一些改编对我非常相似的任务非常有用。
我遇到了同样的问题,所以我编写了一个命令行程序,试图通过比较声学指纹来检测相似的音频文件:https ://github.com/derat/soundalike
它使用Chromaprintfpcalc
的实用程序来生成指纹,然后在更严格地比较指纹之前构建一个查找表以查找可能的匹配项。
当我运行我的音乐库时,它运行得很好,但如果需要,有各种标志来调整它的行为。如果它对你有用(或者如果它不),请告诉我!