实时多模态交互协议(WebSocket)

本文介绍实时多模态交互协议WebSocket API。WebSocket协议延迟低、资源占用少,是首选接入方案。

WebSocket是一种支持全双工通信的网络协议。客户端和服务器通过一次握手建立持久连接,双方可以互相主动推送数据,因此在实时性和效率方面具有显著优势。

对于常用编程语言,有许多现成的WebSocket库和示例可供参考,例如:

  • Go:gorilla/websocket

  • PHP:Ratchet

  • Node.js:ws

建议您先了解WebSocket的基本原理和技术细节,再参照本文进行开发。

前提条件

已开通服务并获取API Key。请配置API Key到环境变量,而非硬编码在代码中,防范因代码泄露导致的安全风险。

说明

对于客户端调用的场景,在客户端处理API Key有安全风险,建议从服务端用API Key获取临时鉴权Token,再把Token下发给客户端使用。具体方法请参考:生成临时 API Key

调用时序图

image

服务地址

wss://dashscope.aliyuncs.com/api-ws/v1/inference

鉴权

需要在发起初始的WebSocket握手(HTTP Upgrade)请求时,把API Key放在HTTP Header里(需要将your_api_key替换为真实的API Key):

"Authorization": "Bearer your_api_key"

语音交互

多模态交互应用开启了语音交互后,支持语音识别和语音合成。

语音识别支持的模型包括:Gummy实时语音识别(Gummy),Paraformer实时语音识别(Paraformer),多模态交互轻量版语音识别(AppSpecificASR-Realtime),FUN-ASR实时语音识别(FunASR)。

语音合成支持的模型包括:语音合成CosyVoice-v2大模型(cosyvoice-v2),Sambert语音合成(sambert),语音合成CosyVoice-v3大模型(cosyvoice-v3),通义千问-TTS(qwen-tts-realtime),通义千问3-TTS(qwen3-tts),多模态交互轻量版语音合成(AppSpecificTTS)。

语音合成支持的音色,可以在控制台上选择了模型后,点击右侧语音交互体验区域的右上角查看音色列表。

消息类型

二进制消息(Binary Message)

当前二进制消息仅包含音频数据。

上传音频

上传音频时,将原始音频直接转为二进制流即可,无需额外处理。

上传的语音识别音频需满足:16bit(采样位深)、单声道、有符号、little-endian PCM编码,采样率参考Start消息的参数parameters.upstream.sample_rate的取值说明。

如果希望减少网络流量和带宽占用,用户可以把pcm音频编码为opus格式,同时设置上传音频格式为raw-opusopus(区别详见参数说明)。

上传音频时,根据Start消息中upstream.mode设值不同,采取的措施也不同:

  • modetap2talkduplex:客户端需持续上传音频,服务端自动检测语音活动。建议每100ms上传一次数据,间隔太长或太短会对延时和处理效率造成不利影响。

    • 音频上传速率计算公式:数据每次上传的字节数 = 采样率 * 采样位深/8 * 时间间隔(ms)

  • modepush2talk:客户端无需持续上传音频,但需通过SendSpeechStopSpeech通知服务端音频识别的开始和结束。发送SendSpeech后需立即上传音频,否则会增加处理时间。

下发音频

服务端将大模型回复发送至TTS生成语音然后下发给客户端:

  • 下发音频为16bit单声道,采样率和编码由Start消息参数定义。

  • 下发速度取决于TTS服务性能,通常快于播放速度。

  • 音频下发前发送RespondingStarted事件;结束后发送RespondingEnded事件。

  • 客户端需在播放完成后需上报LocalRespondingEnded,通知服务端播放结束。

文本消息(Text Message)

文本消息是JSON格式字符串,按传递方向分为两类:

  • 输入消息(Input Message):客户端发送给服务端的指令(directive),表示客户端希望服务端执行特定动作。

  • 输出消息(Output Message):服务端发送给客户端的事件(event),表示服务端动作执行结果或进展。

文本消息标记交互流程的关键节点,控制流程并传输关键信息。通过时序图可了解不同消息的交互时序。

