logo
当前页

AI主动说话:主动调用 LLM 或 TTS

大语言模型 ( LLM ) 本身并不支持主动输出,需要通过开发者基于一定规则主动触发智能体说话,从而提升实时互动中的沉浸感。例如当用户5s中没有说话,则让智能体主动通过文本转语音 ( TTS ) 说一句话等。

AI Agent 主动说话的方式:

  • 主动调用 LLM。本质上是模拟用户发起一条消息,从而实现基于上下文的智能体主动文字和语音输出。
  • 主动调用 TTS。直接让智能体用语音说一段文本内容,通常是固定模式话术,例如“你好呀,欢迎使用 ZEGO AI Agent 服务”。

AI智能体说话时,可以设置优先级,从而实现不同的效果,通过设置两个参数(非必填)

  • Priority(High、Medium、Low)。
  • SamePriorityOption(ClearAndInterupt、Enqueue)。
whiteboard_exported_image.png

前提条件

已参考快速开始完成基本流程。

使用方式

主动调用 LLM主动调用 TTS章节的说明包含所有相关参数,但是示例代码仅演示必选参数使用方式。

主动调用 LLM

您可以调用 SendAgentInstanceLLM 接口,主动让 LLM 输出文本和语音。

调用 SendAgentInstanceLLM 时 AI Agent 服务端会拼接一个上下文,这个上下文由 3 部分组成:

  • 放在最前面的是 SystemPrompt ,本次对话的临时智能体系统提示词。
  • 放在中间的是之前的对话记录,使用的对话记录数量由 WindowSize 决定。
  • 放在最后的部分是本接口中设置的 Text

调用本接口传入的文本信息不会记录在会话历史消息中,也不会通过 RTC 房间消息下发。但 LLM 生成的回复会被记录在会话历史消息中并且会通过 RTC 房间消息下发。

接口参数如下:

参数类型是否必选描述
AgentInstanceIdString智能体实例的唯一标识,通过 创建智能体实例 接口的响应参数获取。
TextString发送给 LLM 服务的文本内容。
SystemPromptString本次对话的临时智能体系统提示词。如果不填则使用注册智能体或者创建智能体实例时的 LLM 参数中的 SystemPrompt
AddQuestionToHistoryBoolean是否把问题加入到上下文。默认值为 false
AddAnswerToHistoryBoolean是否把答案加入到上下文。默认值为 false
PriorityString任务优先级,默认为 Medium
可选值:
1. Low:低优先级
2. Medium:中等优先级
3. High:高优先级
SamePriorityOptionString相同优先级时的打断策略,默认为 ClearAndInterrupt
可选值:
- ClearAndInterrupt:清空并打断
- Enqueue:排队等待,队列最大数量为 5

请求示例如下:

{
    "AgentInstanceId": "1907755175297171456",
    "Text": "今天天气怎么样?"
}

主动调用 TTS

您可以通过调用 SendAgentInstanceTTS 接口,主动让智能体用语音说一段文本内容。

调用本接口传入的文本消息,会根据 AddHistory 参数决定是否被记录在会话消息历史之中,作为上下文输入给 LLM,同时该消息还会通过 RTC 房间消息下发。

接口参数如下:

参数类型是否必选描述
AgentInstanceIdString智能体实例的唯一标识,通过 创建智能体实例 接口的响应参数获取。
TextString用于 TTS 的文本内容,最大不超过 300 个字符。
AddHistoryBoolean是否将文本消息记录在会话消息历史之中,作为上下文输入给 LLM。默认值为 true
PriorityString任务优先级,默认为 Medium
可选值:
1. Low:低优先级
2. Medium:中等优先级
3. High:高优先级
SamePriorityOptionString相同优先级时的打断策略,默认为 ClearAndInterrupt
可选值:
- ClearAndInterrupt:清空并打断
- Enqueue:排队等待,队列最大数量为 5

请求示例如下:

{
    "AgentInstanceId": "1907780504753553408",
    "Text": "你好呀,欢迎使用 ZEGO AI Agent 服务。"
}

场景调用示例

场景1:AI 播放欢迎语

希望在用户每次与 AI 开始语音或数字人对话时,AI 主动播报一句欢迎语。

  1. 确保用户已经拉到 Agent 实例的 RTC 流
