有没有什么算法可以让我自动创建一个彼此很好的歌曲播放列表——类似于 iTunes Genius 之类的服务——一个开发人员可以实际实现?它应该要么 a) 不需要任何类型的远程收听习惯数据库等,要么 b) 需要这样的数据库,但可以使用免费提供的数据库。
3 回答
我不知道 iTunes Genius,但我认为last.fm数据库和 API 可能对你有用。每次您看到任何曲目时,它都会根据其他用户的偏好显示类似曲目的列表。track.getSimilar
使用API 方法可以获得相同的信息。
我这样做了,我使用了 tomasz 描述的 last.fm 数据库。我没有直接使用“相关艺术家”,而是通过比较与不同艺术家相关的标签来构建我自己的关系图(这不是 lcfseth btw 建议的方法 - 我有相当多的音乐,我想探索“自然的”连接可能不是“正常”播放列表中的共同伙伴;我也不确定相关艺术家的统一程度)。
我还使用本地数据库缓存来自 last.fm 的数据,因为对 api 的调用受到速率限制,并且我尝试使用 api 的其他部分来改进/规范我从 mp3 标签中读取的信息。
生成相关艺术家的有用图表实际上非常困难;很大程度上是因为图中的某些节点自然而然地往往比其他节点更重要。如果您不“平衡”图表,那么您的播放列表将继续返回“重要”艺术家。
最终的结果确实很好,因为音乐的选择在“中心主题”和变奏之间取得了很好的平衡。但是实现一点都没有打磨,图的计算可能需要很长时间(好几个小时),程序在运行时会占用相当多的内存,而且玩 elvis costello 似乎仍然比预期的要多一点; o)
如果您有兴趣,代码位于http://code.google.com/p/uykfe/
从我作为用户的角度来看,最好的部分是它可以“实时”更新罗技媒体服务器(squeezeserver)播放列表,每当列表为空时添加新曲目。从您“手动”选择的任何音乐中继续播放都非常有效。当然,它还可以生成一次性播放列表,最后,通过调整参数,您可以在您的音乐收藏中获得一种“随机漫步”——它会播放相关的曲调,但会慢慢从一种风格转移到另一种风格(事实上,这实际上是“默认”模式——为了让它停留在一个主题上,我需要额外的逻辑来让它偏向于它之前播放的任何音乐)。
ps 另外,将最终图表转储到 gephi 真的很酷——我把它打印出来了,现在它已经固定在墙上了……
pps 我还尝试了 musicbrainz 数据库,从理论上讲,这听起来像是一个很棒的资源。但在实践中,它过于复杂且记录不充分。
大多数这些数据库背后的想法是查看其他用户在收听给定歌曲后收听的内容。这些统计数据的准确性取决于用户数量,因此在本地可能很难使用。算法本身并不难实现。另一种方法是根据流派、歌手...对歌曲进行排序,这些信息通常嵌入在歌曲中,但并非总是如此。Winamp有这个功能,但是对老歌不起作用,除非你手动设置信息或使用在线歌曲数据库。