本文转自: https://www.huluohu.com/posts/1047/
仅做个人收藏,版权归原作者所有
这是一个神器的项目,可以让傻傻的小爱音箱接入AI大模型,比如 ChatGPT、豆包等等,将它改造成你的专属语音助手。这个项目名称为MiGPT
,是Github上的一个开源项目,目前已支持10多款小爱音箱,非常推荐手里有小爱音箱的朋友试一试。
🎭 功能特性
- AI 问答:当小爱音箱接入大模型后,上知天文,下知地理,从“人工智障”秒变甜心学霸。
- 角色扮演:一秒调教小爱,无论是成为你的完美伴侣,还是那个能听你倾诉心事的贴心闺蜜,都不在话下。
- 流式响应:爱情来得太快就像龙卷风,而你的小爱音箱也是,对你的爱意秒回,爱你不会让你等太久。
- 长短期记忆:可以记住你们之间的每一次对话,越聊越默契,就像是你身边的老朋友。
- 自定义 TTS:厌倦了小爱同学的语音?支持设置“豆包”同款音色,就像真人在回你的消息。
- 智能家居 Agent:心情不好?小爱立刻懂你,自动帮你播放喜欢的音乐,调节灯光,逗你开心。
⚛️ 实现原理
这个项目主要依赖小米 IoT 生态开放的接口能力,以下为核心运行流程:
- 使用 MIoT 和 MiNA 开放接口控制小爱音箱(播放、暂停、唤醒等)
- 轮询设备对话列表,获取用户的最新对话消息,然后调用 AI 获取回复
- 调用豆包等 TTS 接口合成不同音色的语音回复,然后使用小爱音箱播放音频
不过,通过调用小米 IoT 生态开放接口的方案,无法完美实现在AI回复时让原来的小爱闭嘴,这主要是因为:
- 存在网络延迟
- 有一定的轮询间隔
- 小爱音箱,小米服务云端,MiGPT 三者之间的响应延迟
因此,在唤醒模式下 MiGPT 会通过播放静音音频等方式让小爱闭嘴,达到“曲线救国”的目的,比如:
export const kAreYouOK = "¿ʞо ∩оʎ ǝɹɐ"; // are you ok?
🔊 支持的小爱音箱型号
🛠️ 部署项目
项目支持Docker和源码两种方式部署,笔者建议使用Docker,毕竟源码部署还需要搞定各种本地环境,属实麻烦。使用Docker部署前,需要先配置好.env
和 .migpt.js
两个文件。
1. 配置.env文件
这个文件主要是配置大模型的API_KEY、模型名称和URL,请根据自己的实际情况修改。笔者直接使用one-api代理的gemini模型:
# OpenAI(也支持通义千问、MoonShot、DeepSeek、gemini等模型)
OPENAI_MODEL=gemini-pro
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://oneapi.url.com/v1
# 提示音效(可选,一般不用填,你也可以换上自己的提示音链接试试看效果)
# AUDIO_SILENT=静音音频链接,示例:https://example.com/slient.wav
# AUDIO_BEEP=默认提示音链接,同上
# AUDIO_ACTIVE=唤醒提示音链接,同上
# AUDIO_ERROR=出错了提示音链接,同上
# Doubao TTS(可选,用于调用第三方 TTS 服务,比如:豆包)
# TTS_DOUBAO=豆包 TTS 接口
# SPEAKERS_DOUBAO=豆包 TTS 音色列表接口
2. 配置.migpt.js文件
这个文件主要是配置小米账号、AI的人设以及唤醒词、提示词等等,请根据自己的事情情况和喜好修改。
// 小爱音箱扮演角色的简介
const botProfile = `
性别:男
性格:乖巧可爱
爱好:喜欢搞怪,爱吃醋。
`;
// 小爱音箱主人(你)的简介
const masterProfile = `
性别:男
性格:善良正直
其他:总是舍己为人,是臭狗子的主人。
`;
export default {
bot: {
name: "臭狗子",
profile: botProfile,
},
master: {
name: "大王",
profile: masterProfile,
},
speaker: {
// 小米 ID
userId: "12313242", // 注意:不是手机号或邮箱,请在「个人信息」-「小米 ID」查看
// 你的小米账号密码
password: "1323242",
// 小爱音箱 DID 或在米家中设置的名称
did: "小爱触屏音箱",
// 当消息以下面的关键词开头时,会调用 AI 来回复消息
callAIKeywords: ["请", "你", "臭狗子"],
// 当消息以下面的关键词开头时,会进入 AI 唤醒状态
wakeUpKeywords: ["打开", "进入", "召唤"],
// 当消息以下面的关键词开头时,会退出 AI 唤醒状态
exitKeywords: ["关闭", "退出", "再见"],
// 进入 AI 模式的欢迎语
onEnterAI: ["你好,我是臭狗子,很高兴认识你"],
// 退出 AI 模式的提示语
onExitAI: ["臭狗子已退出"],
// AI 开始回答时的提示语
onAIAsking: ["让我先想想", "请稍等"],
// AI 结束回答时的提示语
onAIReplied: ["我说完了", "还有其他问题吗"],
// AI 回答异常时的提示语
onAIError: ["啊哦,出错了,请稍后再试吧!"],
// 无响应一段时间后,多久自动退出唤醒模式(默认 30 秒)
exitKeepAliveAfter: 30,
// TTS 指令,请到 https://home.miot-spec.com 查询具体指令
ttsCommand: [5, 1],
// 设备唤醒指令,请到 https://home.miot-spec.com 查询具体指令
wakeUpCommand: [5, 3],
// 是否启用流式响应,部分小爱音箱型号不支持查询播放状态,此时需要关闭流式响应
streamResponse: true,
// 查询是否在播放中指令,请到 https://home.miot-spec.com 查询具体指令
// playingCommand: [3, 1, 1], // 默认无需配置此参数,播放出现问题时再尝试开启
},
};
3. 启动Docker容器
上述两个文件配置好以后,将他们上传到你的NAS上,比如上传到目录/share/Container/migpt/config
目录中。
然后在NAS中创建compose.yml文件,将下面的内容粘贴到文件中:
version: '3.9'
services:
migpt:
image: idootop/mi-gpt:latest
container_name: migpt
network_mode: bridge
restart: unless-stopped
env_file: /share/Container/migpt/config/.env
volumes:
- /share/Container/migpt/config/.migpt.js:/app/.migpt.js
logging:
options:
max-size: "10m"
max-file: "5"
最后,启动Docker:
docker compose up -d
下面是启动后运行的效果:
原创不易,如果觉得此文对你有帮助,不妨点赞+收藏+关注,你的鼓励是我持续创作的动力!