给小爱触屏音箱接上 DeepSeek


家里有一台小爱触屏音箱(LX04),问稍微复杂一点的问题,它就说“这个我还不会”。想让它接上大模型,目标是日常好用,不是做成作品。

选方案

给小爱接大模型,常见的有两条路:

  • 刷机:用 Open-XiaoAI 这类项目直接接管音箱的麦克风和喇叭,体验最好。但它只支持小爱音箱 Pro 两款机型,项目也已经停更,LX04 用不了。
  • 不刷机:走小米云的接口。程序登录小米账号,读取音箱最新的对话记录,遇到要交给 AI 的问题,就发给大模型,再让音箱把回答念出来。xiaogpt 和 MiGPT 都是这个思路。

LX04 只能走第二条。程序选了 xiaogpt(Python 写的,占内存小,登录、风控这些坑别人已经踩过),模型用 DeepSeek(便宜,国内访问稳定),跑在自己的腾讯云服务器上。服务器、小米云和 DeepSeek 都在国内,延迟低;音箱放在悉尼也不影响,因为整条链路都经过小米云。

顺带发现:LX04 和海外卖的 Mi Smart Clock 是同一套硬件,只是系统一个是小爱同学,一个是 Google 助手。

怎么工作的

工作流程图:你对小爱音箱说话,音箱把对话记到小米云;服务器每秒拉取最新对话并判断,问 DeepSeek 或直接报悉尼时间,再通过小米云下发朗读指令,由音箱念出来

问题从上往下传,回答再原路传回去。服务器不直接连音箱,提问和朗读都经过小米云中转。

触发词设了“请”“问一下”“帮我想想”“你觉得”四个,不带触发词的话照常由小爱自己处理。

试过把所有问题都交给 DeepSeek,结果问时间、定闹钟、放歌全乱了:小爱刚开始执行就被打断,DeepSeek 又不能联网,连现在几点都不知道。所以最后让两边分工:干活的事给小爱,聊天、问知识、出主意给 DeepSeek。

踩的坑

最新镜像一启动就崩。 xiaogpt 官方 Docker 镜像已经升到 Python 3.14,程序里还在用旧写法调用 asyncio.get_event_loop(),3.14 不允许了。没去改镜像,而是写了个启动脚本,先把事件循环建好,再照常启动原程序。第一版脚本用错了解释器,找不到镜像里用 PDM 装好的依赖,改成通过 pdm run 启动才对。

找不到设备。 程序按型号去账号里找音箱,可 LX04 在米家里的内部型号写的是 l04m,对不上。手动填上设备编号就好了。

音箱会念“正在问 ChatGPT”。 程序把所有兼容 OpenAI 接口的模型都叫 ChatGPT,等回答时会先播一句“正在问 ChatGPT 请耐心等待”。这句一出来就会把小爱的话顶掉,最后直接去掉了。

查不到小爱说完没有。 这是最麻烦的一个。程序判断“小爱是否正在说话”和“暂停小爱”,用的都是一个叫 ubus 的接口,而 LX04 不支持。LX04 的米家接口规格里倒是有一个“播放状态”属性,实测怎么查都是 null。也就是说,服务器永远不知道小爱什么时候说完。

小爱和 DeepSeek 怎么衔接

小爱听到问题会马上用自己的知识库回答,这一点不刷机拦不住。我不想让 AI 把小爱半路打断,想要的是一个说完再接下一个。

拿不到“说完了”的信号,最后写了两种模式,可以切换:

  • 估算等待:不打断小爱。从小米云的对话记录里取出小爱这次要说的原文,按每秒 4.5 个字(xiaogpt 自己也是用这个语速估算的)算出它多久说完,等够了再念 DeepSeek 的回答。缺点是靠估算,衔接处可能早一点或晚一点。
  • 接管朗读:服务器收到问题后,先用一个“嗯”让小爱停下,等 DeepSeek 回答好,把“小爱的原话 + DeepSeek 的回答”拼成一整段,一次交给音箱念完。顺序由音箱自己保证,不靠猜。代价是小爱开头会被打断一下,中间要安静两三秒。

顺手解决:悉尼时间

小爱系列没有时区设置,只认北京时间,在悉尼问“几点了”每次都得自己换算。既然服务器已经在读对话了,就让它接管“现在几点”“今天星期几”这类不带地名的问题,直接用悉尼时间回答,夏令时也算进去了,不用调 DeepSeek。带地名的问法,比如“东京现在几点”,还是交给小爱。

现在的效果

整体我给 75 分。剩下的问题基本都是不刷机绕不过去的:

  • 小爱总会先开口
  • DeepSeek 回答前要等两三秒
  • 屏幕上的时钟还是北京时间(回国以后它反而是对的)

还有一点要记住:这些补丁是挂在 xiaogpt 现有代码上的,镜像不能随手升级,上游一改,补丁就可能失效。


本文由 Claude 根据我的开发记录整理。