把小爱音箱接入 ChatGPT:MiGPT 语音助手 10 分钟部署教程
【免费下载链接】mi-gpt🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt
MiGPT 是一个把小米小爱音箱接入 ChatGPT、豆包等大模型的开源项目:原来小爱答不上来的问题交给大模型回答,还能和你多轮连续对话。本文带你从零完成 MiGPT 部署,让家里的音箱说出大模型的回答。
🚀 5 分钟跑通 MiGPT:Docker 与 Node.js 两种部署路径
需要准备三样东西:一个米家账号、一台小爱音箱(推荐 Pro 版,大部分型号都支持,完整清单见 docs/compatibility.md)、Docker 或 Node.js 16+(推荐 20)。MiGPT 走的是小米云端接口,服务和小爱音箱不需要在同一局域网,放家里 NAS 或云服务器都行。
目的:克隆代码、生成两份配置文件,用一条 Docker 命令启动服务
git clone https://gitcode.com/GitHub_Trending/mi/mi-gpt cd mi-gpt # 从模板生成配置文件,改成你自己的信息 cp .env.example .env cp .migpt.example.js .migpt.js # 启动容器并挂载两份配置文件(Windows 下 $(pwd) 需换成绝对路径) docker run -d --name mi-gpt --env-file $(pwd)/.env \ -v $(pwd)/.migpt.js:/app/.migpt.js idootop/mi-gpt:latest启动后需要打开刚才生成的两份文件填写信息:
目的:填入大模型密钥与模型名(.env 文件)
OPENAI_API_KEY=sk-your_openai_api_key OPENAI_MODEL=gpt-4o-mini # 国内模型如通义千问,只需改接口地址,变量名保持不变: # OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1⚠️ 密钥不要提交到任何公开位置,示例文件只是模板而非真实可用密钥。
目的:填入小米账号与音箱设备信息(.migpt.js 文件,其余字段保持示例原样)
export default { speaker: { userId: "your_xiaomi_id", // 小米 ID(在「个人信息」页查看,不是手机号或邮箱) password: "your_xiaomi_password", did: "小爱音箱Pro", // 必须与米家 App 中的设备名称完全一致 }, };⚠️ 账号密码属于敏感信息,部署在公网服务器时建议用专用小米账号。
Node.js 开发者可以跳过 Docker:
目的:从源码直接启动,逻辑与 Docker 完全一致
pnpm install && pnpm build # 安装依赖并构建 pnpm dev # 读取 .env 并启动项目会把对话历史存在本地 SQLite 数据库里,支撑后面说的长短期记忆。验证很简单:走到音箱前说「小爱同学,请问 1+1 等于几?」,如果它先说「让我先想想」,再用大模型的答案回答,就说明跑通了。改完配置后注意:Docker 模式必须重启容器才生效。
🔍 MiGPT 工作原理:一条语音指令如何变成 AI 回答
整条链路不改动音箱固件,全靠小米开放接口完成:
- MiGPT 轮询 MiNA / MIoT 云端接口,拿到你刚对小爱说的最新对话;
- 检测到消息以「请 / 你」(
callAIKeywords)等触发词开头时,把消息连同对话历史一起发给配置的大模型; - 模型回复经 TTS 合成语音,指挥音箱播放;连续对话期间循环检测播放状态,30 秒没声音就自动退出。
对话的长短期记忆存在本地数据库里,每次提问会由系统模板(systemTemplate)拼装角色设定和上下文一起喂给模型,所以它「越聊越懂你」。也正因为轮询机制,原版小爱被静音「抢话」会有 1~2 秒的间隙——这是方案特性,不是网络卡。
⚙️ MiGPT 配置参数说明:最容易被写错的 4 个字段
所有参数都在 .env.example 和 .migpt.example.js 两个文件里,但 90% 的启动失败来自下面四个:
| 参数 | 作用 | 推荐值 | 改错的后果 |
|---|---|---|---|
speaker.userId | 小米账号标识 | 纯数字小米 ID(「个人信息」页查看) | 报「70016:登录验证失败」,填成手机号或邮箱必挂 |
speaker.did | 定位控制哪台音箱 | 从米家 App 原样复制设备名,如「小爱音箱Pro」 | 报「找不到设备」,多一个空格、大小写不同、「音响」写成「音箱」都会不匹配 |
OPENAI_MODEL/OPENAI_BASE_URL | 用哪个模型、走哪个接口 | 国内可用通义千问qwen-turbo+ 对应 compatible-mode 地址 | 报「404 The model does not exist」,接口与模型不匹配 |
speaker.ttsCommand | 让音箱播放 TTS 语音的 MIoT 指令 | 到 MIoT 规范站按型号查询,小爱音箱 Pro 为[5, 1] | 控制台打印了 AI 回复,但音箱一声不吭 |
型号不在示例里时,先查它对应的ttsCommand和wakeUpCommand再填:
🎯 MiGPT 使用场景演练:单次问答与连续对话两种玩法
场景一:日常单次问答
- 你说什么:「小爱同学,请问地球为什么是圆的?」
- 系统做什么:轮询到这条消息,命中
callAIKeywords的「请」→ 调用大模型 → TTS 流式回传 - 预期听到什么:「让我先想想」→ 答案正文 →「我说完了」
- 注意:必须先喊「小爱同学」唤醒她再说话,直接对着音箱讲她接收不到;如果音箱正在放音乐,先暂停再对话
场景二:唤醒模式连续对话(推荐小爱音箱 Pro)
先在.migpt.js里把streamResponse: true打开,然后:
- 你说什么:先说「小爱同学,召唤傻妞」,听到欢迎语后直接提问,不用每句都喊「小爱同学」
- 系统做什么:进入 AI 唤醒状态,每句提问都携带上下文,按
checkInterval(默认 1 秒)检测播放状态,30 秒无应答(exitKeepAliveAfter)自动退出 - 预期听到什么:多轮连续问答;「我说完了」之后等 1~2 秒再问下一句;长时间不说话会自动退出唤醒状态
答案说得太长时,喊一句「小爱同学,请你闭嘴」就能打断她。
目的:实时观察消息是否送达 AI、回复是否下发成功
docker logs -f --tail 50 mi-gpt🚑 MiGPT 踩坑急救站:70016 与 LLM 响应异常速查
| 报错原文 | 一句话原因 | 修复方式 |
|---|---|---|
70016:登录验证失败 | userId填成了手机号或邮箱,或密码错误 | 改成纯数字小米 ID,保存后重启容器 |
找不到设备:xxx | did与米家中的设备名称不一致 | 从米家原样复制设备名;名称不一致时在.migpt.js打开debug: true和enableTrace: true,从日志里找到设备的miotDID填入 |
LLM 响应异常 Connection error | 国内网络无法直连 OpenAI 官方接口 | 在.env里加HTTP_PROXY代理,或把OPENAI_BASE_URL换成国内模型接口 |
另一类常见现象:AI 的回答「说一半戛然而止」,通常是你的型号无法正确查询播放状态,到 MIoT 规范站查询playingCommand并填入配置:
改了还不行就是型号硬限制,可以改设streamResponse: false保证每句完整播完(代价是失去连续对话)。以上都对不上时,先打开debug: true拿到详细日志再排查。
📌 MiGPT 进阶方向:第三方 TTS 音色与官方文档入口
docs/settings.md 有全量参数说明,docs/tts.md 讲如何接入第三方 TTS 解锁更像真人的音色,docs/changelog.md 记录了功能更新(项目已进入停止维护状态,现有功能完整可用)。
打开 docs/faq.md 搜索你遇到的报错关键词,搜不到就把报错原文贴进 Issue 区,提交你的第一条反馈。
【免费下载链接】mi-gpt🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考