三步把小爱音箱接入 ChatGPT:MiGPT 部署与定制完整指南
2026/9/13 10:17:40 网站建设 项目流程

三步把小爱音箱接入 ChatGPT:MiGPT 部署与定制完整指南

【免费下载链接】mi-gpt🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt

晚上十点,你对小爱同学说"请讲个笑话",它念了一段干巴巴的内置段子;而如果你用 MiGPT 把它接入大模型,同样的问法会得到一个真正"听懂"你的回答,还能记住你们聊过什么。MiGPT 是一个 Node.js 项目,通过小米 IoT 开放接口轮询小爱音箱的对话列表,把命中关键词的消息转发给 OpenAI 兼容的 API,再把 AI 的回复用音箱的 TTS 指令播出来——你只需要一份配置文件和一条启动命令。

一句话定位:把小爱音箱从复读机变成有记忆的对话伙伴

MiGPT 的核心就一件事:让小爱音箱的每次对话都经过大模型,而不是只走小米云端。

  • 自然语言问答:上知天文下知地理,不再受限于内置语料
  • 长短期记忆:本地 SQLite 存储对话与记忆,越聊越懂你
  • 可换大脑:任何 OpenAI 兼容接口都能接(ChatGPT、通义千问、Kimi、DeepSeek 等)
  • 可换音色:支持接入第三方 TTS 服务,换掉小爱的默认声音

动手前:5 分钟完成三项自检

这一节帮你在动手前确认三件事:型号支持吗、环境够吗、指令参数查到了吗,避免装完才发现音箱不认。

检查项要求说明
音箱型号小爱/小米系音箱仅支持小米生态,不支持小度、天猫精灵、HomePod
运行环境Node.js ≥ 16 或 Docker服务器无特殊要求,1 核 1G 足够
网络能访问你配置的大模型 API国内模型可免代理
账号小米账号 + 音箱在米家 App 中userId填的是小米 ID(个人主页可查),不是手机号

快速自检一条命令:

# 确认 Node 版本满足要求(Docker 部署可忽略) node -v # 需要 v16+

型号是否支持、以及对应的ttsCommand/wakeUpCommand参数,直接查 docs/compatibility.md 里的型号表。比如小爱音箱 Pro(lx06)是ttsCommand: [5, 1]wakeUpCommand: [5, 3];小爱音箱 mini(lx01)的唤醒指令则是[5, 2]参数按型号查,不能照抄别人的。下图是到 miot-spec 查规格的姿势:搜型号 → 点"规格" → 打开Intelligent Speaker模块对照 AIID。

两个最常见的坑:

⚠️ 本项目在 README 中已标注停止维护:功能稳定可用,但不要期待 bug 修复和新功能,部署前请知悉。

⚠️ 项目通过账号密码走第三方通道控制设备,README 免责声明明确提示存在账号风控甚至封禁的可能,建议先用一个不重要的账号或接受该风险再操作。

三步跑起来:Docker 一条命令,本地源码五分钟

这一节给你最小可运行路径:准备两份配置文件(.env+.migpt.js),选一种部署方式启动,对音箱说句话验证。

三种部署方式对比:

方式适合谁复杂度关键点
Docker 镜像想长期挂着、不想碰环境最低一条docker run
npm 包Node 开发者嵌入自己的项目npm install mi-gpt后代码里MiGPT.create()启动
源码运行要改代码、二次开发clone 后pnpm install && pnpm dev

第一步:准备配置。无论哪种方式,都是同一份配置。.env管"大脑",.migpt.js管"身体"。最小可用的.env

# .env:大模型三件套(由 .env.example 改名而来) OPENAI_MODEL=gpt-4o-mini # ← 关键:模型名 OPENAI_API_KEY=sk-xxxxxx # ← 关键:你的 API Key OPENAI_BASE_URL=https://api.openai.com/v1 # 换成任何 OpenAI 兼容地址即可接千问/Kimi/DeepSeek

.migpt.js.migpt.example.js改名而来,默认文件很长(人设、提示语、模板都在里面),但真正必须改的只有下面几行,其余保持默认即可:

// .migpt.js:只改这几行就能跑 speaker: { userId: "987654321", // 小米 ID(个人信息页可查),不是手机号 password: "123456", did: "小爱音箱Pro", // ← 关键:与米家 App 里的设备名完全一致 callAIKeywords: ["请", "你", "傻妞"], // ← 关键:消息以这些词开头才会调用 AI ttsCommand: [5, 1], // 按型号查(见上一节) wakeUpCommand: [5, 3], streamResponse: false, // 连续对话先关着,确认型号支持再开 }

完整参数含义见 docs/settings.md。

第二步:启动。按你选的方式执行:

# 方式一:Docker(在项目目录里,.env 和 .migpt.js 已就绪) docker run -d --name migpt \ --env-file $(pwd)/.env \ -v $(pwd)/.migpt.js:/app/.migpt.js \ idootop/mi-gpt:latest # 方式二:源码运行(开发调试) git clone https://gitcode.com/GitHub_Trending/mi/mi/mi-gpt cd mi-gpt && cp .env.example .env && cp .migpt.example.js .migpt.js pnpm install # postinstall 会自动初始化 Prisma 数据库 pnpm dev

第三步:验证。控制台出现启动横幅和"服务已启动",对音箱说"小爱同学,请介绍一下你自己",听到 AI 风格(而非内置语料)的回复就成功了。

💡 Docker 部署时改配置必须重启容器才生效;如果改了名称、简介后仍不生效,删掉旧容器重新docker run

搞懂它怎么工作:轮询、关键词、MIoT 指令三件套

明白数据走向后,你就知道每个参数在链路里管哪一段,出问题也能快速定位。

整条链路像一个"传声筒":

