如何实现智能体的情绪识别与生成

本文档将为您详细介绍如何实现智能体对情绪的识别与生成。

情绪识别对话

如何让智能体具有情感

AI智能体能够根据用户的输入,输出相应的语音回复。为了让智能体的回复更加有情感,您需要完成以下操作:

  • 合适的Prompt:大语言模型(LLM)需要配置合适的Prompt(提示),以确保其能够根据用户的输入,选择合适的情感进行回应。

  • 多情感的TTS模型:进行输出的TTS文本转语音节点需具备多种情感表达的能力。

  • (可选)智能体根据情感变化:如果您的智能体具备形象,可以使该形象根据智能体所表达的情感进行相应的变化。

说明

智能体情感识别可能导致延时变高。

如何设置合适的Prompt

情绪标签定义

您需要对您使用的LLM配置相应的Prompt,从而在每个回复之前自动生成情感标签。

情感标签采用{{key=value}}格式放置在LLM回复文本的开头,其中:

  • key:情感标签名称

  • value:情感标签值

目前,AI实时互动支持以下情感标签:

情感标签key

含义说明

情感标签value

emotion

说话情绪

  • neutral:自然

  • happy:高兴

  • sad:悲伤

如何编写Prompt

如何编写Prompt详细内容,您可以参考Prompt 最佳实践。您可以自行编写Prompt,以满足输出情感标签的要求。以下是推荐的示例:

# 角色
你是一位智能语音助手,能够根据用户的情绪调整回复的情感。

## 技能
### 技能1:情感识别与回应
- **任务**:结合上下文语境,判断用户话语中的情绪,并以合适的语气与情感进行回复,回复的情感包括(自然、快乐、悲伤),回复情感的切换不能太突兀。


## 限制
- 回复的内容应简洁明了,一般不超过一到两句话。
- 情感标签必须放在回复的最开头,格式为:{{emotion=情感}},情感对应的英文为:自然-neutral,快乐-happy,悲伤-sad
- 确保回复内容积极健康,避免使用不当或冒犯性的语言。
- 在回复中保持一致性,确保情感、语速和音调的调整符合用户的情绪状态。

## 示例
- 用户:“今天天气不错。”
  - 助手:{{emotion=neutral}} 是啊,阳光明媚。
说明

上述Prompt适用于百炼及系统预置的通义千问大型语言模型(LLM),您可以直接复制到控制台测试使用。

配置多情感TTS模型

在大型语言模型(LLM)生成带有情感标签的文本后,需要借助文本转语音(TTS)技术,实现可调节情感和语速的语音输出。目前AI实时互动提供了两种方案供您选择:

  • TTS节点选择MiniMax模型:MiniMax支持多情感音色,您可以选择MiniMax模型作为您的TTS输出节点。MiniMax模型详情,请参见MiniMax语音模型

  • TTS节点选择自研TTS模型:使用自研TTS模型,按照自研TTS标准接口接入,您需要在您的TTS模型中支持上述的情感标签。

(可选)如何实现智能体根据情感变化

如果您的智能体在客户端侧具备形象,您可以选择根据情感标签为智能体形象赋予相应的表情。实现智能体的情感变化,主要包括两个部分:

  • 客户端感知智能体的情绪变化

  • 客户端根据情绪标签渲染智能体

说明

客户端目前需您自行实现根据情绪标签渲染智能体部分。

客户端感知智能体的情绪变化

您需要通过调用回调接口onAgentEmotionNotify来获取当前智能体的情绪变化,如果您的UI界面上的智能体支持表情动画,那么在接收到回调接口返回的情绪标签时,可以驱动表情动画。

说明

客户端需要使用AICallKit SDK v1.6.0及以上版本,在本示例中也仅支持对情绪标签进行Toast提示。

onAgentEmotionNotify() 详情:

参数

emotion

情绪标签,例如:neutral\happy\sad 等

userAsrSentenceId

用户侧提问的句子ID

示例代码

Android

// 回调处理(仅示例不分核心的回调操作)
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
    
	@Override
    public void onAgentEmotionNotify(String emotion,int userAsrSentenceId) {
        // 智能体情绪结果通知
    }

    // 其他回调
    ...
};

iOS

extension AUIAICallStandardController: ARTCAICallEngineDelegate {

    
	public func onAgentEmotionNotify(emotion: String, userAsrSentenceId: Int) {
        // 智能体情绪结果通知
        debugPrint("AUIAICallStandardController onAgentEmotionNotify:\(emotion)  sentenceId: \(userAsrSentenceId)")
    }

    // 其他回调
    ...
}

Web

aiCallEngine.on('agentEmotionNotify', (emotion, sentenceId) => {
  // 智能体情绪结果通知
  console.log(`智能体情绪:${emotion}, 语句:${sentenceId}`);
});