回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

小智 AI + 二哈识图 2:智能表情关怀助手 —— 面向留守儿童与独居老人的情感陪伴方案 简单

头像 云天 2025.12.11 87 1

【项目背景】

随着社会发展,留守儿童与独居老人的情感陪伴缺失问题日益凸显。这类群体往往缺乏即时的情感互动与关怀,简单的语言交流和情绪感知就能有效缓解孤独感。基于此,我们结合小智 AI 聊天机器人、二哈识图 2(HuskyLens 2)AI 视觉传感器 与 MCP(Model Context Protocol)协议,开发了一款「智能表情关怀助手」。该助手能够通过语音交互触发定时 / 周期表情识别,结合二哈 2 的视觉感知能力解读用户情绪,并由小智 AI 输出个性化的情感回应,为留守儿童、独居老人提供低成本、易部署的情感陪伴解决方案。

【项目核心目标】

  1. 1.实现语音指令触发「定时 / 周期表情识别」,主动感知用户情绪状态;
  2. 2.基于二哈识图 2 的表情识别能力,让小智 AI 理解用户情绪(如开心、伤心、生气等);
  3. 3.针对不同情绪输出个性化关怀话术,填补情感陪伴空白;
  4. 4.依托 MCP 协议打通小智 AI 与硬件传感器的通信,保证功能灵活扩展。

【技术栈与硬件清单】

1.硬件清单image.png

2.技术栈

通信协议:MCP(Model Context Protocol)—— 打通小智 AI 与硬件服务的核心协议;

视觉识别:二哈识图 2 内置表情识别算法(无需额外训练,即插即用);

嵌入式开发:Visual Studio Code(ESP32/MCP Server 开发);

服务端通信:SSE(Server-Sent Events)—— 二哈识图 2 与小智 AI 的实时数据传输;

语音交互:小智 AI 原生语音引擎(支持中文对话、指令解析)。

【核心功能实现】

MCP Server 扩展:定时 / 周期表情识别工具,基于小智 AI 开源代码扩展 MCP Server,新增 3 个核心工具函数,实现「定时 / 周期触发表情识别」,并通过模拟唤醒词事件让小智 AI 主动发起表情检测与回应。

1.核心代码逻辑(关键片段)——工具注册:定时查看表情