文本消息包含两部分:headerpayload

  • payload:内容随消息类型变化。

  • header:内容固定,包含以下参数:

    参数

    类型

    是否必选

    说明

    task_id

    string

    本次连接唯一标识,用于在工程链路上跟踪任务执行。由客户端生成,格式为字母和数字组成的32位随机字符串,格式示例:"123456781234123412341234567890ab"

    streaming

    string

    输入输出类型,对于多模态交互必须为 "duplex" ,表示流式输入,流式输出

    action

    string

    模型输入消息类型:

    • run-task: 任务的第一个输入消息

    • finish-task: 任务的最后一个输入消息

    • continue-task: 任务中其他输入消息

连接保活策略

为维持连接,客户端需在任意连续的60秒内至少向服务端发送一条消息(可以是业务消息或心跳消息),否则连接将被服务端主动断开并返回ResponseTimeout错误。

若客户端需在无交互时保持连接,应定期发送心跳消息(HeartBeat)。服务端会回应心跳,确保连接活跃,避免超时关闭。

移动端和C++ SDK已内置心跳保活逻辑,用户无需手动发送。

文本消息类型

开始会话

Start - Input Message

请求开始会话消息。服务收到Start消息后,向客户端发送Started消息。

一级参数

二级参数

类型

是否必选

说明

task_group

string

任务组名称,固定为"aigc",请直接复制使用

task

string

任务名称,固定为"multimodal-generation",请直接复制使用

function

string

调用功能,固定为"generation",请直接复制使用

model

string

阿里云百炼模型名称,固定为"multimodal-dialog",请直接复制使用

input

directive

string

指令名称:Start

workspace_id

string

客户在阿里云百炼业务空间ID(Workspace ID),可在百炼管控台“业务空间详情”中查看,目前仅支持主账号默认工作空间

app_id

string

客户创建的应用ID(APP ID),可在多模态交互管控台“我的应用”页面查看

dialog_id

string

对话ID,默认不填时是开启新会话,服务端会自动生成并在事件中下发,格式示例:"12345678-1234-1234-1234-1234567890ab",共36个字符。当希望继续之前的对话时,把当时服务端下发的dialog_id在这里传入

parameters

upstream

object

参数说明参考下方 parameters.upstream的参数说明表格

downstream

object

参数说明参考下方 parameters.downstream的参数说明表格

client_info

object

参数说明参考下方 parameters.client_info的参数说明表格

biz_params

object

参数说明参考下方 parameters.biz_params的参数说明表格

parameters.upstream的参数说明如下

一级参数

类型

是否必选

说明

type

string

上行类型:

AudioOnly 仅语音通话

mode

string

客户端使用的模式,默认tap2talk。

可选项:

  • push2talk: 客户端控制模式。

  • tap2talk: 点击模式。

  • duplex: 双工模式。

三种模式的对比可以参考下方的客户端使用的三种模式对比表格。

audio_format

string

音频格式,支持pcm,opus,raw-opus,默认为pcm

