【Hello AI 科技致善】每一个被辞退的"无故爆发"背后:给特殊就业者做的一只压力检测桌宠
项目地址:https://github.com/YUHAO-corn/banban-desktop-pet
面向人群:心智障碍就业者,及所有长期伏案工作、容易撑过头的打工人
技术栈:Python · MediaPipe · Electron · 100% 本地运行
BanBan 压力提醒演示:从正常陪伴到黄牌、红牌提醒

摘要
BanBan 是一只 macOS 桌面宠物,为心智障碍就业者(孤独症谱系、精神障碍康复者、轻度智力障碍等)在办公场景下的压力积累问题做一个缓冲。
它用摄像头观察四类面部压力线索——皱眉、眯眼、嘴唇紧绷、表情冻结,在人过载前举黄牌、红牌,弹出一句气泡提醒"先停一下"。不替代就业支持员,只在支持员不在场的时候,替他们看一眼。
启动时做 10 秒个人平静基线校准,减少因人而异的误判。摄像头数据本地处理,识别完即删,不联网不上传。
真实场景与需求
先说一下我是谁
我曾做过一段社工工作,那时候接触过一些心智障碍群体的就业支持,对这个群体本身有一点耳闻。这次黑客松选题时一看到"心智障碍群体就业"这个方向,基本没犹豫。
"有所耳闻"和"能做出一个有用的产品"之间差很远,所以我又重新做了一轮调研:
- 关注了暖星社区(国内较早关注心智障碍者的公益组织)的公众号
- 看了几部纪录片:《星星的少年》《蜗牛人生》,以及一部叫《善工家园》的
- 翻了一线就业支持员、特教老师、心智障碍者家属在小红书和微信公众号上的记录
- 去一个社区日间照料机构实地走访,看这个群体在受支持的环境下是怎么工作的
下面这一节,是这轮调研里让我印象最深的东西。
目标人群
心智障碍就业者不是一类人,而是一组场景接近但需求各异的群体:
| 子群体 | 就业中的典型处境 |
|---|---|
| 孤独症谱系 | 可以胜任重复性岗位,但容易感官过载、社交耗竭,回到工位后停留在内耗里出不来 |
| 精神障碍康复者 | 能力通常没问题,但焦虑、抑郁、创伤反应可能突然袭来,不愿向同事暴露 |
| 轻度智力障碍 | 能完成任务,但遇到催促、指令变化、多步骤切换时容易紧张、卡死 |
这些情况不一样,但有一个共同点——压力积累的时候,他们自己未必意识得到,身边也未必有人能看出来。
痛点——一个具体的真实场景
《善工家园》那部片子里有一个男孩。他不主动说话,按着简单的指令慢慢做事。辅导员一直陪着他,不敢走远,因为只要同事语速突然变快,或者手头的任务换一个,他就会僵在那儿,手足无措。
但给他几分钟,他是能转过弯的。他是能做事的。
问题不是他不能工作,是没人在他快卡死的那一刻轻轻提醒他一下。
这种情况不是个案。公开资料里反复出现的几个数字:
- 中国心智障碍群体规模约 1200 万
- 这一群体的就业率不足 5%
- 专业就业支持员资源稀缺,一个支持员通常对接十几甚至几十个就业者
现实里的困境大致是这样一个循环:雇主担心"没人看着会出事",不敢聘用;好不容易上岗,支持员没法时时刻刻在身边;压力和过载在无声处累积,当事人自己没意识到;某一刻"突然崩溃",在雇主眼里就是不稳定,于是辞退;然后下一次就业更难。
现有方案及不足
| 方案 | 实际感受 |
|---|---|
| 专业就业支持员 | 真正有效,但资源稀缺,无法 1v1 常驻 |
| 定时休息闹钟、番茄钟 | 和当事人真实状态脱钩——不累的时候吵人,真累的时候还没到点 |
| 通用情绪识别 SDK | 多数为"情绪分类"(开心、难过、愤怒等),而心智障碍者很多是述情障碍,没有明显情绪表情 |
| 家属、同事口头提醒 | 依赖人在场,也依赖当事人愿意暴露状态,隐私和尊严成本高 |
共同的缺口是同一个:没有一个不依赖人力、不暴露状态、能在过载前主动轻提醒的工具。
为什么这个群体的压力更难被看见
这一节想认真回答一个问题:对心智障碍就业者来说,"压力积累"为什么会变成一个特别棘手的问题?公开的临床文献和就业支持手册里,这件事有几条相对共识的解释:
1. 述情障碍(Alexithymia)
“述情障碍"指的是"识别、理解、用语言表达自己情绪的能力受损”。这不是心智障碍者独有的现象,但在孤独症谱系人群中,述情障碍的共病率远高于普通人群——不同研究给出的数字差异较大,较常见的区间是 40%–60%。
它导致的直接结果是:当事人自己可能体感已经不适了,却说不清是哪里不对,也说不出"我快撑不住了"这句话。外界看到的只是突然的沉默、走开、或某一刻的爆发——所谓"无故",其实只是信号没有被翻译出来而已。
2. 感官处理差异(Sensory Processing)
孤独症谱系、感统失调、部分精神障碍康复者中,常见感官输入阈值异常——对声音、光照、触感、人群密度的耐受度比普通人窄得多。普通办公室里"背景噪音"“同事经过”"空调声"这类对多数人可忽略的刺激,对他们可能是持续消耗。
感官过载的累积过程很安静:当事人通常不会抱怨,但会慢慢变僵、变冷、变得不再回应,直到某个临界点——而那个临界点对外部看起来几乎毫无预兆。
3. 执行功能与切换成本
轻度智力障碍和部分孤独症谱系者的执行功能(task switching、working memory、inhibition control)通常偏弱。这意味着:
- 被临时打断,恢复原任务需要更长时间
- 指令一变,需要重新理解整个流程
- 多步骤任务容易在某一步卡住,自己无法跳过
当场景叠加(催促 + 指令变化 + 人声干扰),他们不是"不想做",是认知负荷瞬间爆表。外部看到的是"僵在那儿",内部是一场他们自己也控制不了的风暴。
这三件事合在一起意味着什么
意味着对这个群体来说,岗位上的"崩溃"几乎不会有明显的情绪预警——因为他们自己可能都没法用语言定位自己的状态。传统的"察言观色""情绪识别 API"在这类场景下基本失灵。
真正能被捕捉的,只剩下身体最底层、最诚实的那一层反应:眉间肌肉的紧绷、眼轮匝肌的收缩、唇部肌群的抿紧、整张脸的僵硬度。这就是 BanBan 为什么只抓"压力线索"而不抓"情绪类别"的根本原因——不是技术偷懒,是这个群体真实的样子就是这样。
这件事国内有人做过吗?——市场与现有产品调研
做这个项目前,我系统梳理了国内现有的心智障碍支持与就业辅助产品,大致分四类:
| 类别 | 代表产品 | 做的是什么 | 缺口 |
|---|---|---|---|
| 行为干预 / ABA 训练平台 | ALSOLIFE、大米和小米、恩启 | 面向家长、康复师,基于 ABA 应用行为分析做能力评估和训练课程 | 重心在"康复训练"环节,几乎不覆盖"已就业者在岗位中的实时支持" |
| 孤独症标准化评估量表 | PEP-3、M-CHAT、ABC 量表(线上化版本) | 结构化评估儿童的发展阶段与能力维度 | 针对学龄前与学龄期儿童,不是为成年就业者设计的 |
| 公益资源平台 | 暖星社区、星宝自闭症网 | 家长互助、政策信息、康复资源 | 以社区和信息为主,不提供就业场景中的工具 |
| 通用情绪识别 / 番茄钟 App | Apple Face ID 情绪识别、Forest、番茄 Todo | 面向大众做情绪分类或时间管理 | 不考虑心智障碍群体的特殊性,对述情障碍人群几乎无效 |
这里面有一个明显的空白:“就业后、岗位中、实时的、不依赖人力的、不暴露状态的压力支持工具”——几乎没有。
这也能和公开数据对得上:中国残疾人联合会发布的《残疾人事业统计年鉴》多次提到,心智障碍群体的就业稳定率低于其他障碍类别,就业支持员资源严重不足。公益机构(如晓更基金会、融爱融乐、慧灵)的实践手册中,"岗位中的情绪支持和即时干预"被反复列为支持员最耗时、最难覆盖的环节。
换句话说,这个缺口是真实的,不是我拍脑袋造出来的。
BanBan 在这个版图里的位置
就业者在岗位上、没有人陪伴、压力在悄悄升高的那个瞬间。
这个瞬间以前要靠支持员、靠同事、靠运气。BanBan 想做的,是把这个瞬间稳定地交给一只桌面上的小动物。
类型:macOS 桌面应用(Electron + 本地 Python 后端)
一句话:一只陪你工作的桌面宠物,在你快撑不住的时候举牌提醒你停一下。
针对前面的痛点,BanBan 分别做了什么
不按功能 A、B、C 罗列,直接把问题和解法对齐给你看:
| 痛点 | BanBan 的解法 |
|---|---|
| 心智障碍者没有明显"情绪表情",传统情绪识别抓不到 | 不做情绪分类,只做压力线索识别。抓皱眉、眯眼、嘴唇紧绷、表情冻结这四类微表情——身体最先诚实做出来的反应 |
| 每个人平静时的表情基线不一样,绝对阈值容易误报 | 启动时做 10 秒个人平静基线校准,后续算相对变化,不再用统一阈值一刀切 |
| 过载是一个持续状态,不是一瞬间 | Electron 主进程跑一个状态机,压力持续 30 秒以上达到 60 才进入提醒态,提醒后 5 分钟冷却,避免频繁打扰 |
| 生硬弹窗对这类群体可能是二次刺激 | 换成桌宠举牌加气泡,黄牌到红牌,一句"先停一下嘛,喝口水,把思路捋一捋",像同事轻拍肩膀,不是警报 |
| 这类人群对隐私极度敏感,办公场合又涉及同事和机密文件 | 100% 本地,不联网不上传;Monitor 面板的预览图做过马赛克背景加主要人脸区域的处理,识别完即删 |
| 关掉摄像头就没用了,就变成一次性噱头 | 关掉摄像头它也还是一只桌宠,可以拖、可以点,待机时像呼吸一样浮动 |
三种状态一眼看懂
正常陪伴 → 黄牌提醒 → 红牌提醒:BanBan 的三种状态
- 正常陪伴(stress < 50):安静待在屏幕一角,呼吸式浮动,偶尔点头
- 黄牌提醒(stress 50~75 持续 30 秒):举起黄牌,轻度警示
- 红牌提醒(stress ≥ 75):举起红牌并弹出气泡——“先停一下嘛,喝口水,把思路捋一捋。”
Monitor 面板:让使用者自己也能看懂
Monitor 面板:个人基线校准、压力线索信号条、隐私预览
Monitor 是一个可选的侧边面板,展示几样东西:
- 当前压力分数(0–100)和状态
- 四类压力线索的实时信号条
- 校准状态(未开始、校准中、已完成)
- 隐私预览:马赛克背景加主要人脸区域,让使用者确认摄像头选对了、自己在画面里,但不露同事或屏幕内容
- 摄像头状态、后端状态、最新样本时间
这部分挺重要的——很多心智障碍者本身就对"看不见的监控"非常警觉。Monitor 让一切可见、可确认、可自己关。
技术选型
| 层 | 选型 | 为什么 |
|---|---|---|
| 后端 | Python 3 + MediaPipe FaceLandmarker + OpenCV | 本地跑;blendshapes 直出微表情系数,不需要自己训练 |
| 桥接 | 本地 JSON 文件(/tmp/banban_stress.json)+ 隐私预览图 |
解耦后端和前端,一方挂掉另一方不受影响 |
| 状态机 | Electron 主进程 | 统一管窗口、轮询、冷却逻辑 |
| 桌宠 | HTML + Canvas + 逐帧 spritesheet | 拖拽、点击、呼吸动画都更自然 |
| 隐私 | 所有临时文件退出即清理,不写持久日志 | 对齐"识别即删"的承诺 |
用 SOLO 实现的过程
我不是程序员,本职工作在完全另一条赛道。这次能做出 BanBan,是和 TRAE SOLO 结对搞出来的。整个过程我的心态其实挺简单:讲清背景和目标,剩下的一起推。
从像素小猫到 SVG 浣熊再到现在的 BanBan:三代形象演进
任务拆解
把黑客松命题拆成 5 个阶段,每段让 SOLO 独立完成,我来验证:
| 阶段 | 产出 |
|---|---|
| 把心智障碍群体就业场景的调研材料喂给 SOLO,一起讨论"压力线索识别"这个切入点,敲定不做情绪分类 | |
| Python + MediaPipe FaceLandmarker,提取 blendshapes 映射成四类压力信号,写入本地 JSON | |
| 轮询 JSON,维护 idle / alert / cooldown 三个状态,驱动桌宠 UI,管理 Monitor 面板 | |
| 从纯 SVG 小团子换成 AI 生图帧,再做成逐帧 spritesheet 合成动画 | |
| 引入个人平静基线、Monitor 预览图马赛克处理、临时文件清理 |
用到的 SOLO 能力
- 多轮对话理解需求:我不会用一段精心设计的 prompt 把产品一次性描述清楚,全程都是"讲现状、讨论、调整、继续讲"。SOLO 能稳定承接上下文,我不用每次重新铺背景。
- 跨语言跨层联调:同一轮对话里同时改 Python 后端、Electron 主进程、HTML / Canvas 前端、本地 JSON 桥接协议,不用手工切项目。
- 自动化调试:遇到问题直接让 SOLO 读日志、改代码、重启验证,我不用逐行理解每一个 bug。
- 素材落地:AI 生成的角色图片帧切成 spritesheet、写动画状态机、接进真实窗口——这种算不上算法但很繁琐的活,SOLO 处理得比我自己来快得多。
几个有代表性的 Prompt
Prompt 1:方向共创
“我要参加一个黑客松比赛,面向心智障碍群体就业支持。这个群体很多人是述情障碍,没有明显喜怒哀乐,传统情绪识别抓不到。我们讨论一下到底识别什么、怎么识别。”
SOLO 建议:不做情绪分类,做压力线索识别。用 MediaPipe blendshapes 抓皱眉、眯眼、嘴唇紧绷、表情冻结这几类微表情,映射成 0–100 压力分。
Prompt 2:换技术路线
“原本用 SVG 代码直接画桌宠,但效果太僵。我刚看到有人用’先生图再逐帧合成动画’的做法,你觉得可行吗?我俩都没做过。”
SOLO 说可以试,然后自己把 AI 生成的帧切好、排好 spritesheet、写好动画状态切换。我只负责生图。
Prompt 3:解决压力识别误判
“我平静坐着就 60 分了,稍微皱下眉就报警。这不行,区间太小了。”
SOLO 提了一个关键设计:每个人平静时表情本来就不一样,用绝对阈值不公平。在启动时做 10 秒基线校准,后续按相对变化算分。这个改动把精度从"勉强能用"推到"可以交作业"。
真实踩过的坑
| # | 问题 | 解决 |
|---|---|---|
| 1 | 压力识别误判率高——平静状态 60 分,皱一下眉就警报,区间太窄 | 引入 10 秒个人平静基线校准,算相对差值而非绝对阈值 |
| 2 | 桌宠 UI 做得太僵——SVG 代码画的团子缺乏生动感 | 改用 AI 生图加逐帧 spritesheet 合成动画,角色表现力上来了 |
| 3 | 提醒太频繁让人烦——压力一过阈值就弹,反而变成新的压力源 | 加入 30 秒持续阈值加 5 分钟冷却,状态机保证一个完整周期只提醒一次 |
| 4 | 隐私预览太真——原本 Monitor 显示的预览图直接是摄像头原图,同事和屏幕全露 | 改为马赛克背景加主要人脸区域,只保留"我看见了自己"的确认感 |
| 5 | 退出时临时文件没清——/tmp/banban_stress.json 和预览图会残留 |
Electron 退出钩子统一清理,不写持久日志 |
这几个坑看起来是技术问题,实际上每一个都是在回答同一个问题:这个工具到底替谁做决定?
成果展示
GitHub 仓库
https://github.com/YUHAO-corn/banban-desktop-pet
启动方式(macOS)
# 安装依赖
pip3 install mediapipe opencv-python
cd electron && npm install
# 启动(Electron 会自动拉起 Python 后端)
npm start
首次启动时 macOS 会询问摄像头权限,允许后即用。所有数据本地处理,不联网、不上传、识别即删。
关键体验
| 场景 | 你会看到 |
|---|---|
| 首次启动 | 10 秒基线校准倒计时,建议保持平常的工作表情 |
| 正常工作 | BanBan 安静陪你,呼吸式浮动,偶尔点头 |
| 压力上升 | 黄牌竖起,轻度警示,不打扰 |
| 过载 | 红牌加气泡:“先停一下嘛,喝口水,把思路捋一捋” |
| 关掉摄像头 | 识别停止,但 BanBan 依然可以拖拽、点击、陪着你 |
| 打开 Monitor | 看到压力分数、四类线索信号、校准状态、隐私预览 |
验证方式与下一步
已完成的验证
| 类型 | 内容 |
|---|---|
| 端到端闭环 | 摄像头到 MediaPipe 到压力计算到 JSON 到 Electron 状态机到桌宠 UI 到气泡提醒,完整跑通 |
| 基线校准有效性 | 自己对比校准前后:平静状态误报从"稍皱眉即警报"降到"持续绷紧 30 秒才警报" |
| 长时使用 | 我自己连续用了几个工作日。它举黄牌的那一刻,我几乎每次都是真的在硬撑,比我自己觉察得早 |
| 隐私模型 | 退出应用后 /tmp/banban_stress.json 和预览图都被清理,不留本地持久数据 |
还没做完、接下来想做的
- 邀请真实的就业支持员、特教老师试用,用他们的视角评估是不是真的在帮到就业者
- 适配 Windows(目前只在 macOS 跑通)
- 压力趋势记录——可选地给使用者看"今天你绷了几小时",帮助自我觉察
- 和心智障碍公益机构对接,看看能否在社区日间照料、庇护工场这类场景做小规模试用
诚实说一下目前的局限
- 压力识别在侧脸、强光、戴眼镜反光的情况下精度会下降
- 目前气泡只有一句,多样化和对不同人群的适配还没做
- 这是一个原型,不是医疗产品,不替代医生、心理咨询师、专业就业支持员
一点感受
做这个项目之前,我对"压力在心智障碍就业者身上怎么一点点积累"这件事,其实只有书面上的理解。做完这轮调研、看完那些纪录片、亲手把这只桌宠做出来之后,我比以前更清楚一件事:
对这类群体来说,最难的不是做事,是没人在那一刻轻轻提醒他们一下。
BanBan 替代不了一个活生生的就业支持员。但如果它能在一个支持员顾不过来的时刻、在一个没有家属陪伴的工位上,替他们看出"这个人绷了太久了",那已经够了。
顺便也希望这只小东西能提醒到正在看这篇帖子的你:今天如果累了,就先停一下。
感谢 TRAE SOLO 和公益赛道
作为一个非技术背景的人,如果没有 SOLO 这种"讲清楚你要什么,剩下的一起推"的协作方式,我大概率做不出这个东西。
这次让我有了一个正当的理由,把以前做社工时候放在心上、但一直没机会动手的事,真的做出来一个雏形。
欢迎评论区聊聊:
- 你会不会也是那个"看起来没事、但其实在硬撑"的人?
- 如果你自己是心智障碍者的家属、同事、雇主,非常衷心希望你能提供建议,你觉得这只桌宠要怎么改,才能真的在你那个场景里用得上?


