实时语音识别 WebSocket API 参考

更新时间:
复制 MD 格式

实时语音识别接口通过一条 WebSocket 连接完成「边送音频、边出文本」的流式转写。

接口地址

WebSocket 地址固定如下:

wss://convai-platform.aliyuncs.com/api-ws/v1/convai-asr/inference

请按上述地址原样填写:路径区分大小写,结尾不要带 /。

支持的模型

模型

采样率

language_hints 可选值

适用场景

Qwen-Audio-ASR-VoicePica

8000 / 16000,须与实际音频一致

zh

中文实时识别;支持任务级热词 hotwords,能力范围见「关键概念与限制」

鉴权

客户端类型

鉴权方式

示例

服务端(Java / Python / Node / Go 等)

握手请求头 Authorization: Bearer <api_key>

Authorization: Bearer <VOICE_STUDIO_API_KEY>

浏览器

URL 查询参数 ?token=<api_key>

wss://.../api-ws/v1/convai-asr/inference?token=<VOICE_STUDIO_API_KEY>

  • API Key 由 Voice Studio 签发,形如 sk- + 32 位十六进制,与实时语音合成使用同一套 Key。百炼原生 Key 无法通过鉴权,返回 HTTP 401。

  • 有效 API Key 不等于已具备服务使用权益:账号未开通服务或已停服时,握手返回 HTTP 403。

  • 鉴权在握手阶段完成。握手被拒时不会升级为 WebSocket,也没有应用层关闭帧,浏览器通常只能观察到关闭码 1006。

请求头

握手阶段只传鉴权与追踪信息;识别模型、音频格式、采样率及识别功能参数均在每个任务的 run-task 中指定,同一连接上的不同任务可以使用不同参数。

请求头

必填

取值

说明

Authorization

服务端必填

Bearer <api_key>

Voice Studio 签发的 API Key

X-Request-Id

否(强烈建议)

非空字符串,建议 ≤ 64 字符

自带的追踪 ID,原样回写到握手响应头 X-Request-Id;不传时服务端生成 UUID。仅用于日志排障,不用于鉴权、任务关联或去重

User-Agent

否

客户端标识

建议包含应用名称和版本,便于排障

URL 查询参数

参数

必填

默认值

说明

token

浏览器必填

-

浏览器场景的鉴权凭证;服务端请用 Authorization 请求头

请记录建连时间(精确到秒并注明时区)、客户端生成的 task_id 以及收到的 task_uuid,用于事后排障。

握手示例(服务端):

GET /api-ws/v1/convai-asr/inference HTTP/1.1
Host: convai-platform.aliyuncs.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: <WEBSOCKET_KEY>
Authorization: Bearer <VOICE_STUDIO_API_KEY>
X-Request-Id: svc-example-0001

握手示例(浏览器,参数值需进行 URL 编码):

wss://convai-platform.aliyuncs.com/api-ws/v1/convai-asr/inference?token=<URL_ENCODED_API_KEY>

交互流程

  1. 建立连接:携带鉴权信息发起 WebSocket 握手,收到 101 Switching Protocols。建连后服务端不会主动下发任何帧,没有 connected 事件。

  2. 发送 run-task:使用 TEXT 帧指定识别模型与音频参数,开启一个任务;需要热词时同时传入词库引用 vocabulary_id 和/或任务级热词 hotwords。task_id 由你生成(UUID),同一任务的所有指令必须一致。

  3. 等待 task-started:收到该事件后才可以发送音频;保存 header.task_uuid(如有),便于排障。

  4. 发送 BINARY 音频帧:建议每 100 ms 一帧,按约 1 倍速持续推流。音频直接以二进制发送,不做 JSON 或 Base64 包装。

  5. 接收 result-generated:同一句话会多次返回中间结果用于覆盖刷新,sentence_end=true 为该句最终结果。

  6. 发送 finish-task:所有音频(含不足一帧的尾部完整采样)发送完毕后发送,不可省略。

  7. 继续接收直到 task-finished:finish-task 之后仍可能返回尾句识别结果,提前关闭连接会丢失尾句。task-finished 中带回本任务最终音频用量。

  8. 复用或关闭:任务正常结束后,可以在同一条连接上用新的 task_id 发起下一个 run-task,也可以直接关闭连接。

任一阶段收到 task-failed 时,停止上行并保存错误信息;服务端随后关闭连接,需要重试时重新建连。

状态约束

约束

违反后果

必须先 run-task,收到 task-started 后再发音频