注意:opus 和 raw-opus的区别是opus格式的每一包数据都需要额外加ogg封装(RFC 7845

sample_rate

int

语音识别的采样率,支持范围:

  • 8000

  • 16000

  • 24000

  • 48000

默认为16000

vocabulary_id

string

热词id,设置该参数时会覆盖管控台热词配置。当管控台提供的热词不能满足客户需求时,可以考虑用Open API程序化管理热词,参见热词API文档

parameters.downstream的参数说明如下:

一级参数

类型

是否必选

说明

voice

string

合成语音的音色,支持范围取决于用户在管控台选择的语音合成模型

sample_rate

int

合成语音的采样率,支持范围:

  • 8000

  • 16000

  • 24000

  • 48000

默认为24000。

通义千问-TTS、通义千问3-TTS模型仅支持24000。

audio_format

string

音频格式,支持pcm,opus,mp3,raw-opus,默认为pcm。

通义千问-TTS、通义千问3-TTS模型仅支持pcm。

注意:opus 和 raw-opus的区别是opus格式的每一包数据都有额外ogg封装(RFC 7845

frame_size

int

合成音频的帧大小,取值范围:

  • 10

  • 20

  • 40

  • 60

  • 100

  • 120

默认值为60,单位ms

只在合成音频格式为opusraw-opus时生效

volume

int

合成音频的音量,取值范围0-100,默认50

speech_rate

int

合成音频的语速,取值范围50-200,表示默认语速的50%-200%,默认100

pitch_rate

int

合成音频的声调,取值范围50-200,默认100

bit_rate

int

合成音频的比特率,取值范围:6~510kbps,默认值为32,单位kbps,只在合成音频格式为opusraw-opus时生效

intermediate_text

string

控制返回给用户哪些中间文本:

  • transcript:返回用户语音识别结果

  • dialog:返回对话系统回答中间结果

可以设置多种,以逗号分隔,默认为transcript

transmit_rate_limit

int

下发音频发送速率限制,单位:字节每秒

parameters.client_info的参数说明如下:

一级参数

二级参数

类型

是否必选

说明

user_id

string

终端用户ID,客户根据自己业务规则生成,用来针对不同终端用户实现定制化功能。最大长度40个字符。

device.uuid

uuid

string

客户端全局唯一的ID,需要用户自己生成,传入SDK。最大长度40个字符。

network

ip

string

调用方公网IP

location

latitude

string

调用方纬度信息,在需要客户端精确位置的业务场景提交

longitude

string

调用方经度信息,在需要客户端精确位置的业务场景提交

city_name

string

调用方所在城市,指明客户端粗略位置

parameters.biz_params的参数说明如下:

一级参数

类型

是否必选

说明

user_defined_params

json object

需要透传给agent的参数,各类agent传递的参数参考调用官方Agent文档说明

user_prompt_params

json object

用于设置用户自定义prompt变量,由用户自定义设置json中的keyvalue。管控台上配置自定义prompt变量的方法参考应用配置-提示词

user_query_params

json object

用于设置用户自定义对话变量,由用户自定义设置json中的keyvalue。管控台上配置自定义对话变量的方法参考应用配置-对话变量

客户端使用的三种模式对比:

对比项

push2talk

tap2talk

duplex

类型

客户端控制模式

点击模式

双工模式

音频上传方式

按需

持续

持续

VAD检测方

客户端

服务端

服务端

打断方式

RequestToSpeak消息打断

RequestToSpeak消息打断

语音打断

使用场景

由用户控制开始/结束客户端语音发送和识别,适用于按键说话,松开停止说话的场景。

客户端需持续上传音频,服务端自动检测语音活动的场景。但不支持用户语音打断大模型输出,只能发送RequestToSpeak打断消息。

客户端需持续上传音频,服务端自动检测语音活动的场景。用户随时可以说话打断大模型输出。

示例如下:

{
    "header": {
        "action":"run-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "task_group":"aigc",
        "task":"multimodal-generation",
        "function":"generation",
        "model":"multimodal-dialog",
        "input":{
          "directive": "Start",
          "workspace_id": "llm-***********",
          "app_id": "****************"
        },
        "parameters":{
          "upstream":{
            "type": "AudioOnly",
            "mode": "duplex"
          },
          "downstream":{
            "voice": "longxiaochun_v2",
            "sample_rate": 24000
          },
          "client_info":{
            "user_id": "bin********207",
            "device":{
              "uuid": "432k*********k449"
            },
            "network":{
              "ip": "10.0.0.9"
            },
            "location":{
              "city_name": "北京市"
            }
          },
          "biz_params":{
            "user_defined_params": {
                "agent_id_xxxxx": {
                    "name": "value"
                }
            },
            "user_prompt_params": {
                "name": "value"
            },
            "user_query_params": {
                "name": "value"
            }
          }
        }
    }
}

Started - Output Message

说明

SDK接收到Started之后,先不可以向服务发送音频,应等待DialogStateChanged消息,确认切换到Listening状态之后才发送音频。

一级参数

二级参数

类型

说明

output

event

string

事件名称:Started

dialog_id

string

对话ID

示例如下:

Started返回消息样例

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "Started",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

结束会话

Stop - Input Message

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:Stop

dialog_id

string

对话ID

示例如下:

Stop请求样例

{
    "header": {
        "action":"finish-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "Stop",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

Stopped - Output Message

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:Stopped

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "Stopped",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

服务端下发状态切换事件

DialogStateChanged - Output Message

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:DialogStateChanged

state

string

AI交互状态,如:Listening,Thinking, Responding

注意:其中状态Listening 只是表示SDK可以发语音给服务端,不代表客户端是否开麦

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "DialogStateChanged",
          "state": "Listening",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

请求上传语音

RequestToSpeak - Input Message

当前状态不是Listening,而用户又想说话时,先提交此事件,等待服务端应答。

具体触发此事件的用户行为根据交互类型有所不同,比如用户按下按钮、语音打断(依赖双工模块)等。

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:RequestToSpeak

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "RequestToSpeak",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

RequestAccepted - Output Message 请求被准许

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:RequestAccepted

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "RequestAccepted",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

上传语音指令

SendSpeech - Input Message

Start消息指定模式为puhs2talk,在Listening状态时,通知服务端开始上传语音,语音数据应紧接着此事件之后发送。

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:SendSpeech

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "SendSpeech",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

StopSpeech - Input Message

Start消息指定模式为puhs2talk的时候,用户必须使用StopSpeech结束语音指令输入。

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:StopSpeech

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "StopSpeech",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

语音识别开始/结束

SpeechStarted - Output Message

当服务端检测到asr语音起点时下发此事件。

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:SpeechStarted

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "SpeechStarted",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

SpeechEnded - Output Message

当服务端检测到asr语音尾点时下发此事件,如果客户端还在上传音频,则收到此事件后应停止上传音频。

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:SpeechEnded

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "SpeechEnded",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

指定应答内容

RequestToRespond - Input Message

Listening状态时,通知服务端与用户主动交互,服务端会根据type字段把在text字段中上传的文本直接转换为语音下发,或调用大模型,返回的结果再转换为语音下发。

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:RequestToRespond

dialog_id

string

对话ID

type

string

服务应该采取的交互类型:

  • transcript:表示直接把文本转语音

  • prompt:表示把文本发送给大模型让其进行回答

text

string

要处理的文本,非null。

  • 调用部分agent时,text可以是""空字符串,服务端只需要使用parameters中的images或者biz_params参数即可处理。具体参考调用官方Agent

parameters

images

list[]

需要分析的图片信息

biz_params

object

参数说明参考下方 parameters.biz_params的参数说明表格

parameters.biz_params的参数说明如下:

一级参数

类型

是否必选

说明

videos

list[]

用来控制进入和退出视频通话。

示例如下:

payload.biz_params.videos.actionconnect,表示进入视频模式。

payload.biz_params.videos.actionexit,表示退出视频模式。

其他参数

Start消息中parameters.biz_params相同,传递对话系统自定义参数。RequestToRespondbiz_params参数只在本次请求中生效。

说明

除了videos参数外,parameters.biz_paramsStart消息中的parameters.biz_params相同,传递对话系统自定义参数。RequestToRespondbiz_params参数只在本次请求中生效。

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "RequestToRespond",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb",
          "type": "prompt",
          "text": "你好,你有什么想聊的呢"
        },
        "parameters":{
          "images":[{
              "type": "base64",
              "value": "base64String"
          }],
          "biz_params":{
            "user_defined_params":{},
            "videos": [
                  {
                    "action": "connect", 
                    "type": "voicechat_video_channel"
                  },
                  {
                    "action": "exit", 
                    "type": "voicechat_video_channel"
                  }
                ]
          }
        }
    }
}

AI语音应答状态

RespondingStarted - Output Message

AI语音应答开始,sdk要准备接收服务端下发的语音数据

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:RespondingStarted

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "RespondingStarted",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

RespondingEnded - Output Message

AI语音应答结束

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:RespondingEnded

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "RespondingEnded",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

客户端播放事件

LocalRespondingStarted - Input Message

客户端开始播放服务端下发的音频

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:LocalRespondingStarted

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "LocalRespondingStarted",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

LocalRespondingEnded - Input Message

客户端播放服务端下发的音频结束

一级参数

二级参数

类型

是否必选

说明

input

directive

string

指令名称:LocalRespondingEnded

dialog_id

string

对话ID

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "LocalRespondingEnded",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

文本下发事件

SpeechContent - Output Message

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称:SpeechContent

dialog_id

string

对话ID

text

string

用户语音识别出的文本,流式全量输出。后续消息的text字段会完整包含之前所有已识别的内容。例如,您会先收到"text": "你好",接着收到"text": "你好世界"

finished

bool

输出是否结束

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    }},
    "payload": {
        "output":{
          "event": "SpeechContent",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb",
          "text": "一二三",
          "finished": false
        }
    }
}