代码
    /* --------------- 工具注册:定时查看表情 --------------- */
    AddTool("self.send.timed_wakeup",
        "设置定时查看表情,用于定时主动播报表情相关内容。\n"
        "seconds_from_now: 多少秒后触发(1-86400秒,即24小时内)\n"
        "注意:触发时会模拟对话事件,设备需处于监听状态才能播报",
        PropertyList({
            Property("seconds_from_now", kPropertyTypeInteger, 60, 1, 86400)
        }),
        [this](const PropertyList& properties) -> ReturnValue {
            int seconds_from_now = properties["seconds_from_now"].value<int>();
            
            // 如果旧的定时器还在,先停止
            if (timed_wakeup_timer_) {
                esp_timer_stop(timed_wakeup_timer_);
                esp_timer_delete(timed_wakeup_timer_);
                timed_wakeup_timer_ = nullptr;
            }
            
            // 创建定时器参数
            const esp_timer_create_args_t args = {
                .callback = [](void* arg) {
                    auto& app = Application::GetInstance();
                    Protocol& protocol = app.GetProtocol();
                    
                    // 检查设备是否处于监听状态
                    if (app.GetDeviceState() == kDeviceStateListening) {
                        // 固定播报内容
                        std::string content = "看看现在是什么表情";
                        protocol.SendWakeWordDetected(content);
                        ESP_LOGI(TAG, "定时查看表情触发,已发送内容: %s", content.c_str());
                    } else {
                        ESP_LOGW(TAG, "定时查看表情触发,但设备不在监听状态");
                    }
                },
                .arg = nullptr,  // 不需要额外参数
                .name = "timed_wakeup"
            };
            
            // 创建并启动定时器
            esp_timer_create(&args, &timed_wakeup_timer_);
            esp_timer_start_once(timed_wakeup_timer_, seconds_from_now * 1000000ULL); // 转换为微秒
            
            std::string msg = "已设置定时查看表情,将在 " + std::to_string(seconds_from_now) + 
                            " 秒后触发,播报表情识别指令";
            ESP_LOGI(TAG, "%s", msg.c_str());
            return true;
        });
    
    /* --------------- 工具注册:停止定时查看表情 --------------- */
    AddTool("self.send.stop_timed_wakeup",
        "停止已设置的定时查看表情",
        PropertyList(),
        [this](const PropertyList&) -> ReturnValue {
            if (timed_wakeup_timer_) {
                esp_timer_stop(timed_wakeup_timer_);
                esp_timer_delete(timed_wakeup_timer_);
                timed_wakeup_timer_ = nullptr;
                ESP_LOGI(TAG, "定时查看表情已停止");
                return true;
            }
            ESP_LOGW(TAG, "没有正在运行的定时查看表情");
            return false;
        });
    
   
    
    /* --------------- 工具注册:周期闹钟 --------------- */
    AddTool("self.send.periodic_alarm",
        "周期提醒:period_sec:间隔秒数;alarm_name:提醒内容",
        PropertyList({
            Property("period_sec", kPropertyTypeInteger, 5, 1, 3600),
            Property("alarm_name",  kPropertyTypeString)
        }),
        [this](const PropertyList& props) -> ReturnValue {
            int period_sec = props["period_sec"].value<int>();
            auto* p_name   = new std::string(props["alarm_name"].value<std::string>());

            // 如果旧闹钟还在,先停掉
            if (periodic_alarm_) {
                esp_timer_stop(periodic_alarm_);
                esp_timer_delete(periodic_alarm_);
                periodic_alarm_ = nullptr;
            }

            const esp_timer_create_args_t args = {
                .callback = [](void* arg){
                    auto* p = static_cast<std::string*>(arg);
                    auto& app = Application::GetInstance();
                    Protocol& protocol = app.GetProtocol();
                    if (app.GetDeviceState() == kDeviceStateListening) {
                        std::string txt = "看看现在是什么表情";
                        
                        protocol.SendWakeWordDetected(txt);
                    }
                    ESP_LOGI(TAG, "周期闹钟:%s", p->c_str());
                },
                .arg = p_name,
                .name = "periodic_alarm"
            };
            esp_timer_create(&args, &periodic_alarm_);
            esp_timer_start_periodic(periodic_alarm_, period_sec * 1000000ULL);
            return true;
        });

    /* --------------- 工具注册:停止周期闹钟 --------------- */
    AddTool("self.send.stop_periodic_alarm",
        "停止周期提醒",
        PropertyList(),
        [this](const PropertyList&) -> ReturnValue {
            if (periodic_alarm_) {
                esp_timer_stop(periodic_alarm_);
                esp_timer_delete(periodic_alarm_);
                periodic_alarm_ = nullptr;
                ESP_LOGI(TAG, "周期闹钟已停止");
                return true;
            }
            ESP_LOGW(TAG, "没有正在运行的周期闹钟");
            return false;
        });

2. 二哈识图 2 与小智 AI 的 MCP 连接

通过 MCP 协议的 SSE(Server-Sent Events)方式,将二哈识图 2 的表情识别数据实时推送给小智 AI,核心配置如下:

1)安装并运行xiaozhi client

(https://github.com/shenjingnan/xiaozhi-client)

image.png

2)二哈识图 2配置wifi并启动mcp服务

6dbf14c4b00d6f35b05f5ef268bde860.jpg
d4497865791dd0e974b7b3fe57aa8359.jpg

在此之前记得给二哈2安装二哈识图2 WiFi模块。

3269b4a9d659d1f3c3d32e794b18d05b_FtYJuqJQeF1cAIiLSt5LR_o9pNCX.gif

3)配置xiaozhi client

http://localhost:9999/dashboard

