Skip to content

在智能眼镜等终端场景中,用户常常需要通过语音指令触发智能体,并上传图片以实现图片理解功能。这种多模态交互方式能够显著提升用户体验,尤其是在需要快速获取信息或进行复杂任务处理时。你可以选择基于对话 OpenAPI 或音视频通话来实现这一功能。 方式一:基于对话 OpenAPI 实现 步骤一:创建并发布智能体 创建单 Agent(自主规划模式)类型的智能体,选择豆包·视觉理解·Pro 模型或其他支持视觉理解的模型。调试后将智能体发布为 API。

步骤二:调用发起对话 API 实现多模态交互 实现方法 1. 调用上传文件 API,将图片和语音文件上传到扣子,并获取对应的 file_id。 2. 调用发起对话 API,在 messages 中同时传入图片和语音文件的 file_id。智能体将结合语音内容和图片内容进行联合理解,并返回对图片的理解结果。 示例代码 示例代码如下,完整的示例代码请参见 audio_chat_with_vision_image 示例项目源码。

将语音和图片上传到 coze

audio_file = coze.files.upload(file=audio_path)
image_file = coze.files.upload(file=image_path)

调用 /v3/chat 发起对话, 传入语音和图片的 file id

stream = coze.chat.stream(
    bot_id=bot_id,
    user_id=secrets.token_urlsafe(),
    additional_messages=[
        Message.build_user_question_objects(
            [
                MessageObjectString.build_image(file_id=image_file.id),
                MessageObjectString.build_audio(file_id=audio_file.id),
            ]
        )
    ],
)
print(f"对话开始 logid: {stream.response.logid}")

成功调用后,智能体将返回图片的理解结果,返回示例如下:

方式二:基于语音通话 SDK 步骤一:搭建对话流 1. 创建一个对话流,对话流的节点概览如下图所示,在对话流中添加大模型节点用于理解图片。

对话流中各节点的配置和参数如下表所示。

节点

参数配置

示例图

开始

开始节点添加一个类型为 image 的输入参数,参数名称可以自定义,但需与代码中一致,本文以 image 为例。

大模型

模型选择豆包·视觉理解·Pro 模型或其他支持视觉理解的模型。 输入参数:输入中添加 input 和 image变量,变量的值分别引用开始节点的 USER_INPUT 和 image。 系统提示词:使用以下示例 Markdown 信息,表示将用户输入的数据传入 LLM 进行处理。

用户输入: 图片:

结束

新增 output 输出参数,并在参数值区域选择引用大模型节点的 output 参数。

将智能体设置为单 Agent(对话流模式),在智能体中添加对话流,将智能体发布为 API。

步骤二:对话中发送音频和图片 通过 WebSocket 或 RTC 进行音视频通话时,通过上行事件中的 parameters 参数,将图片发送给对话流。本文以 WebSocket 为例介绍具体实现方法。 实现方法 1. 建立 WebSocket 连接时,在 URL 路径的 Query 参数中设置 bot_id。 2. 建立 WebSocket 连接后,发送 chat.update 上行事件,在 data.chat_config.parameters 参数中传入 image 输入参数的值,并传递给对话流,事件的详细说明请参见 双向流式对话上行事件。 3. 通过 WebSocket 与扣子智能体进行实时语音交互时,通过 input_audio_buffer.append 上行事件,流式上传音频数据,事件的详细说明请参见流式上传音频片段。 示例代码 示例代码如下,完整的示例代码请参见 websocket_chat.py 示例项目源码。

chat = coze.websockets.chat.create(
    bot_id=bot_id,
    on_event=WebsocketsChatEventHandler(),
)

# 建立 websocket 链接
async with chat() as client:
    print("建立 websocket 链接成功")
    # 发送 chat_flow 参数
    await client.chat_update(
        ChatUpdateEvent.Data.model_validate(
            {
                "chat_config": ChatUpdateEvent.ChatConfig.model_validate(
                    {
                        "parameters": {
                            "image": json.dumps(
                                {
                                    "file_id": image_file.id,
                                }
                            ),
                        }
                    }
                )
            }
        )
    )
    # 发送语音数据
    for delta in split_bytes_by_length(audio_data, 1024):
        await client.input_audio_buffer_append(
            InputAudioBufferAppendEvent.Data.model_validate(
                {
                    "delta": delta,
                }
            )
        )
        await asyncio.sleep(len(delta) * 1.0 / 24000 / 2)  # 模拟真实说话间隔
    await client.input_audio_buffer_complete()
    await client.wait()

成功建立连接并发送数据后,智能体将根据语音和图片内容返回相应的对话结果,返回示例如下: