如何利用 YouTube 观看行为构建一个能自我进化的个性化音乐库
很多人的 YouTube 历史记录其实是一座被浪费的金矿。大多数人习惯于依赖平台的推荐算法,但算法的逻辑是“让你停留”,而不是“真正理解你的听感”。我最近在尝试将 YouTube 的观看习惯转化为一个能够自我学习的“音乐大脑”,这本质上是一次从前端数据采集到后端特征工程的完整实操,我想把这套技术链路分享给大家。
要实现这个系统,最核心的痛点在于:平台提供的“观看记录”太粗糙了。如果你完整看完了一个 5 分钟的视频,算法认为你喜欢它;但实际上,你可能在 0-40 秒时就想关掉,只是在 2 分钟后的副歌部分反复回溯了三次。这种“跳过”与“回溯”的行为,才是定义音乐偏好的最高权重信号。
第一步是构建数据采集层。我没有选择调用复杂的 API,而是写了一个简单的浏览器插件(Content Script),直接在 YouTube 播放页面的 video 标签上挂载监听器。关键在于捕捉 timeupdate、pause 和 seeked 这三个原生事件。通过记录用户在视频中的具体停留片段,我可以精确到秒级地分析出用户对歌曲中哪个时间段最感兴趣。比如一个 210 秒的视频,如果用户在 [0, 41] 秒快速跳过,但在 [132, 222] 秒反复循环,这个行为权重将远高于单纯的“播放完成”。
在数据传输层面,我使用了 FastAPI 搭建了一个轻量级后端,用来接收插件传回的 JSON 数据包。一个典型的请求包结构如下:
{
"video_id": "abc123xyz",
"title": "Lofi Hip Hop Mix 2024",
"watch_segments": [[0, 41], [132, 222]],
"timestamp": "2023-10-27T21:47:00Z",
"session_id": "sess_001"
}
这里有一个存储上的关键细节:数据库我选择了 PostgreSQL 并安装了 pgvector 扩展。之所以不直接用 NoSQL,是因为在后续调整模型权重时,我需要对原始事件进行大规模的重新计算,关系型数据库在处理这种结构化信号时更稳定。
最硬核的部分在于离线处理的 Pipeline。我设置了每天定时运行一次的脚本,执行以下四个步骤:首先是分类过滤,通过关键词和时长剔除掉非音乐类的视频;其次是元数据解析,利用外部 API 将视频标题中的模糊信息补全为真实的歌曲名称和艺人;接着是行为打分,将观看百分比、重复播放次数以及时间戳(例如深夜 11 点听 Synthwave 的权重与下午 2 点不同)转化为隐式评分;最后是向量化,将音频特征转化为 Embedding 存入向量库。
这样做最大的好处是,我实现了一种基于“听感相似”的推荐,而不是简单的标签匹配。传统的推荐是“因为你听了爵士,所以推荐爵士”,而我的系统逻辑是“因为你喜欢这段音频的频率分布和节奏,所以推荐另一段具有相似 Embedding 的音频”。
这个项目的挑战不在于代码量,而在于如何定义“喜欢”。在实操过程中我发现,定义“喜欢”不能依赖单一维度。一个真正有效的评分模型应该是:最终权重 = (观看时长 / 总时长) * 重复播放次数 * 时间段修正系数。这种基于行为数据的实战探索,比直接调用一个大模型 API 要有趣得多,因为它让推荐系统真正地成为了一个随时间进化的“音乐大脑”。
得赶紧把过滤词库加上,不然 YouTube 推荐算法带进来的杂音简直没法听。