目录
背景
人工智能越来越火,已经可以帮助我们处理很多实际的问题了,解答各种问题自不必说,还能生成PPT,AI绘画等等。可是家里的小爱音箱还是很弱鸡,跟大部分车机一样,只能 回答非常有限的问题。好在已经有很多案例解决了这个问题,今天我们也来尝试一下: 让小爱音箱接入大模型,由智障升级为学霸。
基本原理
小爱音箱拥有一套录放音系统和MioT开放接口,前者拾取语音并输出声音应答,后者实现接入互联网实现问题检索。正面做一些基本原理介绍。
以下来自豆包的解释,基本上帮我们梳理清楚了, 音箱、MiGPT与大模型的关系。
总结一下, 即MIGPT是连接音箱和大模型的桥梁。实际部署时,只要将运行MiGPT的平台(一台PC或服务器, 或者是各种派的嵌入式开发板, 如树莓派,NanoPI, OrangePi等)与小米音箱接入同一个局域网,比如家用路由器,二者之间即可基于MIoT(底层为HTTP或MQTT)进行通信。
MIoT 接口
-
定义与作用:MIoT 是小米用于其物联网产品的一种通信协议,对应的接口允许第三方应用程序或硬件与小米的 IoT 设备进行交互,以实现对设备的控制、状态查询等功能。
-
常用接口形式及功能
HTTP 接口:如在 Home Assistant 的米家集成中,控制设备时通过小米云 HTTP 接口向设备发送控制消息,设备收到下行消息后做出响应1。
MQTT 接口:在有小米中枢网关的本地控制场景中,米家集成向小米中枢网关内的标准 MQTT Broker 订阅关注的设备消息,当设备属性改变或产生事件时,设备向网关发送上行消息,Broker 向米家集成推送消息;控制设备时,向 MQTT Broker 发布设备控制消息,再经由网关转发给设备。
MiGPT
MiGPT 本身并不能直接拦截音箱的语音输入,而是利用小米 IoT 生态开放的接口来获取音箱的语音输入,具体过程如下:
利用接口获取音箱消息
- 轮询对话列表:MiGPT 通过 miot 和 mina 开放接口与小爱音箱进行交互,轮询设备对话列表,以获取用户对小爱音箱输入的最新对话消息。
- 判断唤醒词:当获取到用户的消息后,MiGPT 会根据预设的唤醒词判断是否需要调用大模型进行处理。如果消息以唤醒词开头,MiGPT 会将文本发送给配置好的大模型。
播放静音音频
在唤醒模式下 MiGPT 会通过播放静音音频等方式让小爱闭嘴,从而达到拦截音箱语音输入的目的,以便后续将大模型生成的回复内容传递给小爱音箱进行播放。
通信流程
- 用户语音输入:用户向小爱音箱发出语音指令,小爱音箱对语音进行识别和解析,将其转换为文本内容。
- MiGPT 接收与处理:小爱音箱将文本内容传递给 MiGPT,MiGPT 接收到文本后,根据预设的唤醒词判断是否需要调用大模型进行处理。如果消息以唤醒词开头,MiGPT 会将文本发送给配置好的大模型,如 ChatGPT 等23。
- 大模型回复与传递:大模型对收到的文本进行处理和分析,生成相应的回复文本,并将其返回给 MiGPT。
- MiGPT 与音箱交互:MiGPT 接收到大模型的回复后,将回复内容传递给小爱音箱,小爱音箱再将回复文本转换为语音信号,播放给用户,从而完成一次完整的通信过程。
大模型
环境准备
明白了原理 后,我们知道武装音箱的重要任务是部署一个可用的MiGPT为让其接入大模型,下面详细介绍。
MiGPT有多种安装部署方式,在windows 11 PC平台上,可使用以两种方式:
- 基于Node.js运行时环境的源码部署方式。
- 基于Docker的容器部署方式
音箱信息收集
无论哪种安装部署方式,均需要收集音箱的信息,如:
-
型号: 小米音箱mini
-
小米账号(小米UID):小爱音箱app上查看, “我”,点击头像。
-
登陆密码:
-
音箱的名称(我的房间): app上绑定的音箱名,首页顶部查看
大模型申请
MiGPT可以接入很多种 AI 服务,这些服务都提供了足够个人使用的免费额度,每次与大模型交互将消耗一定数量的token(即额度 )。本文以doubao为例。
豆包大模型申请
申请 方法: https://migptgui.com/docs/apply/doubao
模型选择: Doubao-pro-32k, 4k, doubo -lite-4k, 32k
开通管理, 成功后
创建API-Key:
进入模型推理,点击【创建推理接入点】,生成key后备用,另记录ID 。
#key
export ARK_API_KEY="axxxxxxxxx5"
#ID:
ep-xxxxxxxxxxxxxxxxx
MIGPT中关于大模型的配置
相应的修改.env配置文件 ,见后文介绍。
按照接入 AI | MiGPT GUI,创建豆包账号,
- 接口地址(
OPENAI_BASE_URL
)填写https://ark.cn-beijing.volces.com/api/v3
- 密钥(
OPENAI_API_KEY
)填写你第三步创建的 API Key - 模型(
OPENAI_MODEL
)填写你第四步创建的接入点 ID
源码方式安装MiGPT
Node.js
下载安装 Node.js, https://nodejs.org/dist/v22.12.0/node-v22.12.0-x64.msi
Node.js® 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本。
新键一个bat文件,添加以下内容,右键“以管理员身份运行”配置win11 安全性和便利性特性。
#从互联网下载的脚本必须经过数字签名才能运行。这在安全性和便利性之间取得了较好的平衡。
Set-ExecutionPolicy RemoteSigned
安装pnpm
C:\Windows\System32>npm install --global pnpm
npm error code CERT_HAS_EXPIRED
npm error errno CERT_HAS_EXPIRED
npm error request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired
#如果安装特别慢或报上面的错误,可以更换源,建议tencent源
npm config set registry https://registry.npm.taobao.org #taobao源
npm config set registry https://mirrors.cloud.tencent.com/npm/ #tencent源
npm config set registry https://registry.npmjs.org #官方源
#配置好源后再次安装
D:\code\GPT\mi-gpt-main>pnpm -v
9.15.2
配置pnpm
#配置源
pnpm config set registry https://mirrors.cloud.tencent.com/npm/
#update
pnpm udpate
源码准备
- 下载代码 : https://github.com/idootop/mi-gpt/archive/refs/heads/main.zip
配置修改
-
解压代码修改配置文件
将以下两个文件分别改名为:修改为.env和.migpt.js
-
修改.env文件, 配置大模型信息
# OpenAI(也支持通义千问、MoonShot、DeepSeek 等模型) OPENAI_MODEL=ep-xxxxxxxxx-gh4jr OPENAI_API_KEY="xxxxx" # 你的大模型服务接口,比如:https://api.openai.com/v1(注意:一般以 /v1 结尾) OPENAI_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
-
修改.migpt.js配置音箱信息,以小爱音箱mini为例
// TTS 指令,请到 https://home.miot-spec.com 查询具体指令
ttsCommand: [5, 1],
// 设备唤醒指令,请到 https://home.miot-spec.com 查询具体指令
wakeUpCommand: [5, 2],
// 查询是否在播放中指令,请到 https://home.miot-spec.com 查询具体指令
// playingCommand: [4, 1, 1], // 默认无需配置此参数,查询播放状态异常时再尝试开启
/**
* 💬 连续对话
*
* 查看哪些机型支持连续对话 👉 https://github.com/idootop/mi-gpt/issues/92
*/
// 是否启用连续对话功能,部分小爱音箱型号无法查询到正确的播放状态,需要关闭连续对话
streamResponse: true,
安装依赖
进入 MiGPT源码目录
#更新源
D:\code\GPT\mi-gpt-main>pnpm update
Packages: +155
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERR_PNPM_FETCH_404 GET https://mirrors.cloud.tencent.com/npm/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz: Not Found - 404
This error happened while installing the dependencies of tsup@8.3.5
at sucrase@3.35.0
No authorization header was set for the request.
Progress: resolved 221, reused 7, downloaded 146, added 116
# 安装依赖
D:\code\GPT\mi-gpt-main>pnpm install
Lockfile is up to date, resolution step is skipped
Packages: +203
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Downloading typescript@5.4.5: 5.83 MB/5.83 MB, done
Progress: resolved 203, reused 101, downloaded 102, added 107, done
node_modules/.pnpm/@prisma+engines@5.14.0/node_modules/@prisma/engines: Running postinstall script, done in 7.9s
node_modules/.pnpm/esbuild@0.19.12/node_modules/esbuild: Running postinstall script, done in 989ms
node_modules/.pnpm/esbuild@0.20.2/node_modules/esbuild: Running postinstall script, done in 976ms
node_modules/.pnpm/prisma@5.14.0/node_modules/prisma: Running preinstall script, done in 106ms
node_modules/.pnpm/@prisma+client@5.14.0_prisma@5.14.0/node_modules/@prisma/client: Running postinstall script, done in 13.3s
dependencies:
+ @prisma/client 5.14.0
+ fs-extra 11.2.0
+ mi-service-lite 3.1.0
+ openai 4.56.0
+ prisma 5.14.0
+ proxy-agent 6.4.0
devDependencies:
+ @types/fs-extra 11.0.4
+ @types/node 20.12.12
+ tsup 8.0.2
+ tsx 4.11.0
+ typescript 5.4.5
> mi-gpt@4.2.0 postinstall D:\code\GPT\mi-gpt-main
> npx -y prisma migrate dev --name hello
Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": SQLite database "app.db" at "file:app.db"
SQLite database app.db created at file:app.db
Applying migration `20240227161545_init`
The following migration(s) have been applied:
migrations/
└─ 20240227161545_init/
└─ migration.sql
Your database is now in sync with your schema.
✔ Generated Prisma Client (v5.14.0) to .\node_modules\.pnpm\@prisma+client@5.14.0_prisma@5.14.0\node_modules\@prisma\client in 127ms
Done in 2m 13.8s
构建MiGPT
这时不能在cmd中运行了,建议安装一个git bash.https://github.com/git-for-windows/git/releases/download/v2.47.1.windows.1/Git-2.47.1-64-bit.exe.下载安装后,在MiGPT源码目录下,右键选“Git bash here".
#在git bash中执行
pnpm build
$ pnpm build
> mi-gpt@4.2.0 build D:\code\GPT\mi-gpt-main
> npx -y prisma generate && rm -rf dist && tsup
Environment variables loaded from .env
....
....
...
DTS dist\index.d.ts 14.01 KB
DTS dist\index.d.cts 14.01 KB
seane@matebook-xpro-2022 MINGW64 /d/code/GPT/mi-gpt-main
运行并测试一下
可自定义唤醒词。
#.migpt.js配置文件中的默认唤醒词如下:
小爱同学,请 xxx。比如 小爱同学,请问地球为什么是圆的?
小爱同学,你 xxx。比如 小爱同学,你喜欢我吗?
小爱同学,召唤 xxx。比如 小爱同学,召唤傻妞
#可根据需求修改
/**
* 💡 唤醒词与提示语
*/
// 当消息以下面的关键词开头时,会调用 AI 来回复消息
callAIKeywords: ["请", "你", "傻妞"],
// 当消息以下面的关键词开头时,会进入 AI 唤醒状态
wakeUpKeywords: ["打开", "进入", "召唤"],
// 当消息以下面的关键词开头时,会退出 AI 唤醒状态
exitKeywords: ["关闭", "退出", "再见"],
// 进入 AI 模式的欢迎语
onEnterAI: ["你好,我是傻妞,很高兴认识你"], // 设为空数组时可关闭提示语
// 退出 AI 模式的提示语
onExitAI: ["傻妞已退出"], // 为空时可关闭提示语
// AI 开始回答时的提示语
onAIAsking: ["让我先想想", "请稍等"], // 为空时可关闭提示语
// AI 结束回答时的提示语
onAIReplied: ["我说完了", "还有其他问题吗"], // 为空时可关闭提示语
// AI 回答异常时的提示语
onAIError: ["啊哦,出错了,请稍后再试吧!"], // 为空时可关闭提示语
运行并测试一下:
$ pnpm run dev
> mi-gpt@4.2.0 dev D:\code\GPT\mi-gpt-main
> node --env-file=.env ./app.js
/ $$ /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$$$
| $$$ /$$$|__/ /$$__ $$| $$__ $$|__ $$__/
| $$$$ /$$$$ /$$| $$ \__/| $$ \ $$ | $$
| $$ $$/$$ $$| $$| $$ /$$$$| $$$$$$$/ | $$
| $$ $$$| $$| $$| $$|_ $$| $$____/ | $$
| $$\ $ | $$| $$| $$ \ $$| $$ | $$
| $$ \/ | $$| $$| $$$$$$/| $$ | $$
|__/ |__/|__/ \______/ |__/ |__/
MiGPT v4.2.0 by: del.wang
(node:18828) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
2025/01/01 13:49:50 Speaker ✅ 服务已启动...
2025/01/01 13:51:46 Speaker 🔥 请问周深是谁
2025/01/01 13:51:47 Speaker 🔊 让我先想想
2025/01/01 13:51:54 Open AI ✅ Answer: 哎呀,周深呀,他是一个很厉害的歌手呢!他的声音特别特别好听,唱歌的风格好多变呀,有时候空灵得像从仙境传来的声音,有时候又能把歌曲里的情感唱得让人感同身受。他唱过好多好听的歌,像《大鱼》《达拉崩吧》这些都超有名的~
唤醒注意事项
- 唤醒小爱同学
正常对小爱音箱说“小爱同学”,唤醒其进入听写状态。唤醒小爱同学后,可以对她说语音指令,比如“请问地球为什么是圆的”
此时,只有以callAIKeywords开头的消息,才会调用 AI 进行回复。此阶段无法做到连续对话,每次提问都要以“小爱同学,请 xxx”开头。
- 进入唤醒模式
小爱默认不会调用 AI 进行回复。唤醒模式(AI 模式)类似小爱技能,进入后可以连续对话, 使用wakeUpKeywords即可进入唤醒模式,比如“小爱同学,召唤傻妞”, 进入唤醒模式后,每次提问请等待小爱回答“我说完了”之后,再继续向她提问。此时,可直接向小爱提问题,无需再以“小爱同学,xxx”开头。
docker方式MiGPT安装(暂时不推荐,下载image失败)
docker安装
首先安装docker: https://www.docker.com/products/docker-desktop
安装后,重启电脑,打开 命令行验证docker是否正常安装 。
C:\Windows\System32>docker -v
Docker version 27.3.1, build ce12230
C:\Windows\System32>
开始菜单,打开 Docker Desktop,提示: wsl update error, 解决方法:
打开 cmd,安装或更新wsl
#首次安装
wsl --install --web-download
#更新
wsl --update
安装后重启电脑,否则出现以下错误。
### MiGPT容器镜像下载
下载容器并运行
D:\code\GPT\mi-gpt-main 的目录
2025/01/01 11:17 <DIR> .
2025/01/01 11:16 <DIR> ..
2024/12/31 18:08 194 .dockerignore
2024/12/31 18:08 1,103 .env
2024/12/31 18:08 73 .gitignore
2024/12/31 18:08 6,191 .migpt.js
2024/12/31 18:08 <DIR> .vscode
2024/12/31 18:08 175 app.js
2024/12/31 18:08 <DIR> assets
2024/12/31 18:08 1,024 Dockerfile
2024/12/31 18:08 <DIR> docs
2024/12/31 18:08 1,065 LICENSE
2024/12/31 18:08 1,695 package.json
2024/12/31 18:08 70,778 pnpm-lock.yaml
2024/12/31 18:08 <DIR> prisma
2024/12/31 18:08 12,727 README.md
2024/12/31 18:08 <DIR> src
2024/12/31 18:08 <DIR> tests
2024/12/31 18:08 307 tsconfig.json
2024/12/31 18:08 319 tsup.config.ts
12 个文件 95,651 字节
8 个目录 85,656,322,048 可用字节
D:\code\GPT\mi-gpt-main>docker run -d --env-file ./.env -v ./.migpt.js:/app/.migpt.js idootop/mi-gpt:latest
Unable to find image 'idootop/mi-gpt:latest' locally
docker: Error response from daemon: failed to resolve reference "docker.io/idootop/mi-gpt:latest": failed to do request: Head "https://hub-mirror.c.163.com/v2/idootop/mi-gpt/manifests/latest?ns=docker.io": writing response to hub-mirror.c.163.com:443: connecting to 127.0.0.1:48877: dial tcp 127.0.0.1:48877: connectex: No connection could be made because the target machine actively refused it.
See 'docker run --help'.
参考资料
MiGPT: 将小爱音箱打造成你的专属智能家居助手 - 懂AI
接入豆包:
支持的音箱型号
mi-gpt/docs/compatibility.md at main · idootop/mi-gpt · GitHub, 给给了每个型号音箱的控制命令: 修改.migpt.js配置文件 会用到。
基于docker部署MiGPT: Mi-gpt NPM | npm.io
工作原理:
-
使用 MIoT 和 MiNA 开放接口控制小爱音箱(播放、暂停、唤醒等)
-
轮询设备对话列表,获取用户的最新对话消息,然后调用 AI 获取回复
-
调用豆包等 TTS 接口合成不同音色的语音回复,然后使用小爱音箱播放音频
mi-gpt/docs/how-it-works.md at main · idootop/mi-gpt · GitHub
有价值的参考文档,相当详细:
参考一: 手把手教你免费把AI大模型接入小米音箱,无需任何代码基础,小白级基础详细操作教程!_小爱音箱怎么接入ai大模型-优快云博客
- nodeJS + MiGPT
- 大模型silicon API
参考二: 【保姆级教程】小爱同学+AI!魔改小爱音箱,接入本地AI大模型,打造你的专属语音助手!-我不是咕咕鸽
- Docker 方式部署MiGPT(主机为macOS)
- 基于小爱音箱 Pro
- 大模型 : Ollama + Phi-3
其他标题党: 没有可操作性:
MiGPT:将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手! - 站长工具网
将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手_豆包音箱-优快云博客
tps://blog.youkuaiyun.com/h1453586413/article/details/143706970)
- nodeJS + MiGPT
- 大模型silicon API
参考二: 【保姆级教程】小爱同学+AI!魔改小爱音箱,接入本地AI大模型,打造你的专属语音助手!-我不是咕咕鸽
- Docker 方式部署MiGPT(主机为macOS)
- 基于小爱音箱 Pro
- 大模型 : Ollama + Phi-3
其他标题党: 没有可操作性:
MiGPT:将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手! - 站长工具网
将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手_豆包音箱-优快云博客
The End.