拒绝算法喂养:我用 SQLite 和 API 搭建了一套音乐挖掘系统
现在的流媒体推荐机制正陷入一种诡异的死循环:你偶然点开一首独立摇滚,接下来的三天,你的首页会被同质化的曲风塞满。这种所谓的“个性化推荐”本质上是在构建信息茧房,它通过计算播放量和相似度,不断把你往舒适区里推,结果就是 Discover Weekly 变成了热门单曲的复读机。为了打破这种被动接收的状态,我花了半年时间,尝试把“音乐发现”这个过程从黑盒算法中剥离出来,自己搭了一套基于数据驱动的探索工作流。
这套系统的核心逻辑是:用多个客观的第三方维度取代单一的算法权重,把“被动听”改为“主动挖”。
首先是源头的多维筛选。我不再信任任何平台的“猜你喜欢”,而是通过三个不同的接口并行拉取种子数据。第一路是 Last.fm,利用它的相似标签和关联艺人进行扩展,但我特意在脚本里扣掉了流行度过滤,因为那些低热度的“小虾米”艺人往往才是挖掘宝藏的关键。第二路是 RateYourMusic,我重点爬取社区标注的极细分风格(比如 Ambient Jungle),通过高评分但冷门的专辑反向搜索。第三路则是 Discogs,我直接盯着几个心仪的独立厂牌,抓取它们的发布履历。经验证明,追踪一个厂牌的签约艺人,比依赖算法推荐的精准度要高得多。
在数据处理环节,我没有使用复杂的云端方案,而是全部落本地 SQLite 数据库。我写了一套简单的 Python 脚本,将所有挖掘到的曲目标记为“已存档”状态,并用 Plexamp 作为前端播放器。
这里我想分享一个最关键的机制——「回溯清单」。很多人收藏歌曲后就将其遗忘,导致歌单越长,实际听到的越少。我设置了一个强制执行的循环:每隔两周,脚本会随机从三个月前收藏但未细听的曲目中抽取 10 条。我的原则是“听不进就立刻删除”,绝不给无效收藏留空间。在执行这个循环几个月后,我发现每周能挖掘到真正心头好的数量从 1-2 首稳定增加到了 6-8 首,而且风格跨度极大,能从黑金属直接跳到合成波,这种随机性带来的惊喜感是算法无法模拟的。
当然,在搭建过程中我也踩过坑。最典型的是 Discogs 的 API 限流问题,因为初期请求频率过高,账号被封过一次。后来我通过在请求之间加入延迟队列(Delay Queue)才解决了这个问题。其实这套架构并不复杂,数据库 + 脚本 + Plex 的组合在很多发烧友那里很常见,甚至如果你不想折腾 Plex,换成 Navidrome 或者任何支持本地库的播放器都行。
这套系统的本质其实是一种反直觉的操作:算法追求的是让你在平台上停留,而我们要追求的是让自己离开舒适区。当你把输入源从“推荐位”切换到“厂牌履历”和“细分标签”时,你才真正重新掌握了听觉的主动权。如果你觉得手动搭建太麻烦,起码尝试关掉那些“猜你喜欢”的开关,去寻找一个独立的输入源,这比躺在算法的摇篮里要高效得多。
被算法喂腻了,还是得自己去翻厂牌和博客,这才叫真正地在挖掘音乐。
SQLite 搞这套太硬核了,求推荐几个冷门厂牌,想跳出推荐算法的死循环。