本文介绍实时多模态交互协议WebSocket API。WebSocket协议延迟低、资源占用少,是首选接入方案。
WebSocket是一种支持全双工通信的网络协议。客户端和服务器通过一次握手建立持久连接,双方可以互相主动推送数据,因此在实时性和效率方面具有显著优势。
对于常用编程语言,有许多现成的WebSocket库和示例可供参考,例如:
Go:
gorilla/websocketPHP:
RatchetNode.js:
ws
建议您先了解WebSocket的基本原理和技术细节,再参照本文进行开发。
前提条件
已开通服务并获取API Key。请配置API Key到环境变量,而非硬编码在代码中,防范因代码泄露导致的安全风险。
对于客户端调用的场景,在客户端处理API Key有安全风险,建议从服务端用API Key获取临时鉴权Token,再把Token下发给客户端使用。具体方法请参考:生成临时 API Key。
调用时序图

服务地址
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-opus或opus(区别详见参数说明)。
上传音频时,根据Start消息中upstream.mode设值不同,采取的措施也不同:
mode为
tap2talk或duplex:客户端需持续上传音频,服务端自动检测语音活动。建议每100ms上传一次数据,间隔太长或太短会对延时和处理效率造成不利影响。音频上传速率计算公式:
数据每次上传的字节数 = 采样率 * 采样位深/8 * 时间间隔(ms)
mode为
push2talk:客户端无需持续上传音频,但需通过SendSpeech和StopSpeech通知服务端音频识别的开始和结束。发送SendSpeech后需立即上传音频,否则会增加处理时间。
下发音频
服务端将大模型回复发送至TTS生成语音然后下发给客户端:
下发音频为16bit单声道,采样率和编码由Start消息参数定义。
下发速度取决于TTS服务性能,通常快于播放速度。
音频下发前发送RespondingStarted事件;结束后发送RespondingEnded事件。
客户端需在播放完成后需上报LocalRespondingEnded,通知服务端播放结束。
文本消息(Text Message)
文本消息是JSON格式字符串,按传递方向分为两类:
输入消息(Input Message):客户端发送给服务端的指令(directive),表示客户端希望服务端执行特定动作。
输出消息(Output Message):服务端发送给客户端的事件(event),表示服务端动作执行结果或进展。
文本消息标记交互流程的关键节点,控制流程并传输关键信息。通过时序图可了解不同消息的交互时序。
文本消息包含两部分:header和payload。
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。 可选项:
三种模式的对比可以参考下方的客户端使用的三种模式对比表格。 |
audio_format | string | 否 | 音频格式,支持pcm,opus,raw-opus,默认为pcm 注意:opus 和 raw-opus的区别是opus格式的每一包数据都需要额外加ogg封装(RFC 7845) |
sample_rate | int | 否 | 语音识别的采样率,支持范围:
默认为16000 |
vocabulary_id | string | 否 | 热词id,设置该参数时会覆盖管控台热词配置。当管控台提供的热词不能满足客户需求时,可以考虑用Open API程序化管理热词,参见热词API文档 |
parameters.downstream的参数说明如下:
一级参数 | 类型 | 是否必选 | 说明 |
voice | string | 否 | 合成语音的音色,支持范围取决于用户在管控台选择的语音合成模型 |
sample_rate | int | 否 | 合成语音的采样率,支持范围:
默认为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 | 否 | 合成音频的帧大小,取值范围:
默认值为60,单位ms 只在合成音频格式为opus或raw-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,只在合成音频格式为opus或raw-opus时生效 |
intermediate_text | string | 否 | 控制返回给用户哪些中间文本:
可以设置多种,以逗号分隔,默认为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中的key和value。管控台上配置自定义prompt变量的方法参考应用配置-提示词 |
user_query_params | json object | 否 | 用于设置用户自定义对话变量,由用户自定义设置json中的key和value。管控台上配置自定义对话变量的方法参考应用配置-对话变量 |
客户端使用的三种模式对比:
对比项 | 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 | 是 | 服务应该采取的交互类型:
| |
text | string | 是 | 要处理的文本,非null。
| |
parameters | images | list[] | 否 | 需要分析的图片信息 |
biz_params | object | 否 | 参数说明参考下方 parameters.biz_params的参数说明表格 |
parameters.biz_params的参数说明如下:
一级参数 | 类型 | 是否必选 | 说明 |
videos | list[] | 否 | 用来控制进入和退出视频通话。 示例如下: payload.biz_params.videos.action为connect,表示进入视频模式。 payload.biz_params.videos.action为exit,表示退出视频模式。 |
其他参数 | 否 | 与Start消息中 |
除了videos参数外,parameters.biz_params与Start消息中的parameters.biz_params相同,传递对话系统自定义参数。RequestToRespond的biz_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 | 是 | 用户语音识别出的文本,流式全量输出。后续消息的 | |
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 | 是 | 调用llm的request_id | |
text | string | 是 | 系统对外输出的文本,流式全量输出 | |
spoken | string | 是 | 合成语音时使用的文本,流式全量输出 | |
finished | bool | 是 | 输出是否结束 | |
extra_info | object | 否 | 其他扩展信息,目前支持:
|
示例如下:
{
"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_id和dialog_id,以便进一步排查问题。
术语说明
VAD:Voice Activity Detection,语音活动检测。
ASR:Automatic Speech Recognition,自动语音识别。
TTS:Text-to-Speech,文本转语音,语音合成。
LLM:Large Language Model,大语言模型。