run-task 之前发送音频、continue-task 或 finish-task:task-failed(CLIENT_ERROR) 并关闭连接

同一任务所有指令的 task_id 必须完全一致

可能导致任务失败或结果无法关联

一条连接同时只允许 1 个任务

任务未结束又发 run-task:task-failed(CLIENT_ERROR: run-task while a task is already running) 并关闭连接

指令必须是 TEXT 帧,音频必须是 BINARY 帧

混用会导致参数或协议错误

finish-task 不可省略

尾部音频的识别结果不会返回,任务最终可能因超时失败

finish-task 后必须继续收流直到 task-finished

提前关闭会丢失尾句结果

收到 task-failed 后不再复用该连接

服务端随后关闭连接,重试必须重新建连

客户端事件(上行)

上行分为 JSON 指令(TEXT 帧)和音频(BINARY 帧)。JSON 指令统一使用如下信封:

{
  "header": {
    "action": "<事件名>",
    "task_id": "<你生成的 UUID>",
    "streaming": "duplex"
  },
  "payload": {}
}

header 字段

类型

必填

取值

说明

action

String

是

run-task / finish-task

本模型接入只需这两种指令。缺失返回 CLIENT_ERROR: missing header.action;未知事件名返回 CLIENT_ERROR: unknown action: xxx

task_id

String

是

UUID 字符串,32 位或带连字符均可

由你生成;同一任务的全部指令相同,每个新任务更换 UUID

streaming

String

是

固定 duplex

双向流式交互

header 与 payload 必须是 JSON 对象,否则返回 CLIENT_ERROR: header and payload must be JSON objects;非法 JSON 返回 CLIENT_ERROR: invalid JSON message。事件名和参数名区分大小写。

1. run-task —— 开启任务

发送时机:连接建立后的第一帧,或上一个任务已收到 task-finished 之后。

响应事件:成功返回 task-started,失败返回 task-failed 并关闭连接。

数量限制:一条连接同时只允许 1 个任务;上一个任务正常结束后可以用新 task_id 再次发送。

payload 顶层

参数

类型

必填

说明

task_group

String

是

固定 audio

task

String

是

固定 asr

function

String

是

固定 recognition

model

String

是

固定 Qwen-Audio-ASR-VoicePica,大小写须完全一致;未获准使用的模型返回 MODEL_NOT_ALLOWED

parameters

Object

是

识别参数,见下两表

input

Object

是

固定传 {};本模型不支持上下文增强,不传非空 context

parameters —— 音频参数

参数

类型

必填

默认值

取值范围

说明

format

String

是

-

pcm / wav / opus

音频编码格式,实时场景推荐 pcm;封装要求见「BINARY 音频帧」

sample_rate

Integer

是

-

8000 / 16000,单位 Hz

须与实际音频一致;修改此值不会对音频做重采样

parameters —— 功能参数

参数

类型

必填

默认值

取值 / 约束

说明

hotwords

Object

否

-

{"热词": 权重},权重为整数 1~5

任务级热词,只对当前任务生效。与 vocabulary_id 同传时合并,规则见「热词与托管词库」

language_hints

Array[String]

否

自动识别

如 ["zh"],取值见「支持的模型」

目标语言提示,仅第一个元素生效

max_sentence_silence

Integer

否

引擎默认

[200, 6000],单位 ms

VAD 断句静音阈值

speech_noise_threshold

Float

否

引擎默认

[-1.0, 1.0]

越接近 -1 越易把噪音当语音,越接近 +1 越易把语音当噪音;建议以 0.1 步长小幅调整并验证

special_word_filter

String

否

-

JSON 字符串,不是 Object

自定义敏感词过滤,见下方说明

special_word_filter 内层字段(内层 JSON 必须序列化为字符串)

内层字段

类型

说明

filter_with_signed.word_list

Array[String]

命中词替换为等长 *

filter_with_empty.word_list

Array[String]

命中词从识别文本中删除

自定义词过滤作用于中间结果和最终结果。不合法的 JSON 字符串可能被忽略,请在接入侧校验并验证实际过滤效果。

示例

{
  "header": {
    "action": "run-task",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "streaming": "duplex"
  },
  "payload": {
    "task_group": "audio",
    "task": "asr",
    "function": "recognition",
    "model": "Qwen-Audio-ASR-VoicePica",
    "parameters": {
      "format": "pcm",
      "sample_rate": 16000,
      "language_hints": ["zh"],
      "max_sentence_silence": 800,
      "special_word_filter": "{\"filter_with_signed\":{\"word_list\":[\"示例敏感词\"]},\"filter_with_empty\":{\"word_list\":[\"示例删除词\"]}}"
    },
    "input": {}
  }
}