// 创建引擎后设置事件处理器
engine.setEventHandler(new IZegoEventHandler() {
    @Override
    public void onPlayerStateUpdate(String streamID, ZegoPlayerState state,
                                  int errorCode, JSONObject extendedData) {
        super.onPlayerStateUpdate(streamID, state, errorCode, extendedData);
        if (errorCode != 0) {
            Log.d("Zego", "拉流状态出错: " + streamID);
            return;
        }
        // 监听拉流状态变化
        switch (state) {
            // !mark
            case PLAYING:
                Log.d("Zego", "拉流成功,可以调用接口播放欢迎语");
                break;
            case PLAY_REQUESTING:
                Log.d("Zego", "正在拉流: " + streamID);
                break;
            case NO_PLAY:
                Log.d("Zego", "拉流停止: " + streamID);
                break;
        }
    }
});
  1. 通过接口调用开始播放欢迎语,有以下两种实现方式:
  • SendAgentInstanceLLM: 结合上下文,让 LLM 结合上下文播放播放欢迎语。
{
    "AgentInstanceId": "1907755175297171456",
    "Text": "请说一句欢迎语"
}
  • SendAgentInstanceTTS: 使用固定话术让 AI 播放欢迎语。
{
    "AgentInstanceId": "1907755175297171456",
    "Text": "hello啊"
}
注意

若播放欢迎语时用户开始说话,则可以直接打断AI,并有概率导致AI无法播出欢迎语。若希望一定能让用户听到欢迎语,则可以设置:

  • Priority=High

以通过 SendAgentInstanceTTS 发欢迎语为例:

{
    "AgentInstanceId": "1907755175297171456",
    "Text": "hello啊",
    "Priority": "High"
}

场景2:冷场时,AI 主动发言可被用户说话打断

用户和 AI 都没有说话时,希望 AI 主动发起话题,同时希望若 AI 发言时用户说话则以用户说话内容为主,即 AI 播报能被用户说话打断。则可直接调用 SendAgentInstanceLLMSendAgentInstanceTTS 实现。

发起话题的内容方式有两种:

  • 结合上下文,让 LLM 结合上下文输出一次主动发言。 请求示例: 比如调用 SendAgentInstanceLLM 接口,text 为“现在用户一段时间没有说话了,请主动说一句话”
{
    "AgentInstanceId": "1907755175297171456",
    "Text": "现在用户一段时间没有说话了,请主动说一句话?",
    "Priority": "Medium"
}
  • 使用固定话术让 AI 说话。 请求示例: 比如调用 SendAgentInstanceTTS 接口,text 为“你怎么不说话啦?”
{
    "AgentInstanceId": "1907755175297171456",
    "Text": "你怎么不说话啦?",
    "Priority": "Medium"
}

场景3:触发关键节点,需要 AI 立刻播报并完成所有内容

例如,当发现已经到了 60s 的时间限制,不管此时用户和 AI 是否在说话,都需要立刻播报提醒用户。

此时除了配置 LLM 的提示词或 TTS 的内容外,需要额外配置:

  • Priority=High
  • SamePriorityOption=ClearAndInterrupt

请求示例: 比如调用 SendAgentInstanceTTS 接口,text 为“时间到了,请及时检查。”

{
    "AgentInstanceId": "1907755175297171456",
    "Text": "时间到了,请及时检查。",
    "Priority": "High",
    "SamePriorityOption": "ClearAndInterrupt"
}

场景4: AI 正在播报,需要在播报完当前内容之后,再播报额外内容

例如此时 AI 正在回复用户提问,希望在回答本次提问后,立刻让 AI 补充询问用户是否还有其他想法。

此时除了配置 LLM 的提示词或 TTS 的内容外,需要额外配置:

  • Priority=Medium
  • SamePriorityOption=Enqueue

请求示例: 比如调用 SendAgentInstanceTTS 接口,text 为“你有什么其他想法么?”

{
    "AgentInstanceId": "1907755175297171456",
    "Text": "你有什么其他想法么?",
    "Priority": "Medium",
    "SamePriorityOption": "Enqueue"
}

Previous

配置 TTS

Next

展示字幕