懂你品味的私人AI音乐电台
Dusk Radio 是一款基于 FastAPI + 原生前端的本地 AI 情绪电台。用户通过自然语言对话告诉 DJ 当下的心情或想听的音乐类型,AI 自动从本地曲库中选曲播放,打造沉浸式的私人电台体验。
TRAE AI 创造力大赛参赛作品。
- AI 对话选曲 — 自然语言交互,AI DJ 根据心情、场景、偏好智能推荐
- 多模型切换 — 支持 DeepSeek / MIMO Token Plan / MIMO Normal 三种 LLM Provider
- 三层意图路由 — 快速指令(正则匹配)→ 元数据过滤(风格/情绪关键词)→ LLM 推理
- 本地音乐管理 — 自动扫描本地 MP3 文件,提取 ID3 元数据与封面
- 播放队列 — QQ 音乐风格播放列表,支持列表循环 / 单曲循环 / 随机播放 / 顺序播放
- WebSocket 实时控制 — 播放、暂停、切歌、进度拖拽实时同步
- 智能音箱空闲界面 — 时间问候、日期显示、模拟天气,Pixelify Sans 点阵时钟
- Three.js 流体背景 — GLSL Simplex 噪声 + FBM 分形噪声,6 光源动态渐变
- 毛玻璃卡片 —
backdrop-filter模糊底层流体动画,空闲态高度透明显现 - 音频律动可视化 — Web Audio API + Canvas 2D,封面两侧示波器波形
- 聊天历史持久化 — SQLite 存储对话记录,刷新页面不丢失
| 层级 | 技术 |
|---|---|
| 后端框架 | Python 3.13 + FastAPI |
| 数据库 | SQLite(WAL 模式) |
| LLM 客户端 | OpenAI SDK(兼容 DeepSeek / MIMO) |
| 前端 | 原生 HTML / CSS / JS |
| 3D 背景 | Three.js + GLSL 着色器 |
| 音频分析 | Web Audio API(AnalyserNode) |
| 实时通信 | WebSocket |
| CDN 依赖 | Tailwind CSS、Google Fonts、Font Awesome 6.5.1 |
cd backend
python -m venv venv
.\venv\Scripts\activate # Windows PowerShell
pip install -r requirements.txt复制模板并填入你的 API Key:
cd backend
cp .env.example .env编辑 .env,填入至少一个 Provider 的 Key:
DEEPSEEK_API_KEY=sk-xxxxxxxx
MIMO_TOKEN_API_KEY=tp-xxxxxxxx
MIMO_NORMAL_API_KEY=sk-xxxxxxxx
cd backend
python -m uvicorn app.main:app --port 8000打开浏览器访问 http://localhost:8000
Dusk-Radio/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI 入口:REST + WebSocket + 静态文件
│ │ ├── config.py # 配置管理
│ │ ├── database.py # SQLite 初始化
│ │ ├── router.py # 三层意图路由
│ │ ├── llm_client.py # LLM 客户端(超时/重试/JSON解析)
│ │ ├── prompt_engine.py # DJ 系统提示词
│ │ ├── context_builder.py # 上下文组装 + 会话历史
│ │ ├── music_scanner.py # 音乐扫描入库
│ │ ├── utils.py # MP3 元数据提取
│ │ └── exceptions.py # 统一错误处理
│ ├── data/
│ │ ├── config.json # LLM Provider 配置
│ │ └── user/ # 用户品味档案
│ ├── music/ # 本地音乐文件夹(放 MP3)
│ ├── requirements.txt
│ └── .env.example # API Key 模板
│
├── frontend/
│ ├── index.html # 主页面
│ ├── settings.html # 设置页面
│ ├── css/style.css # 深色日落风样式
│ ├── js/
│ │ ├── api.js # REST API 封装
│ │ ├── ws.js # WebSocket 连接管理
│ │ ├── player.js # 播放器控制
│ │ ├── chat.js # 对话渲染
│ │ ├── queue.js # 队列管理
│ │ ├── app.js # 入口:模块初始化 + 状态恢复
│ │ ├── fluid-background.js # Three.js 流体背景
│ │ └── audio-visualizer.js # 音频律动可视化
│ └── assets/
│ └── default-cover.jpg # 默认封面
│
├── CLAUDE.md # 项目开发规范
├── LICENSE # MIT License
└── README.md
非敏感配置,控制 LLM Provider 切换和服务器参数:
{
"llm": {
"provider": "deepseek",
"providers": {
"deepseek": { "base_url": "...", "model": "deepseek-chat" },
"mimo_token": { "base_url": "...", "model": "mimo-v2.5-pro" },
"mimo_normal": { "base_url": "...", "model": "mimo-v2.5-pro" }
}
},
"music_path": "music",
"server": { "host": "0.0.0.0", "port": 8000 }
}敏感配置,存储 API Key,不提交 Git。支持的环境变量:
DEEPSEEK_API_KEYMIMO_TOKEN_API_KEYMIMO_NORMAL_API_KEY