2. BINARY 音频帧 —— 上行音频

发送时机:收到 task-started 之后、发送 finish-task 之前,可多次发送。

响应事件:识别过程中持续返回 result-generated;一个音频帧不一定对应一个结果事件。

项目

要求

消息类型

BINARY,直接发送音频字节,不做 JSON 或 Base64 包装

声道

单声道

PCM 位深

16 bit 有符号整数、小端字节序,每个采样 2 字节,帧长应为 2 的整数倍

单帧大小

≤ 65,536 字节(64 KiB),超限连接以 1009 关闭

推荐分帧

100 ms 一帧:8 kHz PCM 为 1,600 字节,16 kHz PCM 为 3,200 字节

发送节奏

按实时产生节奏或约 1 倍速推流;离线文件同样按约 1 倍速发送

帧间隔

建议 ≤ 20 秒;长时间无人说话时继续发送静音帧

格式与封装

format

音频要求

pcm

裸 PCM16 单声道,不带 WAV 文件头;静音可使用值为 0 的采样

wav

PCM16 单声道 WAV;文件头只在音频流开始时发送一次,不要给每个网络分片补头

opus

Ogg 封装,包含流头与音频页;不接受裸编码包

约束

  • format 与 sample_rate 必须和实际音频一致,填写参数不会替音频完成转码、混音或重采样;采样率填错会导致识别结果严重错误。

  • 压缩音频同样按音频时长节奏发送,不能用 PCM 的字节数公式估算其时长;不要把不同录音文件直接拼成一个连续的容器流。

  • 浏览器 MediaRecorder 常见的 WebM / Opus 不等于这里要求的 Ogg / Opus,浏览器实时采集建议转换为 PCM16 单声道再发送。

  • 服务端对单连接未处理的上行帧设有积压上限。瞬时灌入整段文件会返回 task-failed(CLIENT_ERROR: client input overflow ...) 并以 1011 关闭。

  • 收发必须分离,持续读取下行消息;长时间不读取下行会导致连接被断开。

3. finish-task —— 结束任务(不可省略)

发送时机:音频全部发送完毕后。

响应事件:剩余 result-generated,最后是 task-finished。

payload 字段

类型

必填

取值

说明

input

Object

是

{}

正常结束固定传空对象

{
  "header": {
    "action": "finish-task",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "streaming": "duplex"
  },
  "payload": {"input": {}}
}
  • 发送前先发完所有音频(含不足 100 ms 的尾部完整采样);发送后不再上行音频,也不要重复发送 finish-task。

  • 发送后必须继续接收,直到 task-finished。

  • 本接口没有 input.directive=cancel 或 flush 指令。需要中途停止时可以直接关闭连接,但这不是正常完成:不保证能收到尾句结果和终态用量,也不代表已处理的音频不计费。

服务端事件(下行)

下行共 4 类 TEXT 事件,没有 BINARY 帧。所有事件统一 header / payload 信封,请按 header.event 分派消息,header.task_id 回显你的任务 ID。

请忽略未知字段,并容忍可选字段缺失:未出现的 sentence_begin、sentence_end 一律按 false 处理;时间戳和用量出现 null 时不要强制转换为 0。本模型不下发识别心跳结果。

事件

何时出现

关键字段

task-started

run-task 被受理

header.task_id、header.task_uuid

result-generated

识别过程中,多次

payload.output.sentence、payload.usage

task-finished

finish-task 后任务正常结束

payload.usage.duration

task-failed

任务失败,随后关闭连接

header.error_code、header.error_message

1. task-started —— 任务确认

{
  "header": {
    "event": "task-started",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "task_uuid": "1008340206f44c8eabd587930b125614",
    "attributes": {}
  },
  "payload": {}
}

字段

类型

说明

header.event

String

固定 task-started

header.task_id

String

回显你的 task_id

header.task_uuid

String / 缺省

识别引擎侧任务 ID,有则保存并在报障时提供;不要把它写回后续上行的 task_id

header.attributes

Object

示例为空对象,不依赖其中的扩展字段

payload

Object

示例为空对象

收到此事件后方可发送音频。

2. result-generated —— 识别结果

同一句话会连续收到多条结果:首条带 sentence_begin=true(文本通常为空),之后是不断刷新的中间结果(sentence_end=false,文本可能被改写),最后一条 sentence_end=true 为该句最终结果。