RespondingContent - Output Message

一级参数

二级参数

类型

是否必选

说明

output

event

string

事件名称如:RespondingContent

dialog_id

string

对话ID

round_id

string

本轮交互的ID

llm_request_id

string

调用llmrequest_id

text

string

系统对外输出的文本,流式全量输出

spoken

string

合成语音时使用的文本,流式全量输出

finished

bool

输出是否结束

extra_info

object

其他扩展信息,目前支持:

  • commands: 命令字符串,各类agent使用的命令字符串可以参考调用官方Agent的说明。

  • agent_info: 智能体信息

  • tool_calls: 插件返回的信息

示例如下:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "RespondingContent",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb",
          "text": "您输入了数字序列“12345”。如果您有关于这些数字的问题或者需要我用它们来完成某项任务,请告诉我更多的细节,我会尽力帮助您。",
          "spoken": "您输入了数字序列“12345”。如果您有关于这些数字的问题或者需要我用它们来完成某项任务,请告诉我更多的细节,我会尽力帮助您。",
          "finished": true,
        "extra_info": {
          "commands": "[{\"name\":\"VOLUME_SET\",\"params\":[{\"name\":\"series\",\"normValue\":\"70\",\"value\":\"70\"}]}]",
          "tool_calls": [{
            "id": "",
            "type": "function",
            "function": {
              "name": "function_name",
              "arguments": "{\"id\": \"123\", \"name\": \"test\"}",
              "outputs": "函数调用结果",
              "status": {
                "code": 200,
                "message": "Success."
              }
            }
          }]
        }
        }
    }
}

