乐于分享
好东西不私藏

我让AI读了我1752首收藏,然后用Claude Code造了一个真正懂我的音乐主播

我让AI读了我1752首收藏,然后用Claude Code造了一个真正懂我的音乐主播

自我介绍

大家好,我是Aaron。过去一直从事算法领域相关工作,自工作以来,一直持续在关注算法相关技术的发展,当前除了在工作中会进行一些AI的落地实践,工作之余也在通过AI辅助编程做一些有趣的探索。上周末受网友启发,做了RadioMind

后续会持续更新AI实践过程中的心得体会,以及AI知识分享。欢迎大家关注我关注公众号,以便第一时间收到更新推送。

  • • 微博: https://weibo.com/u/1801679460
  • • Github: https://github.com/aaronshan

用 AI 做一个真正懂你的私人音乐主播 —— RadioMind 开发全记录

如果有一个 AI,它记得你上周在加班时喜欢听什么,知道你下雨天的歌单偏好,还能在你说"今天有点累"的瞬间,推来一首刚刚好的歌——你会用吗?

这就是我做 RadioMind 的起点。

特别说明:本项目 100% 由 Claude Code 完成编码,从架构设计到每一行实现代码,全程通过对话驱动生成。我没有手动写过任何一行业务代码——这本身也是这次实验的一部分。

为什么不用现有的音乐 App?

Spotify 有算法推荐,网易云有每日推荐,这些产品做得很好。但它们有一个共同的局限:它们不能和你对话

你没办法告诉 Spotify "我今天不想听太 happy 的歌,但也不要太压抑",然后得到一个真正理解这句话的回复。你也没办法让它记住你三个月前说过"雨天不要播英文歌"这件事。

AI 大模型的出现让这件事变得可行了。但怎么做,架构怎么设计,AI 的记忆怎么管理——这是 RadioMind 想认真回答的问题。

整体思路:一个有记忆的 AI DJ

RadioMind 的核心设想是:AI 不只是推荐引擎,而是一个真正了解你的 DJ

要做到这一点,需要解决三个关键问题:

1. AI 怎么知道你喜欢什么?

不靠用户填表,靠两个来源:一是直接读取你本地的网易云/QQ音乐客户端数据库(macOS),拿到你真实收藏的 1000+ 首歌;二是通过每次对话自动提炼你说过的偏好,写入长期记忆文件。

2. AI 的记忆怎么跨会话保留?

大模型本身没有持久记忆,每次对话都是全新的。RadioMind 参考了 OpenClaw 的记忆系统设计,实现了三层记忆架构:

L1 常青记忆  →  MEMORY.md(每次对话全文注入)               包含:品味分析、艺术家偏好、对话中提炼的个人信息L2 近期记忆  →  memory/YYYY-MM-DD.md(每日自动生成)               每次对话结束后,AI 自动将对话提炼为要点日志L3 历史检索  →  memory.db(SQLite FTS5 全文索引)               90天历史,按需语义检索,不占用上下文窗口

这三层的核心逻辑是:热记忆完整加载,冷记忆按需检索。常用的、重要的信息始终在 AI 视野里;偶尔提到的细节,在用户问起时再去找。

3. 品味信息怎么自动更新?

两条更新路径并行:

  • • 定期路径:每天凌晨自动同步本地歌单,重新分析艺术家分布、语言偏好、风格标签,写入 MEMORY.md 的品味区块
  • • 对话路径:每次对话结束后,AI 提炼用户明确表达的新偏好(如"工作时不想听有歌词的歌"),带日期戳追加到 MEMORY.md

系统架构

整个项目分四层:


两个界面,两种体验

Web 版:像素风格的音乐电台界面,大时钟、波形可视化、AI 对话区一体化。支持 PWA 安装,可以当桌面 App 用。

已关注
关注
重播 分享

TUI 版:给喜欢在终端里工作的人。三列布局——播放区、队列、时钟,呼吸灯边框,竖向粒子波形,mpv 本地解码。所有操作都用键盘完成,完全不需要鼠标。

已关注
关注
重播 分享

两个界面共享同一个后端,WebSocket 实时同步播放状态。在 Web 里选的歌,TUI 里实时显示;在 TUI 里聊天,记忆也同样被记录。

AI 调用:不强制依赖 API Key

对于有 Claude Code Max 订阅的用户,可以直接用 claude -p 子进程调用,不需要单独的 API Key。没有订阅的用户配置 CLAUDE_API_KEY 即可。系统会自动检测并选择最优路径,降级处理确保基本可用。

一个有意思的设计细节:品味文件的演进

最初,我把品味信息存在 taste.md,把记忆存在 MEMORY.md——两个文件各司其职,听起来很合理。

但用一段时间后发现问题:AI 每次对话要加载两个文件,内容有重叠,维护分散。更重要的是,品味数据本质上就是"AI 应该了解你的事情",和记忆文件的定位完全一致。

所以后来把 taste.md 废弃了,把歌单分析的结果(艺术家 TOP20、语言分布、风格标签)直接写入 MEMORY.md 的一个固定区块,每天自动覆盖更新。对话中提炼的偏好则追加到另一个区块,带日期标记。

一个文件,两条更新路径,AI 始终读到最新最完整的你。

技术栈选择

整个项目用 Node.js 写成,没有引入复杂的框架:

  • • 后端:Express + WebSocket,够用就好
  • • AI 记忆:SQLite FTS5,零运维,本地文件即可
  • • TUI:blessed,老牌终端 UI 库,坑不少但足够强大
  • • 播放:Web 端用 HTML5 Audio,终端用 mpv(需单独安装)
  • • 歌单同步:直接读本地客户端 SQLite,比 API 更稳定

没有用向量数据库,FTS5 的全文检索对中文支持有限但足够用。如果后续记忆量很大,可以考虑升级到 SQLite-vec 做语义检索,架构上已经预留了扩展空间。

Claude Code 全程编码:一次真实的 AI 协作实验

这个项目还有另一层意义:从第一行代码到最后一个功能,100% 由 Claude Code 完成编码,我没有手动写过任何一行业务代码。

整个过程是这样的:我描述需求和思路,Claude Code 生成实现;我指出问题或调整方向,Claude Code 修改重构。从 Express 服务搭建、WebSocket 实时流、记忆系统设计,到 TUI 的呼吸灯动画、像素时钟字体、波形可视化——全部通过对话完成。

这次实验让我对"AI 辅助编程"有了更具体的认识:

  • • 擅长的部分:有明确规格的功能实现、重复性工作(批量替换、格式转换)、调试已知类型的错误,效率是人工的数倍
  • • 需要人介入的部分:产品方向判断(这个功能要不要做)、审美决策(界面风格、交互逻辑)、以及当 AI 陷入局部最优反复改错的时候,需要人跳出来重新定义问题

Claude Code 不是"帮你写代码的工具",更准确的描述是一个随时待命的全栈工程师——你负责想清楚要做什么,它负责把它做出来。

开源地址

代码已开源,地址详见:https://github.com/aaronshan/RadioMind

如果你也有自己的网易云/QQ音乐歌单,想试试让 AI 真正"认识"你的音乐品味,欢迎 clone 下来玩。

相关学习资料