结果类型(依据 payload.output.sentence)

判断条件

含义

客户端处理

sentence_begin=true

新句子开始,文本通常为空

建立该句的显示状态

sentence_end=false

中间结果,文本可能改写

按 sentence_id 覆盖当前句,不要逐条追加

sentence_end=true

该句最终结果

定稿,可交给下游业务处理

最终结果示例

{
  "header": {
    "event": "result-generated",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "attributes": {}
  },
  "payload": {
    "output": {
      "sentence": {
        "sentence_id": 1,
        "begin_time": 240,
        "end_time": 1620,
        "text": "你好,我是银行的,",
        "channel_id": 0,
        "speaker_id": null,
        "sentence_end": true,
        "words": [
          {"begin_time": 240, "end_time": 1620, "text": "你好,我是银行的", "punctuation": ",", "fixed": false, "speaker_id": null}
        ]
      }
    },
    "usage": {"duration": 2}
  }
}

中间结果与最终结果结构相同,区别是 sentence_end 为 false、end_time 为 null,且通常不携带 usage。本模型不提供字 / 词级时间戳,示例中的 words 使用整句文本及句级时间。

字段说明

字段

类型

出现条件

说明

output.sentence.sentence_id

Integer

恒有

句子序号,从 1 递增

output.sentence.begin_time

Integer

恒有

句子起始时间(毫秒,相对本任务音频起点);中间结果可能调整

output.sentence.end_time

Integer / null

恒有

句子结束时间(毫秒);中间结果为 null

output.sentence.text

String

恒有

识别文本,含标点;句首或静音时可为空串

output.sentence.channel_id

Integer

恒有

声道号,单声道固定为 0

output.sentence.speaker_id

Integer / null

恒有

说话人标识,当前恒为 null

output.sentence.sentence_begin

Boolean

仅新句子首个结果

为 true 表示新句子开始

output.sentence.sentence_end

Boolean

恒有

true=该句最终结果;false=中间结果

output.sentence.words[ ].text

String

按需

整句文本,末尾标点另列;空文本时 words 可为空数组

output.sentence.words[ ].punctuation

String

按需

标点,无标点时为空串

output.sentence.words[ ].begin_time / end_time

Integer

按需

整句起止时间(毫秒,相对本任务音频起点),不表示字 / 词级时间戳

output.sentence.words[ ].fixed

Boolean

按需

不依赖此字段判断稳定性;整句定稿以 sentence_end=true 为准

payload.usage.duration

Integer / null

sentence_end=true 时;其他结果若携带同样有效

截至当前本任务累计音频时长快照(秒)。不是本句发声时长,不能逐条相加;最终以 task-finished 为准

客户端处理建议

  • 实时字幕:用同一 sentence_id 的中间结果覆盖刷新当前行,sentence_end=true 时定稿换行。

  • 对话 / 外呼:只把 sentence_end=true 的文本交给下游(如大模型),中间结果仅用于界面展示或打断检测。

  • 整段转写:按 sentence_id 顺序拼接所有 sentence_end=true 的 text。

3. task-finished —— 任务结束

{
  "header": {
    "event": "task-finished",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "attributes": {}
  },
  "payload": {
    "output": {},
    "usage": {"duration": 8}
  }
}

字段

类型

说明

header.event

String

固定 task-finished

header.task_id

String

回显你的 task_id

header.attributes

Object

示例为空对象

payload.usage.duration

Integer / null

本任务最终音频用量(整数秒),由平台计算并补齐;口径见「音频用量」

收到此事件表示识别结果已全部传输,可关闭连接或复用连接发起新任务(新 task_id)。

4. task-failed —— 任务失败

{
  "header": {
    "event": "task-failed",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "error_code": "CLIENT_ERROR",
    "error_message": "not supported by model Qwen-Audio-ASR-VoicePica: heartbeat",
    "attributes": {}
  },
  "payload": {}
}

此例为任务开始前传入不支持参数的错误,因此不带音频用量。

字段

类型

说明

header.event

String

固定 task-failed

header.task_id

String

关联的任务 ID;run-task 之前的错误回带出错帧中的值,帧里没有 task_id(如非法 JSON)时为空串

header.error_code

String

错误码,用于程序判断,见「错误码与关闭码」

header.error_message

String

可读错误描述,报障时请提供完整原文

header.attributes

Object

示例为空对象

payload.usage.duration

Integer / null / 缺省

