
TL;DR:在老款小米 AI 音箱(MDZ-25-DA / S12A)上跑一个 shell 客户端。开灯、天气这类请求仍由小爱原生处理;小爱答不上来、或者你点名"问问 DeepSeek"时,音箱直接调大模型 API,用 EdgeTTS 逐句播报,播完绿灯亮起,可以免唤醒继续追问。不需要中转服务器,也不用电脑常驻。MIT 开源:github.com/open-speake...
一、背景与痛点
我家有一台 2019 年买的小米 AI 音箱。控制家电它很好用:开灯、定闹钟、问天气,反应快,也很稳定。但只要问点开放性问题,比如"介绍一下西湖""最近三天有什么 AI 新闻",它多半回一句"这个我还不会"。
想给它接大模型,需求其实很明确:
- 原有能力一个都不能丢:家电控制是刚需,不能因为接了大模型就变慢、变不稳定。
- 不要再养一台常驻设备:不想为了一个音箱让 NAS 或电脑 7×24 小时开着。
- 对话要自然:答完能接着问,不用每句都喊"小爱同学"。
二、方案对比
社区里已经有两个先行项目,本项目也参考了它们,在这里致谢。两者的仓库目前都已归档。
| 路线 | 代表项目 | 做法 | 代价 |
|---|---|---|---|
| 账号轮询 | mi-gpt(仍在维护的同类:xiaogpt) | 电脑或 NAS 上的程序通过小米账号接口轮询对话记录,再让音箱播报 | 要有常驻主机;不用拆机,支持型号多 |
| 整栈接管 | open-xiaoai | 刷机后接管音频链路(支持 LX06 / OH2P) | 改动大,原生体验要自己补回来 |
| 原生优先(本项目) | xiaomi_ai_llm | 唤醒、识别、家电控制都沿用小爱;音箱上的客户端只把"小爱处理不了的"转给大模型 | 要拆机接串口;目前只实测 MDZ-25-DA |
一句话概括:本项目不替换小爱,只补它答不上来的那部分 。本项目 /data/init.sh 的自启动思路就来自 open-xiaoai。
三、架构
小爱同学,...... → 音箱客户端判断 ├─ 开灯/天气/音量 → 小爱原生执行 └─ 答不上来/点名 DeepSeek → 直连大模型(可联网搜索) → EdgeTTS 逐句播报 → 绿灯免唤醒追问
各环节分别在哪里运行:
| 环节 | 运行位置 |
|---|---|
| 唤醒、收音、路由客户端、音频播放 | 音箱本机 |
| 语音识别、家电控制、小爱原生回答 | 小米云(和原来一样) |
| 大模型(DeepSeek / GLM / Kimi / MiniMax / 任意 OpenAI 兼容接口) | 你自己配置的云 API,由音箱直接调用 |
| 语音合成 EdgeTTS | 微软在线 TTS,由音箱直接调用;失败时退回小爱原生 TTS |
四、关键实现点
1. BusyBox shell 客户端,走 SSE 流式请求
音箱系统资源有限,只有 BusyBox 那一套工具。主客户端 device/native_first_client.sh 就是一个 shell 脚本,用流式(SSE)方式请求 OpenAI 兼容接口,一边接收 token 一边处理,不用等整段回答生成完。这样就不需要中转服务器,音箱自己就能请求 API。切换模型只要改 /data/native_first.env 里的配置,原来用 mi-gpt 时的 API Key 也能直接填进去。
2. 路由:native-first
客户端先让小爱处理。原生能搞定的(开灯、天气、音量)就不碰;小爱答不上来,或者用户明确说"问问 DeepSeek",才转给大模型。家电控制的体验和原来完全一样,大模型只是兜底。
3. 按句 EdgeTTS 播报
流式回答按句子切分,每凑满一句就送去 EdgeTTS 合成并播放,不用等全文生成完再开口。EdgeTTS 免费;它调用失败时,会退回小爱原生 TTS。
4. 绿灯免唤醒追问
回答播完后,音箱进入一个续听窗口,用绿灯提示。这时直接说"那什么时候去呢?",会沿用同一个上下文继续聊;喊"小爱同学"就回到原生路由;说"保持安静"或者不说话,就结束这轮对话。新版客户端还有一个可选的结束语,默认关闭,开启后说"结束对话"就能退出。
5. DeepSeek 联网搜索
直连 DeepSeek(LLM_PIPELINE=native、BACKEND=deepseek)时,LLM_WEB_SEARCH 默认是 auto:先判断问题是否需要实时信息(新闻、价格、营业状态、指定网页等),需要的话调用 DeepSeek 官方 Search/Fetch 接口,回答时说明来源。每轮会多一次判断请求,所以第一句话可能稍慢;设成 off 可以关掉。
实测效果:让它"搜一下最近三天的 AI 新闻,说明日期和来源",新闻播到一半再喊"小爱同学,开灯",灯亮了,新闻还在继续播。B 站有完整录像。
五、边界与风险(请先读)
- 不是离线方案:小米识别、大模型、EdgeTTS 都是云服务,模型不在音箱上跑。断网后只剩小爱的原生能力。
- 需要拆机接串口:主板上有现成的 JST 串口插座,不用焊接。工具是十字螺丝刀、USB-TTL 模块(比如 CH340)和 SH1.0 转 2.54mm 杜邦 3P 线。过程中可能要改写系统分区,操作失误可能导致变砖。README 标的难度是 ★★★★☆。
- 只实测过 MDZ-25-DA(S12A,Amlogic A113X):其他型号外观相似,不代表固件和接口相同,目前也不支持 LX06 / OH2P。
- 当前限制:大模型播报时还不能用语音打断;全天稳定性仍在验证中。
- MIT 开源,非小米官方项目:只能用在自己拥有的设备上,拆机可能影响保修。
六、怎么上手
- 阅读 设备与准备,确认型号,并确认能备份和恢复。
- 按 从零接入 拆机、接串口,建立 SSH。
- 按 跑通第一轮对话 部署客户端,在
/data/native_first.env里填好 API Key。 - 想加连续追问,再看 逐步完善对话。
费用方面,大模型 API 按各平台计费,EdgeTTS 免费。如果要从源码构建端侧 TTS,还需要 Rust、Zig 和 cargo-zigbuild。
七、链接
- GitHub:github.com/open-speake...
- B 站实机演示(边播新闻边开灯):www.bilibili.com/video/BV1bu...
- B 站原理篇:www.bilibili.com/video/BV1Vz...
- YouTube Demo:www.youtube.com/watch?v=1R8...
八、想听听大家的意见
- 哪些问题应该留给小爱,哪些应该交给大模型?路由规则我还在调。
- 有没有人在类似的嵌入式设备上接过本地 OpenAI 兼容接口(比如 Ollama)?这条路我还没验证。
- 手上有其他型号小爱音箱的朋友,欢迎开 issue 一起看看能不能适配。
觉得有意思的话,欢迎去 GitHub 点个 star。
(本人是项目作者。)