本文介绍实时多模态交互协议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。
调用时序图
服务地址
wss://dashscope.aliyuncs.com/api-ws/v1/inference
鉴权
需要在发起HTTP请求时,把API-KEY放在HTTP Header里:
"Authorization: your_api_key"
消息类型
二进制消息(Binary Message)
当前二进制消息仅包含音频数据。
上传音频
上传音频时,将原始音频直接转为二进制流即可,无需额外处理。
上传的语音识别音频需满足:16000Hz、16bit、单声道、有符号、little-endian PCM编码。
如果希望减少网络流量和带宽占用,用户可以把pcm音频编码为opus格式,同时设置上传音频格式为raw-opus或opus(区别详见参数说明)。
上传音频时,根据Start消息中upstream.mode
设值不同,采取的措施也不同:
mode为
tap2talk
或duplex
:客户端需持续上传音频,服务端自动检测语音活动。建议每100ms上传3200字节数据,长时间中断上传将触发服务端报错。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
是
本次连接唯一标识,用于在工程链路上跟踪任务执行
streaming
string
是
输入输出类型,对于多模态交互必须为 "duplex" ,表示流式输入,流式输出
action
string
是
模型输入消息类型:
run-task: 任务的第一个输入消息
finish-task: 任务的最后一个输入消息
continue-task: 任务中其他输入消息
连接保活策略
客户端与服务端之间超过1分钟无消息下发时,连接将超时断开。
若客户端需在无交互时保持连接,应定期发送心跳消息(HeartBeat)。服务端会回应心跳,确保连接活跃,避免超时关闭。
移动端和C++ SDK已内置心跳保活逻辑,用户无需手动发送。
文本消息类型
开始会话
Start - Input Message
请求开始会话消息。服务收到Start消息后,向客户端发送Started消息。
一级参数 | 二级参数 | 三级参数 | 四级参数 | 类型 | 是否必选 | 说明 |
task_group | 任务组名称,固定为"aigc" | |||||
task | 任务名称,固定为"multimodal-generation" | |||||
function | 调用功能,固定为"generation" | |||||
model | 阿里云百炼模型名称,固定为"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 | type | string | 是 | 上行类型: AudioOnly 仅语音通话 | |
mode | string | 否 | 客户端使用的模式,可选项:
默认tap2talk | |||
audio_format | string | 否 | 音频格式,支持pcm,opus,raw-opus,默认为pcm 注意:opus 和 raw-opus的区别是opus格式的每一包数据都需要额外加ogg封装 | |||
sample_rate | int | 否 | 语音识别的采样率,支持范围:
默认为16000 | |||
downstream | voice | string | 否 | 合成语音的音色,支持范围取决于用户在管控台选择的tts模型 | ||
sample_rate | int | 否 | 合成语音的采样率,支持范围:
默认为24000 | |||
audio_format | string | 否 | 音频格式,支持pcm,opus,mp3,raw-opus,默认为pcm 注意:opus 和 raw-opus的区别是opus格式的每一包数据都有额外ogg封装 | |||
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 | 否 | 下发音频发送速率限制,单位:字节每秒 | |||
client_info | user_id | string | 是 | 终端用户ID,客户根据自己业务规则生成,用来针对不同终端用户实现定制化功能。最大长度40个字符。 | ||
device | uuid | string | 否 | 客户端全局唯一的ID,需要用户自己生成,传入SDK。最大长度40个字符。 | ||
network | ip | string | 否 | 调用方公网IP | ||
location | latitude | string | 否 | 调用方纬度信息,在需要客户端精确位置的业务场景提交 | ||
longitude | string | 否 | 调用方经度信息,在需要客户端精确位置的业务场景提交 | |||
city_name | string | 否 | 调用方所在城市,指明客户端粗略位置 | |||
biz_params | user_defined_params | object | 否 | 其他需要透传给agent的参数 | ||
user_defined_tokens | object | 否 | 透传agent所需鉴权信息 | |||
user_prompt_params | object | 否 | 用于设置用户自定义prompt中的变量 | |||
user_query_params | object | 否 | 用于设置用户自定义query中的变量 |
示例如下:
{
"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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":0,
"model_x":0
}
}
}
结束会话
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": "b39398c9dd8147********35cdea81f7"
}
}
}
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
服务端下发状态切换事件
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
请求上传语音
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": "b39398c9dd8147********35cdea81f7"
}
}
}
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
上传语音指令
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": "b39398c9dd8147********35cdea81f7"
}
}
}
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": "b39398c9dd8147********35cdea81f7"
}
}
}
语音识别开始/结束
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
指定应答内容
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 | 否 | 与Start消息中biz_params相同,传递对话系统自定义参数。RequestToRespond的biz_params参数只在本次请求中生效。 |
示例如下:
{
"header": {
"action":"continue-task",
"task_id": "9B32878******************3D053",
"streaming":"duplex"
},
"payload": {
"input":{
"directive": "RequestToRespond",
"dialog_id": "b39398c9dd8147********35cdea81f7",
"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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
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": "b39398c9dd8147********35cdea81f7"
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
端侧播放事件
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": "b39398c9dd8147********35cdea81f7"
}
}
}
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": "b39398c9dd8147********35cdea81f7"
}
}
}
文本下发事件
SpeechContent - Output Message
一级参数 | 二级参数 | 类型 | 是否必选 | 说明 |
output | event | string | 是 | 事件名称:SpeechContent |
dialog_id | string | 是 | 对话ID | |
text | string | 是 | 用户语音识别出的文本,流式全量输出 | |
finished | bool | 是 | 输出是否结束 |
示例如下:
{
"header": {
"request_id": "9B32878******************3D053",
"service_id": "368208df",
"status_code": 200,
"status_name": "Success",
"status_message": "Success.",
"attributes":{
"user_id":"1234557879x"
}
},
"payload": {
"output":{
"event": "SpeechContent",
"dialog_id": "b39398c9dd8147********35cdea81f7",
"text": "一二三",
"finished": false
},
"usage":{
"invoke":10,
"model_x":10
}
}
}
RespondingContent - Output Message
一级参数 | 二级参数 | 类型 | 是否必选 | 说明 |
output | event | string | 是 | 事件名称如:RequestAccepted |
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": "RequestAccepted",
"dialog_id": "b39398c9dd8147********35cdea81f7",
"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": "b39398c9dd8147********35cdea81f7"
},
"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": "b39398c9dd8147********35cdea81f7"
}
}
}
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": "b39398c9dd8147********35cdea81f7"
}
}
}
错误事件
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": "b39398c9dd8147********35cdea81f7",
"error_code": 500,
"error_name": "Internal LLm Error",
"error_message": "Internal LLm Error"
}
}
}
错误码
常见错误码如下
百炼错误
错误码(Code) | 错误信息(Message) | 说明 |
403 | AccessDenied.Unpurchased | Access to model denied. Please make sure you are eligible for using the model. 用户必须开通百炼服务 |
403 | Model.AccessDenied | 只支持从默认业务空间调用 |
ResponseTimeout | {"header":{"task_id":"899*******499","event":"task-failed","error_code":"ResponseTimeout","error_message":"Response timeout!","attributes":{}},"payload":{}} 百炼网关要求服务端和客户端必须持续通信,如果超过1分钟没有交互则会超时报错。 | |
InternalError | {"header":{"task_id":"899*******499","event":"task-failed","error_code":"InternalError","error_message":"Internal server error!","attributes":{}},"payload":{}} 百炼网关要求服务端和客户端必须持续通信,如果超过1分钟没有交互则会超时报错。 |
多模态错误
(1)断连错误
出现以下错误时,错误码在header的status_code里,会话连接会断开,需要检查出错原因重新建连。
错误码(Code) | 错误信息(Message) | 说明 |
421 | InvalidParameter | type of directive payload is error, please choose transcript or prompt 参数错误,RequestToRespond请求的参数type错误,只能支持以下两种: (1)transcript 表示直接把文本转语音 (2)prompt 表示把文本送大模型回答 |
其他的参数错误 ,status_message 信息都有具体的提示说明。 | ||
422 | DirectiveNotSupported | 不支持的指令,请检查指令名称。 |
432 | AppConfigError | 获取到的百炼应用的配置有问题,参考status_message 里的具体信息修改。 |
433 | BillingAuthError | 未开通百炼多模态交互服务,或使用了错误账号。 |
444 | ClientAudioTimeout | Waiting for client audio timed out. 服务端长时间收不到客户端的音频输入。 |
449 | TooManyInterrupt | 用户短时间内发送过多RequestToRespond或RequestToSpeek 打断正常交互,通常是调用程序bug导致。 |
(2)普通错误
出现以下错误时,错误码在payload的error_code里,连接不会断开,可以继续发送请求。
错误码(Code) | 错误信息(Message) | 说明 |
424 | AudioFormatError | 输入音频的格式不合规,ASR无法正常解析音频。 |
425 | NoInputAudioError | 没有获取到有效的输入音频数据,ASR无法识别。 |
426 | InvalidTtsVoice | tts voice error , need cosyvoice-v2 voice. 参数错误,选择的音色不是cosyvoice-v2支持的音色。 (1)cosyvoice-v2支持的官方音色参考音色列表。 (2)复刻音色,确认音色状态为“OK”后才能使用。查询指定音色。 |
tts voice error , need qwen-tts-realtime voice. 参数错误,选择的音色不是qwen-tts-realtime支持的音色。 qwen-tts-realtime支持的官方音色参考实时语音合成-通义千问。 | ||
451 | NoSpeechRecognized | 服务没有识别到用户讲话,通常是push2talk模式下,用户发送了SendSpeech后,没有说话就又发送了StopSpeech指令。其他模式下也有极少数情况是由背景噪音引起。 |
500 | InternalSynthesizerError | Internal synthesizer error tts问题,提供dialogId给voicechat开发同学进行具体排查。 |
500 | InternalAsrError | Internal asr error asr问题,提供dialogId给voicechat开发同学进行具体排查。 |
500 | InternalLLMError | Internal LLM error llm问题,提供dialogId给voicechat开发同学进行具体排查。 |
500 | LLMTimeoutError | LLM response timeout llm问题,提供dialogId给voicechat开发同学进行具体排查。 |