建议迁移至官方 MiService 3.x,并优先复用持久化 token,避免启动时强制登录
我用的是最老的S12A那一代,以下内容是GPT帮我总结的。
背景
自己通过 Docker 部署 xiaoGPT,并将登录 token 持久化保存。
当前源码依赖 miservice-fork,且 login_miboy() 在创建 MiAccount 后,无条件调用:
await account.login("micoapi")
官方 miservice 3.x 已支持验证码登录及 token 持久化。我已验证官方版本可以正常登录,希望 xiaoGPT 能考虑迁移,并优先复用已有 token。
建议调整
1. 将依赖替换为官方 MiService 3.x
我在自用版本中使用了 miservice==3.0.1。
迁移需要注意 API 返回格式的差异,不能仅替换依赖名称。例如,官方 3.0.1 的 player_get_status() 直接返回解析后的状态字典:
{"status": 1, ...}
当前 xiaoGPT 按 data.info 中的 JSON 字符串解析播放状态,需要同步调整,包括 TTS 等待播放结束的检查。
2. 启动时优先复用持久化 token
建议移除启动时无条件执行的:
await account.login("micoapi")
官方 MiService 的请求层会读取持久化 token,在 token 缺失或服务端拒绝认证时进行登录及重试。
期望行为:
- 首次启动:正常登录,必要时输入验证码并保存 token。
- 后续重启:有效 token 直接复用,不主动重新登录。
- token 失效:由 MiService 正常重新认证,必要时再次输入验证码。
这里不是希望绕过验证码,而是避免仅因进程或容器重启就主动走登录流程。
3. 保留 S12A 支持
当前 S12A 的 TTS / 唤醒指令映射为 5-1 / 5-5,希望迁移时继续保留。
相关的 mute_xiaoai 优化建议
自用版本还尝试了以下调整:
- 将 conversation 轮询目标周期从约 1 秒缩短到 150ms。
- 命中 GPT 请求后直接调用
player_pause(),省去暂停前的播放状态查询。 - 暂停完成后再将问题交给 GPT 消费,避免异步暂停影响后续播报。
轮询加速会增加云端请求量,150ms 是否适合作为默认值仍需评估,也可以考虑提供配置项。这部分可以与 MiService 迁移分开讨论。
环境和验证范围
- 音箱:S12A
- 部署:本机构建 Docker 镜像,TrueNAS SCALE 自定义 YAML 运行
- 官方依赖:miservice 3.0.1
- TTS:mi
- token:持久化保存
~/.mi.token
自用修改的离线检查覆盖了 token 复用、认证失效后的重试、播放状态格式和暂停顺序;其他音箱型号仍需要进一步验证。
最后感谢大佬这个项目,让我吃灰已久的笨蛋小爱可以通过自搭建CPA用上GPT的所有模型
Source: yihong0618/xiaogpt