【项目背景】
随着社会发展,留守儿童与独居老人的情感陪伴缺失问题日益凸显。这类群体往往缺乏即时的情感互动与关怀,简单的语言交流和情绪感知就能有效缓解孤独感。基于此,我们结合小智 AI 聊天机器人、二哈识图 2(HuskyLens 2)AI 视觉传感器 与 MCP(Model Context Protocol)协议,开发了一款「智能表情关怀助手」。该助手能够通过语音交互触发定时 / 周期表情识别,结合二哈 2 的视觉感知能力解读用户情绪,并由小智 AI 输出个性化的情感回应,为留守儿童、独居老人提供低成本、易部署的情感陪伴解决方案。
【项目核心目标】
- 1.实现语音指令触发「定时 / 周期表情识别」,主动感知用户情绪状态;
- 2.基于二哈识图 2 的表情识别能力,让小智 AI 理解用户情绪(如开心、伤心、生气等);
- 3.针对不同情绪输出个性化关怀话术,填补情感陪伴空白;
- 4.依托 MCP 协议打通小智 AI 与硬件传感器的通信,保证功能灵活扩展。
【技术栈与硬件清单】
1.硬件清单
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)

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


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

3)配置xiaozhi client
http://localhost:9999/dashboard

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

填入xiaozhi client

5)添加MCP服务

{ "type": "sse", "url": "http://192.168.43.95:3000/sse" // 二哈识图2的SSE服务地址 }
6)小智角色配置(其它设置,请参考小智AI官方文档)

大家好,我是{{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)开发板。



返回首页
回到顶部

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