在途任务失败时为按已成功发送音频确认的终态用量;任务开始前的错误不带此字段

  • 收到 task-failed 后服务端会立即关闭连接,不要在该连接上继续发送;需要重试时重新建连并使用新的 task_id。

  • 本接口不下发 payload.error.type,请按 header.error_code 和错误码表决定处理方式。

  • 失败回包中的 duration 是音频用量,不等于收费结论。

关键概念与限制

约束速查

约束

值

上行指令帧类型

TEXT

上行音频帧类型

BINARY,单声道;pcm 为 16 bit 小端

单帧大小(指令 / 音频)

≤ 64 KiB(超限以 1009 关闭),建议音频每 100 ms 一帧

发送节奏

约 1 倍速;瞬时灌入大量音频触发积压保护

任务内音频间隔

建议 ≤ 20 秒

连接空闲(无任何上下行数据、无 ping)

< 70 秒

单连接同时进行的任务

1 个(正常结束后可串行复用)

任务失败后的连接

被关闭,不能复用

并发

按工作空间统计同时在线的 WebSocket 连接数

音频用量

payload.usage.duration 是任务音频用量,单位为秒,不是连接时长、识别文本长度或当前句子的发声时长。用量由平台计算,不使用识别引擎返回的时长。

  • 累计已成功发送给识别引擎的完整音频采样量,包含前置、句间和尾部静音;连接等待、发送失败的音频及尚未发送的缓冲不计入。

  • PCM 按声明采样率计算;WAV 按真实采样率且只计音频数据;压缩格式按完整编码帧 / 封装采样信息计算,不按压缩字节大小估算。

  • 每个任务累计后按四舍五入(HALF_UP)取整到整数秒,不逐网络帧取整,不设最低用量。不同任务分别取整再汇总。

  • result-generated 中的 duration 是累计快照,不能逐条相加;正常任务以 task-finished 的终态值为准。

实际累计音频时长

终态 usage.duration

0 秒

0

0.49 秒

0

0.5 秒

1

2.5 秒

3

8.245 秒

8

例如两个任务各 2.5 秒,分别取整为 3 秒,汇总为 6 秒;不能先合并为 5 秒再取整。

用量回包不是扣费成功凭证。正常完成的任务、以及客户主动以正常关闭码 1000 中断的任务,按已处理的有效音频用量纳入计费,中途关闭不代表免费;平台 / 引擎失败、无法确认原因的网络断连或服务维护中断,不因回包中出现 duration 就认定收费。0 秒或计量不可用的任务不产生有效计费秒数。具体价格与结算以账号服务约定和账单为准。

超时矩阵

超时项

阈值

触发条件

结果

任务内音频间隔

20 秒

长时间未收到音频,具体超时与报错以服务返回为准

任务失败并关闭连接;请持续推流,不要依赖固定的引擎超时秒数

连接空闲

60 秒

连续 60 秒无任何上下行数据(含 ping)

以 1001 关闭,reason 含 idle timeout expired

服务维护等待在途任务

最长 5 分钟

实例发布 / 缩容时任务仍在进行

任务间隙的连接立即以 1001 关闭;在途任务等 task-finished 后以 1001 关闭;超时则下发 task-failed(SERVICE_DRAINING) 后以 1001 关闭

上行积压

服务端积压上限

瞬时灌入大量音频

task-failed(CLIENT_ERROR: client input overflow ...),随后以 1011 关闭

并发限制

  • 按工作空间限制同时在线的 WebSocket 连接数:连接建立即占用一路,连接关闭即释放一路。

  • 空闲连接同样占用额度。挂着不识别的连接不会自动让出槽位,用完请主动关闭。

  • 一条连接不能并行执行多个任务,并行识别请使用多条连接。

  • 超限的新连接在建立后立即以关闭码 4429 关闭(reason 为 CONCURRENCY_LIMIT_EXCEEDED,不下发 task-failed),已建立的连接不受影响。

  • 额度以服务开通约定为准,需要提升并发额度请联系平台。

错误码与关闭码

业务错误码(task-failed)

error_code

典型 error_message

关闭码

说明与处理

CLIENT_ERROR

invalid JSON message、header and payload must be JSON objects、missing header.action、unknown action: xxx

1000

指令格式错误,修正后重试;原样重试无效

CLIENT_ERROR

binary audio before run-task / upstream not ready、continue-task before run-task / upstream not ready、finish-task before run-task / upstream not ready

1000

未开启任务就发音频或指令;先 run-task,收到 task-started 再推流