你对音箱说话 ↓ MiGPT 轮询设备的对话列表(MiNA 开放接口) ↓ 消息以 callAIKeywords 开头?→ 否:忽略,走小爱原有逻辑 ↓ 是 组装系统提示词(人设 + 群聊信息 + 聊天历史 + 长短期记忆)→ 调用 OpenAI 兼容 API ↓ 拿到回复 → 调用 ttsCommand(play-text)指令 → 音箱用 TTS 读出来

两个关键集成点,各看一段代码就够。

第一段是记忆入口:音箱上报的每一条新消息先在这里落库并入记忆,这是"越聊越懂你"的起点。

// src/services/bot/conversation.ts async onMessage(ctx: MessageContext, msg: MessageWithSender) { const { sender, text, timestamp = Date.now() } = msg; const { room, memory } = await this.get(); if (memory) { const message = await MessageCRUD.addOrUpdate({ text, roomId: room!.id, senderId: sender.id, createdAt: new Date(timestamp), }); if (message) { memory?.addMessage2Memory(ctx, message); // 异步写入短期/长期记忆 return message; } } }

第二段是指令映射:所有设备操作最终都变成[SIID, AIID, 参数]数组下发。[5, 1]Intelligent Speaker下的play-text(播文本),[5, 3]wake-up(唤醒),这就是配置里ttsCommandwakeUpCommand的来源;连续对话还要查playing-state属性([3, 1, 1])来判断音箱是否还在播。

连续对话模式下,MiGPT 反复查询这个播放状态来决定"继续听"还是"结束会话":

从能用到好用:人设、音色、多实例三条扩展路线

MiGPT 没有插件市场式的扩展架构,它的定制面其实很聚焦:改人设、换音色、加触发方式,再加一个多实例玩法,足够覆盖绝大多数需求。

换人设:类比一下,.migpt.js就是给助手写的"岗位说明书"——bot.profile是助手是谁,master.profile是你是谁,systemTemplate是行为守则。想让它从陪聊变成"查天气管家",重写模板即可:

// .migpt.js:systemTemplate 换成自己的提示词 const systemTemplate = ` 你是家里的智能管家。只回答家居、天气、日程相关的问题, 其他话题请礼貌地表示不感兴趣。回复控制在 50 字以内,直接说结论。 `.trim(); export default { systemTemplate, bot: { name: "傻妞", profile: "..." }, // ...其余配置不变 };

换音色:默认用音箱自带 TTS;想换声音(比如豆包同款音色),把第三方 TTS 服务的地址填进.envTTS_BASE_URL,再用switchSpeakerKeywords配一个"把声音换成 xxx"的切换词即可,接入方式见 docs/tts.md。

多设备/多场景:单个 MiGPT 实例是单例,只管一台音箱、一个账号。多房间的正确姿势是一机一实例:配置按房间拆开,各自起一个容器,靠不同的didcallAIKeywords区分场景:

# 厨房的音箱:独立配置、独立实例 docker run -d --name migpt-kitchen \ --env-file .env \ -v $(pwd)/.migpt.kitchen.js:/app/.migpt.js \ idootop/mi-gpt:latest

不同用法下核心参数怎么调,一张表收束:

参数日常闲聊连续对话隐私优先
OPENAI_MODELgpt-4o-minigpt-4o(长上下文)本地开源模型
OPENAI_BASE_URL官方/任意兼容服务官方/任意兼容服务自建服务地址
streamResponsefalsetrue(型号需支持)false
exitKeepAliveAfter3030~6030
TTS内置xiaoai内置或第三方自建第三方 TTS

💡 连续对话是实验性功能:未刷机的音箱上"闭嘴"靠播放静音音频绕开,偶尔会有小爱抢话或延迟,日常使用建议保持streamResponse: false

出问题怎么办:五个高频症状的排查路径

按症状对号入座,绝大多数问题十分钟能定位。

1. 说了"小爱同学,请xxx"没反应

  1. 控制台完全没日志 → 没登录上或did对不上:临时开enableTrace: true对照日志里的真实 did
  2. 有日志但没调 AI → 消息没命中callAIKeywords:加上你说的那个开头词
  3. 调了 AI 但报错 → 看.envOPENAI_BASE_URL和 Key 是否匹配

2. 回复播一半就断 / 连续对话很跳

  1. 确认型号是否在兼容表"完美运行"列(支持播放状态查询)
  2. 不支持 → 关streamResponse
  3. 支持但仍断 → 调大checkTTSStatusAfter(默认 3 秒)给长文本更多时间

3.ttsCommand等参数不知道填什么

按"动手前"那节的流程:搜型号 → 规格 →Intelligent Speaker模块查play-text的 AIID;播放状态查play-control下的playing-state属性。

4. AI 回复时小爱还在"插嘴"

这是已知限制而非故障:轮询有间隔,MiGPT 只能用静音音频"曲线救国",网络延迟大时会更明显。降低checkInterval(最低 500ms)能减轻停顿感,但无法根除。

5. 登录失败、频繁掉线

  1. 确认userId是小米 ID 而非手机号
  2. 换网络/异地登录易触发风控:⚠️ 固定在同一网络环境运行,风控严重时只能换网络或接受账号风险
  3. 查 docs/faq.md,官方常见问题都在这

回到那个夜晚

现在再试一遍开场那句话:对音箱说"请讲个笑话",这次回答的不再是内置语料,而是接了大模型、带着你们聊天记忆的"小爱"。接下来值得做的三件事:把你的systemTemplate改成真正想要的角色、按 docs/compatibility.md 核对一遍指令参数、给另一个房间再拉一个实例。配置改完重启容器,说完第一句,你就已经上手了。

【免费下载链接】mi-gpt🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询