情绪感知

更新时间: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;
}

识别 SKILL

文字信息中会包含众多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 开发者论坛 联网单品开发版块 发帖咨询。