CLIENT_ERROR

run-task while a task is already running

1000

同一连接上一任务未结束;等 task-finished 后再发,或另开连接

CLIENT_ERROR

vocabulary_id must be a platform dictionary UUID

1000

vocabulary_id 不是标准 UUID;改用平台词库 ID

CLIENT_ERROR

vocabulary_id requires a workspace-scoped credential

1000

凭证未归属工作空间,无法引用词库;改用工作空间凭证

CLIENT_ERROR

vocabulary_id not found、vocabulary_id has been deleted

1000

词库不存在、不属于当前工作空间或已删除;核对词库 ID

CLIENT_ERROR

vocabulary_id is not ready for model Qwen-Audio-ASR-VoicePica

1000

词库尚未就绪;确认词库创建 / 更新成功后重试

CLIENT_ERROR

hotwords has N entries after merging vocabulary_id, exceeds 1024、hotwords exceeds 32768 characters after merging vocabulary_id

1000

词库与任务级热词合并后超限;精简热词

CLIENT_ERROR

format xxx is not supported by model Qwen-Audio-ASR-VoicePica, use pcm, wav or opus、not supported by model Qwen-Audio-ASR-VoicePica: ...

1000

当前模型不支持的格式或能力;按错误信息去掉相应参数或转换音频格式

CLIENT_ERROR

commercial access denied or unavailable

1000

发起任务时服务使用权益被拒绝或暂不可用;核对账号服务状态并联系平台,不要持续无条件重试

CLIENT_ERROR

client input overflow: too many pending frames, please send audio at real-time pace

1011

瞬时灌入音频导致积压;按实时节奏推流,重新建连重做任务

MODEL_NOT_ALLOWED

model not allowed: xxx

1000

model 须填写 Qwen-Audio-ASR-VoicePica;若填写正确仍被拒绝,请核对账号服务开通状态并联系平台

CONFIG_MISSING

no available apiKey ...

1000

平台侧配置未就绪;联系平台,重试无效

UPSTREAM_ERROR

failed to establish upstream connection、vocabulary_id is temporarily unavailable, please retry

1000

识别引擎连接或词库读取暂时不可用;指数退避后重新建连

UPSTREAM_ERROR

识别引擎连接异常 / 中断

1011

指数退避后重新建连重试

SERVICE_DRAINING

server draining, please reconnect and retry

1001

实例维护,在途任务被中断;立即重新建连并重做该任务

其他(如 InvalidParameter)

识别引擎原文

1011

识别引擎拒绝了参数(如 format / sample_rate / language_hints 不合法)或其他引擎侧错误;按错误信息修正参数,无法判断时联系平台

WebSocket 关闭码

关闭码

含义

处理建议

1000

正常关闭;也出现在平台校验失败(CLIENT_ERROR / MODEL_NOT_ALLOWED / CONFIG_MISSING 等)之后

关闭码不代表任务成功,以是否收到 task-finished 及前一条 task-failed 判断

1001

服务端实例下线(发布 / 缩容),或连接空闲 70 秒被回收

立即重连(会路由到其他实例),无需退避;连续建连失败时短暂退避

1006

网络异常断开,或浏览器握手被拒(读不到真实状态码)

检查网络与凭证后重连,对照下方握手阶段错误排查

1009

单帧超过 64 KiB

减小分帧,音频建议每 100 ms 一帧

1011

识别引擎任务失败或连接中断、上行积压溢出、服务内部错误(关闭前通常先收到 task-failed)

按 error_code 处理;引擎 / 内部错误指数退避重连

4429

工作空间同时在线连接数已达上限,连接建立后立即关闭,不下发 task-failed

关闭闲置连接,延迟重连或申请提额

网络或传输异常时,task-failed 可能无法送达。未收到 task-finished 的任务不能仅因正常关闭码而视为完整完成。

握手阶段错误

握手阶段失败不会升级为 WebSocket,没有 task-failed,也没有应用层 Close 帧。

HTTP 状态码

原因

处理建议

401

凭证缺失、无效或过期;使用了百炼原生 Key

检查 Key 来源与 Bearer 前缀,刷新有效凭证后重连,不用原凭证反复重试

403

服务使用权益被拒绝,如未开通或已停服

核对账号服务状态,保存响应信息并联系平台

404

接口地址错误(拼写、大小写、结尾多了 /)

使用本文给出的完整地址

503

服务实例正在下线,或连接容量暂满

立即重试(新连接会落到其他实例),连续失败时短暂退避