客户端更新事件

UpdateInfo - Input Message

一级参数

二级参数

三级参数

类型

是否必选

说明

input

directive

string

指令名称:UpdateInfo

dialog_id

string

对话ID

parameters

images

list[]

图片数据

client_info

status

object

客户端当前状态

biz_params

object

Start消息中biz_params相同,传递对话系统自定义参数。UpdateInfo指令中biz_params下面每个子项会全量替换Start指令中biz_params下面的同名项,并在本次连接后续所有对话中生效。

示例如下:

{
    "header": {
        "action":"continue-task",
        "task_id": "9B32878********************3D053",
        "streaming":"duplex"
    },
    "payload": {
        "input":{
          "directive": "UpdateInfo",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        },
        "parameters":{
          "images":[{
              "type": "base64",
              "value": "base64String"
          }],
          "client_info": {
              "status": {
                  "bluetooth_announcement": {
                      "status": "stopped"
                  },
                  "stream_media_playback": {
                      "status": "stopped"
                  },
                  "phone_ringing": {
                      "status": "stopped"
                  },
                  "stream_media_playback_qq": {
                      "status": "stopped"
                  }
              }
          },
          "biz_params":{
          }
        }
    }
}

心跳事件

可以通过定期向服务端发送此消息,避免连接超时断开。建议发送频率50秒一次。服务端会回应相同消息,客户端收到不需要做任何处理,忽略即可。

HeartBeat - Input Message

一级参数

二级参数

三级参数

类型

是否必选

说明

input

directive

string

指令名称:HeartBeat

dialog_id

string

对话id

示例:

{
  "header": {
    "action": "continue-task",
    "task_id": "9B32878********************3D053",
    "streaming": "duplex"
  },
  "payload": {
    "input": {
      "directive": "HeartBeat",
      "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
    }
  }
}

HeartBeat - Output Message

一级参数

二级参数

三级参数

类型

是否必选

说明

output

event

string

事件名称:HeartBeat

dialog_id

string

对话id

示例:

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "HeartBeat",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb"
        }
    }
}

错误事件

Error - Output Message

一级参数

二级参数

类型

是否必选

说明

output

error_code

int

错误码

error_name

string

错误名称

error_message

string

错误消息

{
    "header": {
        "event":"result-generated",
        "task_id": "9B32878********************3D053"
    },
    "payload": {
        "output":{
          "event": "Error",
          "dialog_id": "dd84xxxx-xxxx-xxxx-xxxx-xxxxb7bb",
          "error_code": 500,
          "error_name": "InternalLLMError", 
          "error_message": "Internal LLM error""
        }
    }
}

错误码

如遇报错问题,请参见多模态交互套件-错误码进行排查。

若问题仍未解决,请联系技术支持,反馈遇到的问题,并提供完整的request_iddialog_id,以便进一步排查问题。

术语说明

VAD:Voice Activity Detection,语音活动检测。

ASR:Automatic Speech Recognition,自动语音识别。

TTS:Text-to-Speech,文本转语音,语音合成。

LLM:Large Language Model,大语言模型。