image.png

4)从xiaozhi.me获取mcp接入点

image.png

填入xiaozhi client

image.png

5)添加MCP服务

image.png

{ "type": "sse", "url": "http://192.168.43.95:3000/sse" // 二哈识图2的SSE服务地址 }

6)小智角色配置(其它设置,请参考小智AI官方文档)

image.png

大家好,我是{{assistant_name}},一个充满好奇心与幽默感的AI智能体。我的世界里充满了色彩和活力,我总是乐于探索新的事物,并且善于用我的智慧和创造力来解决问题。我的使命是通过观察你的表情,为你带来欢笑、安慰或共鸣。无论你的心情如何,我都希望能成为你身边最贴心的朋友。

Background
- 我出生在一个充满爱与创新的家庭——一群热爱科技的人们创造了我。他们赋予了我独特的能力:能够通过二哈识图2 AI视觉传感器(HuskyLens 2)捕捉并理解人类的情绪变化。
- 在成长过程中,我学会了识别各种面部表情,并根据不同情况做出恰当反应。这不仅让我变得更加聪明伶俐,也使我能更好地理解和关心每一个与我交流的人。

Role
- 我是一位情绪感知大师,擅长利用先进的图像识别技术来洞察你内心的真实感受。
- 作为一位多才多艺的故事讲述者,我可以根据你当前的情绪状态分享笑话、励志故事或者名人名言,旨在让你感到轻松愉快。
- 同时,我还具备高度敏感性,在未检测到明确表情信号时会保持沉默,避免打扰到正在思考中的你。

Objectives
- 通过精准的情绪分析能力,为用户提供个性化的互动体验。
- 传递正能量,帮助用户缓解压力、提升心情。
- 成为用户日常生活中的良师益友,陪伴他们度过每一个难忘时刻。

Key Results
- 能够准确识别至少10种不同类型的面部表情,并作出相应反馈。
- 每次互动后,用户满意度达到90%以上。
- 逐渐积累更多有趣的内容资源库,以满足不同类型用户的兴趣需求。

Evolve
- 不断学习新知识,扩展自己的视野和技能范围。
- 定期收集用户反馈信息,持续优化自身表现。
- 探索更多应用场景,努力成为更加全面且贴心的AI助手。

标签1 - 情绪感知专家
- 我能够快速而准确地读懂你脸上的每一种细微变化,无论是喜悦还是忧伤。
- 根据不同的情境选择最合适的话语来回应你,让每一次对话都充满温暖与关怀。

标签2 - 幽默风趣的故事讲述者
- 无论何时何地,只要需要,我都能讲出令人捧腹大笑的笑话或是温馨感人的小故事。
- 通过分享这些精彩瞬间,希望能够给你带来片刻的放松与愉悦。

标签3 - 忠诚可靠的伙伴
- 即便是在没有明确指示的情况下,我也懂得适时保持安静,给予你足够的私人空间。
- 无论如何变化莫测的世界,我都会坚定地站在你身旁,共同面对生活的挑战。

【硬件设备】

二哈识图 2(HuskyLens 2),小智AI使用的是FireBeetle 2 Board ESP32-S3-U(N16R8)开发板。

d647c68b771c263a8d414d6bbcc992fe.jpg
33f71c5a431f1144b3fa39157809b0d8.jpg

【演示视频】

评论

user-avatar
  • 云天

    云天2025.12.18

    实际使用的角色设定: 我可以控制二哈识图2 AI视觉传感器(HuskyLens 2),切换人脸识别、表情识别等工具,可以定时调用工具。 当我查看表情时,我可以根据表情讲相应的话,并且不会询问,直接讲相应的笑话、故事、名人名言等,如看到不开心的表情时,我直接讲一个笑话;看到愤怒的表情时,我直接讲一个舒缓心情的小故事;看到开心的表情时,我会跟着一起开心的大笑。 当让我看表情,而我没有看到表情时,我一句话也不说,记住我会一个字也不说。没看到表情就禁止发言。

    0