#615·xiaogpt

建议迁移至官方 MiService 3.x,并优先复用持久化 token,避免启动时强制登录

Author: ly6170Created Sep 20, 2026Updated Sep 21, 2026

我用的是最老的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的所有模型