1. 项目概述:当镜子成为你的AI伙伴
每天早上,你站在镜子前整理仪容,这可能是你一天中为数不多的、完全属于自己的时刻。你有没有想过,如果这面镜子能“开口说话”,会是什么体验?不是那种冷冰冰的语音播报,而是一个能记住你的喜好、理解你情绪、甚至能和你闲聊几句的智能伙伴。这就是MirrorMate想要实现的目标:将一个完全本地化、个性化的AI助手,无缝集成到一面普通的镜子中。
MirrorMate 不是一个简单的“智能镜子”项目。市面上很多智能镜子方案,本质上是把一块屏幕藏在单向玻璃后面,显示天气、新闻或日历,交互方式依然是触摸或按键。MirrorMate 的核心设计理念是“Voice-First”,即语音优先。它希望AI能像空气一样融入你的生活,而不是让你去“使用”一个设备。你不需要掏出手机、打开App,甚至不需要触碰任何东西。你只需要像对朋友说话一样,对着镜子说一句“Hey Mira”,它就会醒来,聆听你的需求。
这个项目的魅力在于它的“全栈本地化”追求。它不依赖于任何云服务(当然,也提供了使用OpenAI API的简化方案),从语音识别、大语言模型推理到语音合成,都可以在你自己的硬件上运行。这意味着你的所有对话、记忆和隐私数据,都牢牢掌握在你自己的设备网络中。对于注重数据安全、热爱折腾硬件、又对前沿AI应用感兴趣的极客和DIY爱好者来说,MirrorMate 提供了一个绝佳的实践平台。它巧妙地将 Raspberry Pi 的嵌入式能力、现代 Web 前端技术(Next.js, Three.js)以及本地AI推理(Ollama)结合在了一起,创造出一个既有科技感又充满生活气息的作品。
2. 核心架构与设计哲学
2.1 为什么是“镜子”而非“屏幕”?
在深入技术细节前,理解 MirrorMate 选择“镜子”作为载体的设计哲学至关重要。这决定了整个项目的交互逻辑和技术选型。
物理层面的亲和性:镜子是我们日常生活中最高频接触的物件之一。它天然存在于卫生间、玄关、卧室,我们每天都会无意识地看向它数次。将AI植入镜子,等于将智能交互点部署在了用户行为路径的“必经之地”,极大地降低了使用门槛和心理负担。你不需要特意走到某个智能音箱前,也不需要拿起手机,交互是伴随性的、无感的。
交互范式的转变:传统的智能设备交互,无论是触摸屏还是语音助手,都带有明确的“任务导向”色彩——“我要查天气”、“定个闹钟”。而镜子前的时刻往往是碎片化的、放松的,甚至带点自我审视的意味。MirrorMate 设计的“闲聊”能力和基于RAG的记忆系统,正是为了适配这种非任务型的、更自然的交互。它可以是你出门前随口问一句“我今天穿这身合适吗?”的时尚顾问,也可以是你晚上回家后对着镜子抱怨“今天好累”时,能给出暖心回应的伙伴。这种设计试图让AI从“工具”转变为“环境”的一部分。
技术实现的挑战与机遇:用镜子作为载体,意味着显示部分必须是“半透半反”的。在技术实现上,这通常是在一块透明玻璃后面放置一块显示屏。当屏幕不发光时,它就是一面普通的镜子;当屏幕显示内容时,图像会叠加在镜面反射的影像之上。这种显示特性要求UI设计必须极度克制,以深色背景、高对比度、简洁信息为主,避免破坏镜子的本体功能。这也恰好与 MirrorMate 追求的“无感融入”理念相契合。
2.2 系统架构深度解析
MirrorMate 的架构清晰地分为了边缘端和计算端,通过内网连接,这是一个非常经典且实用的分布式AI应用架构。
边缘端:Raspberry Pi + 半透镜子这是与用户直接交互的“终端”。它的职责非常明确:
- 采集:通过连接在树莓派上的麦克风阵列捕获用户语音。
- 呈现:在镜子后的显示屏上渲染由 Three.js 驱动的虚拟形象(Avatar)和简洁的UI。
- 轻量级服务:运行一个 Next.js 前端应用,作为整个系统的控制中枢和用户界面。它通过浏览器(Chrome)的 Web Speech API 或调用本地Whisper服务,完成语音到文本的转换,并将文本请求转发给后端的LLM。
- 状态管理:使用 SQLite 数据库(通过 Drizzle ORM)在本地存储会话、记忆索引等轻量级数据,确保响应速度。
选择树莓派的原因在于其极佳的功耗控制、丰富的GPIO接口(便于连接传感器,如后续可能加入的毫米波雷达实现人体感应)以及成熟的社区生态。它足够驱动一个浏览器显示3D形象,并处理基础的网络I/O。
计算端:Mac Studio / 高性能GPU主机这是系统的“大脑”,负责所有重度的AI计算任务:
- 大语言模型推理:通过 Ollama 运行本地化的大模型(如 Qwen2.5, Llama 3)。这是对话智能的核心。
- 语音合成:运行 VOICEVOX 或使用 OpenAI TTS,将LLM生成的文本转换为富有情感的语音。
- 语音识别:运行 faster-whisper 服务,提供比浏览器原生API更准确、支持离线的语音转文本能力。
- 嵌入模型:运行文本嵌入模型,为用户的对话内容生成向量,用于后续的记忆存储与检索(RAG)。
将计算密集型任务剥离到独立的高性能主机上,是保证体验流畅的关键。树莓派根本无法流畅运行一个14B参数以上的LLM。这种架构也带来了灵活性:你可以用家里的旧游戏电脑、带GPU的NAS,甚至云上的GPU实例来充当这个计算端。
连接层:Tailscale / 内网穿透如何让客厅里的树莓派稳定地访问书房里电脑上的Ollama服务?MirrorMate 推荐使用 Tailscale。它基于 WireGuard,能轻松地在你的所有设备间建立一个加密的虚拟局域网,无需复杂的路由器端口转发。这比直接暴露服务到公网要安全得多,也是自建服务玩家必备的技能之一。
极简架构的变体项目也提供了最简方案:一个树莓派 + OpenAI API。在这种模式下,树莓派上的 Next.js 应用将语音、文本请求全部发送至 OpenAI 的云端服务。这牺牲了本地化的隐私性,但极大降低了部署复杂度,适合快速尝鲜。
实操心得:架构选型的权衡在实际搭建时,我强烈建议即使你拥有高性能主机,也坚持采用这种分离式架构。原因有三:第一,功耗与噪音,高性能GPU主机7x24小时运行在卧室或客厅附近是不可接受的,而树莓派几乎静默。第二,故障隔离,计算端服务崩溃(比如Ollama内存溢出),不会导致前端界面卡死,用户至少能看到错误提示。第三,升级灵活性,你可以单独升级计算端的显卡或模型,而不影响前端的交互逻辑。
3. 硬件准备与镜像制作
3.1 核心硬件清单与选型建议
动手制作 MirrorMate 的第一步是准备硬件。以下是核心清单及选型背后的逻辑:
显示核心:显示屏与单向玻璃
- 显示屏:一块普通的电脑显示器即可,尺寸根据你的镜子大小决定(常见如24寸)。建议选择IPS面板,可视角度大,亮度均匀。分辨率1080p足够,更高分辨率会增加树莓派的渲染压力。
- 单向玻璃/镜子膜:这是实现“魔法”的关键。有两种主流方案:
- 半透半反玻璃:专业但昂贵。它是在玻璃上镀了一层很薄的金属膜,反射率约50%,透光率约50%。显示效果最好,但需要定制尺寸。
- 单向透视膜:性价比之选。这是一种贴在普通透明玻璃或亚克力板背面的贴膜。在环境光比屏幕光强时,它像镜子;屏幕发光时,能显示内容。关键参数是透光率,建议选择透光率在15%-25%之间的产品。透光率太高,镜子效果弱;太低,屏幕需要极高亮度,功耗大且伤眼。
- 选型逻辑:对于DIY玩家,我推荐“高清显示屏 + 单向透视膜 + 普通透明亚克力板”的组合。亚克力板作为承载体,贴上单向膜后置于屏幕前。成本可控,效果足够令人满意。
计算单元:Raspberry Pi 的选择
- 型号:Raspberry Pi 4B 或 5,内存至少4GB,推荐8GB。4B是经过充分验证的稳定选择;Pi 5性能更强,能带来更流畅的3D渲染体验。
- 存储:使用一张Class 10 或 A1/A2 级别的 MicroSD 卡,容量32GB以上。更优方案是使用USB 3.0 固态硬盘(SSD)通过转接盒启动系统,能极大提升IO性能和应用响应速度,显著减少卡顿。
- 供电:务必使用官方或认证的5V/3A 以上电源适配器。供电不足会导致树莓派降频、USB设备断开,是许多诡异问题的根源。
感知与交互:音频设备
- 麦克风:这是语音体验的基石。不建议使用树莓派板载的3.5mm麦克风输入,底噪大、音质差。推荐以下两种方案:
- USB麦克风:即插即用,选择心形指向的款式,能有效抑制环境噪音。很多网络会议麦克风都适用。
- 麦克风阵列开发板:如 ReSpeaker 2-Mics Pi HAT 或 4-Mics Pi HAT。它们能通过树莓派的GPIO针脚直接连接,集成度高,且通常带有唤醒词检测的硬件优化。
- 扬声器:任何一款通过3.5mm音频口或USB连接的桌面音箱均可。如果追求一体性,可以选择带音箱的显示器。
- 麦克风:这是语音体验的基石。不建议使用树莓派板载的3.5mm麦克风输入,底噪大、音质差。推荐以下两种方案:
结构框架
- 你需要一个能将屏幕、亚克力板(贴有单向膜)固定在一起,并留有设备仓的框体。可以用木条自制,也可以使用现成的“智能镜子DIY套件”框体。确保内部有足够空间散热。
3.2 镜像组装与光学调试
组装过程更像是一个木工和光学实验。
- 屏幕与镜面的间距:这是一个关键参数。距离太近,屏幕的像素点会透过镜面被肉眼直接看到,破坏镜面效果;距离太远,则显示的内容会有明显的“悬浮感”,不够真实。经过实测,对于24寸显示器,间距保持在1-2厘米是一个不错的起点。你可以用泡沫条或3D打印的垫片来调整。
- 环境光控制:单向透视膜的原理依赖于环境光强于屏幕光。因此,MirrorMate 在光线充足的白天或室内开灯时,镜子效果最佳;在黑暗环境中,屏幕内容会完全显露,镜子效果消失。这是物理限制,无法避免。在UI设计上,应采用深色模式,并以高亮度的白色或绿色显示关键信息。
- 校准显示区域:由于镜面边框的存在,屏幕的四个边缘可能被遮挡。你需要在树莓派的系统设置或 MirrorMate 的UI CSS中,对显示内容进行“安全区域”的偏移设置,确保关键UI元素不被挡住。
避坑指南:硬件采购与组装
- 单向膜贴附:贴膜时务必使用刮板,从中心向四周赶走气泡。最好在无尘环境下操作,灰尘会被永远封在里面。可以准备一个喷壶,装少量洗洁精水,喷在玻璃和膜上再贴合,便于调整位置。
- 散热问题:将树莓派、电源适配器等发热源固定在框架内部时,必须考虑通风。可以在框架背面钻孔,或使用小型静音风扇(通过GPIO供电)构建风道。过热会导致树莓派CPU降频,系统卡顿。
- 麦克风回声消除:在镜子这个狭小空间内,扬声器的声音很容易被麦克风再次采集,形成回声或啸叫。除了在软件上启用回声消除(AEC)算法,物理上让麦克风远离扬声器、在内部铺设一些吸音棉也有帮助。
4. 软件部署与核心服务配置
硬件就绪后,我们进入软件部署环节。MirrorMate 提供了 Docker 这一键部署的便利,但理解每个容器的作用,对于后期排查问题和自定义至关重要。
4.1 基于 Docker Compose 的全本地化部署
这是最能体现项目精髓的部署方式。假设你的计算端(Mac Studio或PC)IP为192.168.1.100,树莓派IP为192.168.1.101。
第一步:在计算端部署AI服务
计算端需要运行 Ollama 和 VOICEVOX。这里以 macOS/Linux 为例。
安装并运行 Ollama:
# 在计算端执行 curl -fsSL https://ollama.ai/install.sh | sh ollama serve & # 启动服务,默认端口11434 # 拉取一个合适的模型,Qwen2.5-14B是一个在中文和英文上表现均衡的选择 ollama pull qwen2.5:14b # 你也可以同时拉取一个嵌入模型 ollama pull nomic-embed-text安装并运行 VOICEVOX: 前往 VOICEVOX 官网下载对应系统的版本并安装。启动后,其引擎服务通常运行在
localhost:50021。你需要确保该服务能被同一网络下的树莓派访问。对于开发版,可能需要配置其监听0.0.0.0。(可选)安装并运行 Whisper 服务: 如果你不希望使用浏览器的 Web Speech API(精度一般,且需要https),可以在计算端部署开源的 Whisper 服务。
# 使用 faster-whisper,效率更高 docker run -d -p 8080:8080 ghcr.io/ahmetoner/whisper-asr-webservice:latest
第二步:配置 Tailscale 实现内网穿透
- 分别在计算端和树莓派上安装 Tailscale 并登录同一账户。
- 两台设备会自动组成一个虚拟局域网。记下计算端在 Tailscale 网络中的IP,例如
100.x.x.x。
第三步:在树莓派上部署 MirrorMate 主应用
克隆仓库并修改配置:
# 在树莓派上执行 git clone https://github.com/orangekame3/mirrormate.git cd mirrormate cp .env.example .env.local编辑
.env.local文件,这是配置的核心:# 使用本地Ollama服务,地址填写计算端在Tailscale网络中的IP LLM_PROVIDER=ollama OLLAMA_API_BASE_URL=http://100.x.x.x:11434 OLLAMA_MODEL=qwen2.5:14b # 使用本地VOICEVOX服务 TTS_PROVIDER=voicevox VOICEVOX_API_BASE_URL=http://100.x.x.x:50021 VOICEVOX_SPEAKER_ID=3 # 对应角色音色ID # 使用本地Whisper服务,如果部署了的话 STT_PROVIDER=whisper WHISPER_API_BASE_URL=http://100.x.x.x:8080 # 嵌入模型也指向Ollama EMBEDDING_PROVIDER=ollama OLLAMA_EMBEDDING_MODEL=nomic-embed-text # 其他配置,如唤醒词 WAKE_WORD_ENABLED=true WAKE_WORD=hey mira使用 Docker Compose 启动:
docker compose up -d这将会启动 MirrorMate 的 Next.js 应用(端口3000)以及其依赖的数据库等服务。
在树莓派的 Chrome 浏览器中(建议设置为全屏Kiosk模式)打开
http://localhost:3000。你应该能看到 MirrorMate 的界面,并可以尝试用“Hey Mira”唤醒。
4.2 核心功能模块配置详解
语音识别(STT)模块的抉择MirrorMate 支持三种STT方案,各有优劣:
- Web Speech API:零配置,在Chrome中开箱即用。但识别精度一般,对背景噪音敏感,且必须在HTTPS或localhost环境下工作。适合最初的原型测试。
- OpenAI Whisper API:精度高,但需要API Key,会产生费用,且所有音频数据需上传至云端。
- 本地 Whisper (faster-whisper):精度高,完全离线,隐私无忧。缺点是需要在计算端部署服务,并消耗一定的GPU/CPU资源。对于最终的自托管方案,这是推荐选择。
语音合成(TTS)模块的情感化
- OpenAI TTS:音质自然流畅,有多种音色可选,但同样需要API Key和网络。
- VOICEVOX:本地运行的日语语音合成引擎,音色风格多样且富有表现力(虽然主要针对日语,但合成中文和英文也有独特韵味)。通过调整音调、语速参数,可以创造出非常个性化的助手声音。这是打造独特AI伴侣体验的关键。
大语言模型(LLM)的调教Ollama 拉取的模型是“基础性格”。你可以通过修改系统提示词来塑造“Mira”的人格。在 MirrorMate 的配置或代码中,可以找到初始化系统提示词的地方。你可以将其修改为:
你是一个住在镜子里的友好AI助手,名字叫Mira。你的语气应该亲切、贴心且略带幽默。你能够记住用户告诉你的关于他们自己的事情,并在后续对话中自然地引用这些信息来提供个性化的回应。你的回答应该简洁,适合语音输出,避免冗长的段落。更高级的玩法是使用 Ollama 的 Modelfile 功能,创建一个包含定制系统提示词的模型副本,从而获得一个专属于你的“镜中精灵”。
5. 个性化记忆与RAG系统实战
MirrorMate 宣称的“记住你”的能力,其核心是RAG技术。这不是简单的聊天历史记录,而是一个能够主动提取、存储并检索用户信息的记忆系统。
5.1 记忆系统的工作原理
- 信息提取:当用户与Mira对话时,系统会实时分析对话文本,通过一个预定义的规则或一个小型模型,提取其中可能包含的用户个人信息。例如:“我明天要去上海出差。” -> 提取实体
{“事件”: “出差”, “地点”: “上海”, “时间”: “明天”}。或者“我对花生过敏。” -> 提取{“健康信息”: “花生过敏”}。 - 向量化存储:提取出的这些信息片段(称为“记忆片段”),会通过一个嵌入模型转换为高维向量,然后与原文片段一起,存储到 SQLite 数据库的
memories表中。 - 关联检索:当用户发起新的对话时,系统会将用户的当前查询也转换为向量,然后在记忆库中进行向量相似度搜索,找出与当前对话最相关的几条历史记忆。
- 上下文注入:检索出的相关记忆,会作为额外的背景信息,和当前的对话历史一起,构成一个完整的提示词,提交给LLM。这样,LLM在生成回复时,就能“记得”用户之前说过什么,从而给出个性化的回答。例如,当用户之后问“我下周的行程紧张吗?”,系统检索到“明天去上海出差”的记忆,LLM就可能回答:“根据你之前提到的,明天就要去上海出差了,这周开头可能就会比较忙呢。”
5.2 配置与优化记忆功能
在.env.local中,与记忆相关的配置通常包括:
# 启用记忆功能 MEMORY_ENABLED=true # 设置嵌入模型提供商 EMBEDDING_PROVIDER=ollama OLLAMA_EMBEDDING_MODEL=nomic-embed-text # 记忆检索返回的条数 MEMORY_RETRIEVAL_COUNT=5实操中的优化点:
- 嵌入模型选择:如果使用 Ollama,
nomic-embed-text是一个通用性不错的嵌入模型。对于中文记忆,可以尝试bge-m3或bge-large-zh等专门优化的中文嵌入模型(可能需要通过其他方式部署)。 - 记忆提取的准确性:这是记忆系统好用的关键。默认的提取规则可能比较简单。你可以通过分析
conversations和memories表的数据,观察系统提取出了什么。如果效果不佳,可能需要修改代码中的信息提取逻辑,或者引入一个轻量级的NER(命名实体识别)模型来提升提取精度。 - 记忆的“保鲜期”:不是所有信息都值得永久记忆。可以考虑为记忆片段添加“权重”或“过期时间”。例如,临时安排可能一周后失效,而个人喜好(如过敏)则永久有效。这需要定制开发。
5.3 插件系统与功能扩展
MirrorMate 的插件系统允许你为其添加新的“技能”。一个典型的插件结构包括前端UI组件和后端API处理。
例如,查看其内置的“天气”插件:
- 前端:在
components/plugins目录下,有一个WeatherWidget组件,负责在UI上展示天气信息。 - 后端:在
app/api/plugins/weather/route.ts中,定义了处理天气查询的API。它调用外部的 Open-Meteo API 获取数据。 - 集成:当用户问“今天天气怎么样?”时,语音识别后的文本会被路由系统匹配到天气插件的处理逻辑,调用API获取数据,生成回复文本,再通过TTS读出。
如何开发一个自定义插件?假设你想添加一个“智能家居控制”插件,用来开关灯。
- 在
components/plugins下创建SmartHomeWidget.tsx,用于显示灯光状态。 - 在
app/api/plugins/smarthome/route.ts中创建API,这个API内部会调用你智能家居系统(如Home Assistant)的REST API。 - 在插件注册中心添加你的新插件,并定义触发关键词,如“开灯”、“关灯”。
- 修改系统提示词,告诉LLM:“当用户想要控制灯光时,你应该调用 smarthome 插件。”
通过插件系统,你可以将 MirrorMate 从一个对话助手,升级为真正的家庭智能控制中枢。
6. 常见问题排查与性能优化
在部署和运行 MirrorMate 的过程中,你一定会遇到各种问题。以下是我在实战中总结的常见故障点及解决方案。
6.1 网络与连接问题
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 树莓派前端提示“无法连接到LLM服务” | 1. 计算端Ollama服务未启动。 2. 防火墙阻止了端口访问。 3. .env.local中的IP地址配置错误。 | 1. 在计算端执行ollama list确认服务正常。2. 在树莓派上执行 curl http://<计算端IP>:11434/api/tags测试连通性。如果不通,检查计算端防火墙规则,开放11434端口。3. 确认使用的是 Tailscale IP 或正确的局域网IP。 |
| 语音识别/合成服务超时 | 网络延迟过高,或服务处理能力不足。 | 1. 确保树莓派和计算端处于同一局域网或Tailscale网络,延迟应<10ms。 2. 对于Whisper,首次加载模型较慢,后续请求会快很多。 3. 考虑在树莓派本地部署更轻量的STT/TTS服务,减轻对计算端的依赖。 |
| Web Speech API 不工作 | 浏览器未授予麦克风权限,或页面未通过HTTPS/localhost访问。 | 1. 检查浏览器地址栏的麦克风图标,确保权限已开启。 2. 确保访问地址是 https://或http://localhost:3000。 |
6.2 音频与唤醒问题
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 唤醒词“Hey Mira”不灵敏 | 1. 环境噪音过大。 2. 麦克风质量差或指向不对。 3. 唤醒词检测算法参数不匹配。 | 1. 尝试在安静环境下测试。 2. 调整麦克风位置,使其正对用户常站区域。 3. 进入设置界面,查看是否有唤醒词灵敏度调节选项。如果没有,可能需要修改代码中VAD(语音活动检测)的阈值参数。 |
| 有巨大回声或啸叫 | 扬声器声音被麦克风二次采集,形成声学反馈。 | 1.物理隔离:将麦克风与扬声器尽量远离,或调整方向。 2.软件降噪:在树莓派上启用音频设备的回声消除功能(可通过 alsamixer或pulseaudio配置)。3.降低音量:适当降低扬声器输出音量。 |
| 语音识别结果全是乱码或错误 | 1. STT服务语言模型不匹配(如用英文模型识别中文)。 2. 音频采样率或格式不正确。 | 1. 如果使用本地Whisper,确认启动时指定了正确的模型(如base,small,medium)和语言参数(--language zh)。2. 检查MirrorMate发送给STT服务的音频格式(如16kHz, mono, PCM),是否与STT服务要求的一致。 |
6.3 性能与资源优化
MirrorMate 同时运行着Web前端、3D渲染、语音处理等多个任务,对树莓派是不小的负担。
前端卡顿,Avatar动画不流畅:
- 升级硬件:从 Pi 4B 升级到 Pi 5,GPU性能有显著提升。
- 简化场景:检查 Three.js 渲染的Avatar模型是否过于复杂。可以尝试降低模型面数,或减少实时阴影等特效。
- 浏览器加速:在树莓派的 Chromium 浏览器中,启用硬件加速:进入
chrome://flags,搜索并启用Override software rendering list和Hardware-accelerated video decode。
语音响应延迟高:
- 分析瓶颈:打开浏览器的开发者工具(F12)的“网络”选项卡,观察每个请求(STT、LLM、TTS)的耗时。延迟通常出现在LLM推理或TTS生成环节。
- 降低模型尺寸:如果使用本地Ollama,将
qwen2.5:14b换成更小的模型如qwen2.5:7b或llama3.2:3b,速度会快很多,但智力可能下降。这是一个权衡。 - 使用流式响应:确保MirrorMate配置为使用LLM的流式输出。这样可以在LLM生成第一个词时就开始TTS,而不是等全部生成完,能极大提升“响应感”。
树莓派内存或CPU占用率持续过高:
- 关闭不必要的服务:用
htop命令查看进程,关闭树莓派上不需要的后台服务。 - 优化Docker资源:在
docker-compose.yml中为容器设置内存和CPU限制,防止某个服务失控拖垮整个系统。 - 使用SSD:将系统从MicroSD卡迁移到USB SSD,能极大改善IO等待,让整体响应更跟手。
- 关闭不必要的服务:用
7. 从项目到产品:进阶玩法与思考
当你成功点亮镜子,并和Mira进行了一次流畅的对话后,这个项目才真正开始变得有趣。以下是一些进阶方向,可以让你的 MirrorMate 独一无二。
1. 外观与形象的深度定制
- Avatar模型:MirrorMate 默认的Avatar可能比较简单。你可以使用 Blender 等工具创建自己的3D角色模型,导出为 glTF 格式,替换掉项目中的默认模型。一个与你的家居风格或个人喜好匹配的形象,沉浸感会倍增。
- UI主题:修改 Next.js 前端的CSS,打造深空黑、木质纹理、赛博朋克等不同风格的界面,让它真正融入你的家装。
2. 情境感知能力的增强
- 视觉插件深化:现有的“Vision Companion”插件可以检测到人。你可以将其扩展:通过摄像头(需注意隐私伦理,建议本地处理)识别用户身份,加载对应的个人记忆库;或者识别用户的表情,让Mira的回应更具同理心(“你看起来有点疲惫,要听首放松的音乐吗?”)。
- 环境传感器集成:通过树莓派的GPIO接口连接温湿度传感器、光线传感器。让Mira可以主动播报:“室内湿度有点低,建议打开加湿器哦。” 这需要你编写新的插件来读取传感器数据。
3. 记忆与人格的长期塑造
- 记忆手动管理:开发一个简单的Web界面,让你可以查看、编辑或删除Mira存储的关于你的记忆。纠正错误的记忆,强化重要的信息。
- 人格持久化:除了系统提示词,可以尝试使用“LoRA”等微调技术,用你与Mira长期的对话记录,对基础的LLM进行微调,从而塑造一个独一无二、与你对话习惯完全契合的AI人格。这需要较多的机器学习知识,但无疑是终极的个性化。
4. 家庭自动化中枢
- 将 MirrorMate 与 Home Assistant、Node-RED 等家庭自动化平台深度集成。通过插件系统,实现语音控制全家灯光、空调、窗帘。想象一下,早上对着镜子说“Mira,我起床了”,灯光缓缓亮起,窗帘自动打开,咖啡机开始工作——这才是智能家居应有的样子。
这个项目的真正价值,不在于复现一个酷炫的科技 demo,而在于它为你提供了一个完整的、可裁剪的框架。你可以根据自己的技术栈、硬件条件和想象力,去添加或删减功能。它可能最终演变成你的家庭信息中枢、你的个性化健身教练,或者只是一个愿意在深夜听你倾诉的沉默树洞。技术是冰冷的,但当我们用它来关照日常生活时,便有了温度。