更新时间:2025-04-15 09:51:05下载pdf
情绪感知技术是人工智能领域的一个关键挑战,它旨在通过和用户交互,自动检测和识别人类的情绪状态,如快乐、悲伤、愤怒等。准确的情绪识别可以帮助系统做出更加恰当的响应,提高用户体验。
Wukong AI 硬件开发框架支持情绪感知技术,开发者可以获取每次交互的情绪,并根据情绪的类型,实现一些自定义的表情、动作等,以提高交互体验和实现一些特殊的功能。
Wukong AI 硬件开发框架将情绪信息通过文字的形式下发,因此只要在发起 Session 的时候,注册文字处理的回调函数,即可接收到情绪信息。此处仅列出函数的关键部分,其他请参考 tuyaos_demo_ai_audio
中此函数的实现。
STATIC OPERATE_RET _ty_ai_chat_session_create(VOID)
{
OPERATE_RET rt = OPRT_OK;
AI_SESSION_CFG_T cfg;
memset(&cfg, 0, sizeof(AI_SESSION_CFG_T));
...
cfg.recv[0].id = TY_AI_CHAT_ID_US_TEXT;
cfg.recv[0].cb = _ty_ai_chat_txt_recv;
...
return OPRT_OK;
}
文字信息中会包含众多bizType
。 其中bizType="SKILL"
的文字信息包含了模型返回的情绪内容。
STATIC OPERATE_RET _ty_ai_chat_txt_recv(AI_BIZ_ATTR_INFO_T *attr, AI_BIZ_HEAD_INFO_T *head, CHAR_T *data, VOID *usr_data)
{
ty_cJSON *json, *node;
// {"bizId":"asr-1741763201372","bizType":"ASR","eof":1,"data":{"text":"这是ASR文本!"}}
// {"bizId":"nlg-1741763173046","bizType":"NLG","eof":0,"data":{"content":"这是NLG响应文本!","appendMode":"append","finish":false}}
// {"bizId":"skill-........emo","bizType":"SKILL","eof":1,"data":{"code":"emo","skillContent":{"emotion":["NEUTRAL"]}}}
if ((json = ty_cJSON_Parse(data)) == NULL) {
return OPRT_OK;
}
// parse bizType
node = ty_cJSON_GetObjectItem(json, "bizType");
const CHAR_T *bizType = ty_cJSON_GetStringValue(node);
// parse eof
node = ty_cJSON_GetObjectItem(json, "eof");
BOOL_T eof = ty_cJSON_GetNumberValue(node);
// TAL_PR_DEBUG("bizType: %s, eof: %d", bizType, eof);
if (eof && strcmp(bizType, "ASR") == 0) {
node = ty_cJSON_GetObjectItem(json, "data");
_parse_asr(node);
} else if (strcmp(bizType, "NLG") == 0) {
node = ty_cJSON_GetObjectItem(json, "data");
_parse_nlg(node, eof);
} else if (eof && strcmp(bizType, "SKILL") == 0) {
node = ty_cJSON_GetObjectItem(json, "data");
TAL_PR_DEBUG("recv SKILL (%d): %*s",head->len, head->len, data);
_parse_skill(node);
}
ty_cJSON_Delete(json);
return OPRT_OK;
}
情绪作为一种 SKILL
,以 JSON
字符串的形式下发,具体 JSON
字符串的格式如下:
{"bizId":"skill-........emo","bizType":"SKILL","eof":1,"data":{"code":"emo","skillContent":{"emotion":["NEUTRAL"]}}}
解析到对应的情绪之后,需要将情绪分发给外部具体的业务处理模块。
STATIC OPERATE_RET _parse_skill(ty_cJSON *skill)
{
ty_cJSON *node, *skill_content;
const CHAR_T *code;
// parse code
node = ty_cJSON_GetObjectItem(skill, "code");
code = ty_cJSON_GetStringValue(node);
if (!code)
return OPRT_OK;
TAL_PR_DEBUG("skill code: %s", code);
skill_content = ty_cJSON_GetObjectItem(skill, "skillContent");
if (s_chat_cbc.tuya_ai_chat_custom) {
s_chat_cbc.tuya_ai_chat_custom(code, skill_content, s_chat_cbc.user_data);
}
if (strcmp(code, "emo") == 0) {
TUYA_AI_CHAT_EMO_T *emo = NULL;
if (tuya_ai_chat_parse_emo(skill_content, &emo) == OPRT_OK) {
if (s_chat_cbc.tuya_ai_chat_play_emo) {
s_chat_cbc.tuya_ai_chat_play_emo(emo, s_chat_cbc.user_data);
}
tuya_ai_chat_parse_emo_free(emo);
}
} else if (strcmp(code, "music") == 0) {
TUYA_AI_CHAT_MUSIC_T *music = NULL;
if (tuya_ai_chat_parse_music(skill_content, &music) == OPRT_OK) {
if (s_chat_cbc.tuya_ai_chat_play_music) {
s_chat_cbc.tuya_ai_chat_play_music(music, s_chat_cbc.user_data);
}
tuya_ai_chat_parse_music_free(music);
}
}
return OPRT_OK;
}
一般接收到模型返回的情绪,可以通过表情、动作来表达,这些表达方式,用户可以自行定义。
在开发过程遇到问题,可以到 TuyaOS 开发者论坛 联网单品开发版块 发帖咨询。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