情绪感知

更新时间:2025-04-25 10:43:28下载pdf

概述

情绪感知技术是人工智能领域的一个关键挑战,它旨在通过和用户交互,自动检测和识别人类的情绪状态,如快乐、悲伤、愤怒等。准确的情绪识别可以帮助系统做出更加恰当的响应,提高用户体验。

Wukong AI 硬件开发框架支持情绪感知技术,开发者可以获取每次交互的情绪,并根据情绪的类型,实现一些自定义的表情、动作等,以提高交互体验和实现一些特殊的功能。

功能描述

情绪作为一种 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) {
        // detect emo
        // TBD...
    } 

    return OPRT_OK;
}

STATIC OPERATE_RET _ai_agent_txt_cb(AI_TEXT_TYPE_E type, CHAR_T *data, INT_T len)
{
    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");
        _parse_skill(node);
    }

    ty_cJSON_Delete(json);
    return OPRT_OK;
}

STATIC OPERATE_RET __ai_demo_init(VOID)
{
    OPERATE_RET rt = OPRT_OK;
    AI_AGENT_CFG_T ai_agent_cfg = {0};
    ai_agent_cfg.biz_code = TY_BIZCODE_AI_CHAT,
    ai_agent_cfg.output.text_cb = _ai_agent_txt_cb;
    TUYA_CALL_ERR_RETURN(tuya_ai_agent_init(&ai_agent_cfg));
    return rt;
}
STATIC OPERATE_RET __ai_demo_text_input(VOID)
{
    tuya_ai_input_start();
    tuya_ai_text_input("考试又没及格!", strlen("考试又没及格!"));
    tuya_ai_input_stop();
}

支持与帮助

在开发过程遇到问题,可以到 TuyaOS 开发者论坛 联网单品开发版块 发帖咨询。