流式语音识别服务
产品简介
本服务提供基于WebSocket和SSE的高性能流式ASR(自动语音识别)能力,支持实时音频流输入并即时返回识别文字、以及一次性提交音频并流式返回识别文字。
核心特性
- 双模式支持:提供WebSocket双向交互与SSE单向推送两种接口
- 实时响应:支持流式音频输入与增量文本输出,低延迟体验
- VAD检测:内置语音活动检测,精准识别语音起始与结束,支持返回时间戳
- 多格式兼容:支持WAV, PCM, MP3, OPUS等主流格式
- 语言支持:支持中英文,暂不支持其他语种和中文方言
同时提供两种接入模式,适配不同业务形态:
| 模式 | 使用场景 |
|---|---|
| 双向流式(WebSocket) | 实时对话、语音助手、车载、会议字幕 |
| 单向流式(HTTP + SSE) | 语音文件转写、准实时处理、后端任务 |
接入方式总览
| 能力 | 双向流式 | 单向流式 |
|---|---|---|
| 音频输入 | 流式分片 | 一次性提交 |
| 结果返回 | 流式增量 + 完成事件 | SSE 流式 |
| 连接方式 | WebSocket | HTTP POST |
| 是否保持会话 | 是 | 否 |
| 典型端 | 前端 / 设备端 | 服务端 |
服务地址
| 协议 | 环境 | 地址 | 说明 |
|---|---|---|---|
| WebSocket | 正式环境 | wss://api.stepfun.com/v1/realtime/asr/stream | 双向实时流 |
| HTTP/SSE | 正式环境 | https://api.stepfun.com/v1/audio/asr/sse | 单向流式响应 |
Websocket协议接口
时序图
服务端vad 开启时:
服务端 vad 未开启时:
鉴权参数
| 参数名 | 必填 | 描述 | 示例 |
|---|---|---|---|
| Authorization | 是 | 认证令牌 | Bear {token} |
客户端消息类型
会话更新消息 (session.update)
用于更新会话配置,包括音频格式、转录参数等。
请求示例:
{
"event_id": "event_123",
"type": "session.update",
"session": {
"audio": {
"input": {
"format": {
"type": "pcm",
"codec": "pcm_s16le",
"rate": 16000,
"bits": 16,
"channel": 1
},
"transcription": {
"model": "step-asr",
"language": "zh",
"prompt": "请记录下你所听到的语音内容。",
"full_rerun_on_commit": true,
"enable_itn": true
},
"turn_detection": {
"type": "server_vad",
"silence_duration_ms": 800,
"threshold": 0.5,
}
}
}
}
}| 参数路径 | 类型 | 描述 | 示例值 |
|---|---|---|---|
format | Object | 音频格式配置 | |
└ type | String | 容器格式,支持 pcm, ogg | "pcm" |
└ codec | String | 编码格式,pcm_s16le,仅 type 为 pcm 时需传 | "pcm_s16le" |
└ rate | Int | 采样率,默认推荐 16000 | 16000 |
└ bits | Int | 位深,推荐 16 | 16 |
└ channel | Int | 通道数,推荐 1(单声道) | 1 |
transcription | Object | 转录参数配置 | |
└ model | String | 模型名称,目前支持 step-asr | "step-asr" |
└ language | String | 目标语言代码 | "zh" |
└ full_rerun_on_commit | bool | 用于判断是否开启二遍识别纠错,默认 false 关闭 | true |
└ enable_itn | bool | 是否开启 ITN,默认 true 开启 | true |
└ prompt | String | 系统提示词,用于纠正专业术语或提升准确性 | "请记录你听到的语音内容,相关的参考文本如下:裘千仞,沪惠保是一款面向上海市基本医疗保险参保人员的商业医疗保险" |
turn_detection | Object | VAD(语音活动检测)配置 | |
└ type | String | 检测类型,支持 server_vad;如果不传则服务端不会进行 VAD,需要用户主动提交音频缓冲区提交消息(input_audio_buffer.commit) | "server_vad" |
└ silence_duration_ms | Int | 静音阈值(毫秒),超过此时间判定为一句话结束 | 700 |
音频数据追加消息 (input_audio_buffer.append)
发送音频数据进行实时识别。 请求示例:
{
"event_id": "event_124",
"type": "input_audio_buffer.append",
"audio": "base64_encoded_audio_data"
}| 字段 | 类型 | 必需 | 描述 |
|---|---|---|---|
event_id | string | 是 | 事件唯一标识 |
audio | string | 是 | base64 编码的音频数据(WAV 格式) |
音频缓冲区提交消息 (input_audio_buffer.commit)
仅在关闭了 server_vad 时,才需要提交该消息,是指要求服务端提交音频缓冲区,触发转录处理
{
"event_id": "event_125",
"type": "input_audio_buffer.commit"
}字段说明
| 字段 | 类型 | 必需 | 描述 |
|---|---|---|---|
| event_id | string | 是 | 事件唯一标识 |
服务端消息类型
会话创建确认 (session.created)
确认会话创建成功。
{
"event_id": "319612d9-aede-4456-a1fd-bb9c21493cd9",
"type": "session.updated",
"meta": {
"session_id": "test_trace_1766470129914296764",
"timestamp": 1766468589040
},
"session": {
"audio": {
"input": {
"transcription": {
"language": "zh"
},
"format": {
"type": "pcm",
"codec": "pcm_s16le",
"rate": 16000,
"bits": 16,
"channel": 1
},
"turn_detection": {
"type": "server_vad",
"silence_duration_ms": 800
}
}
}
}
}会话更新确认 (session.updated)
确认会话配置更新成功。
{
"event_id": "319612d9-aede-4456-a1fd-bb9c21493cd9",
"type": "session.updated",
"meta": {
"session_id": "test_trace_1766470129914296764",
"timestamp": 1766468589040
},
"session": {
"audio": {
"input": {
"transcription": {
"language": "zh"
},
"format": {
"type": "pcm",
"codec": "pcm_s16le",
"rate": 16000,
"bits": 16,
"channel": 1
},
"turn_detection": {
"type": "server_vad",
"silence_duration_ms": 800
}
}
}
}
}语音开始事件 (input_audio_buffer.speech_started)
仅在开启了 server_vad 时才会返回该事件,指服务端检测到语音开始。
{
"event_id": "319612d9-aede-4456-a1fd-bb9c21493cd9",
"type": "input_audio_buffer.speech_started",
"meta": {
"session_id": "test_trace_1766470129914296764",
"timestamp": 1766470145337
},
"audio_start_ms": 15240,
"item_id": "item_26cbd6a7-16e8-44c9-b6b4-d4d3b3c87b41"
}语音结束事件 (input_audio_buffer.speech_stopped)
仅在开启了 server_vad 时才会返回该事件,指服务端检测到语音结束。
{
"event_id": "406d719a-3392-4ca4-88b3-9f12d8189b74",
"type": "input_audio_buffer.speech_stopped",
"meta": {
"session_id": "test_trace_1766470129914296764",
"timestamp": 1766470143512
},
"audio_start_ms": 13480,
"item_id": "item_8228b4a6-f127-4a60-8f33-20fcb7d9ff7d"
}音频缓冲区提交确认 (input_audio_buffer.committed)
确认音频缓冲区已提交。
{
"event_id": "event_xxx",
"type": "input_audio_buffer.committed",
"meta": {
"session_id": "sess_xxx",
"timestamp": 1642694400000
},
"item_id": "item_xxx",
"previous_item_id": "item_yyy"
}对话项创建事件 (conversation.item.created)
新的对话项(转录结果)已创建。
{
"event_id": "event_xxx",
"type": "conversation.item.created",
"meta": {
"session_id": "sess_xxx",
"timestamp": 1642694400000
},
"previous_item_id": "item_yyy",
"item": {
"id": "item_xxx",
"object": "realtime.item",
"type": "message",
"status": "in_progress",
"role": "user",
"content": [
{
"type": "input_audio"
}
]
}
}转录增量事件 (conversation.item.input_audio_transcription.delta)
返回转录增量结果(流式输出)。
{
"event_id": "event_xxx",
"type": "conversation.item.input_audio_transcription.delta",
"meta": {
"session_id": "sess_xxx",
"timestamp": 1642694400000
},
"item_id": "item_xxx",
"content_index": 0,
"text": "你好",
"start_time": 0,
"end_time": 500
}字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
| item_id | string | 对话项ID |
| content_index | int | 内容索引 |
| text | string | 增量转录文本 |
| start_time | int64 | 开始时间(毫秒) |
| end_time | int64 | 结束时间(毫秒) |
转录完成事件 (conversation.item.input_audio_transcription.completed)
返回完整转录结果。
{
"event_id": "event_xxx",
"type": "conversation.item.input_audio_transcription.completed",
"meta": {
"session_id": "sess_xxx",
"timestamp": 1642694400000
},
"item_id": "item_xxx",
"content_index": 0,
"transcript": "你好,世界",
"usage": {
"prompt_tokens": 0,
"completion_tokens": 10,
"total_tokens": 10
}
}字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
| item_id | string | 对话项ID |
| content_index | int | 内容索引 |
| transcript | string | 完整转录文本 |
| usage | object | 使用统计信息 |
错误消息 (error)
返回错误信息。
{
"event_id": "event_xxx",
"type": "error",
"meta": {
"session_id": "sess_xxx",
"timestamp": 1642694400000
},
"error": {
"type": "invalid_request_error",
"code": "invalid_value",
"message": "错误描述",
"param": "audio",
"event_id": "event_xxx"
}
}错误类型
| 类型 | 描述 |
|---|---|
| invalid_request_error | 请求参数错误 |
| internal_error | 服务器内部错误 |
| risk | 内容安全风险 |
错误码
| 错误码 | 描述 |
|---|---|
| invalid_value | 无效参数值 |
| missing_param | 缺少必需参数 |
| internal_error | 内部错误 |
| max_idle_timeout | 空闲超时 |
| pong_timeout | 心跳超时 |
| risk_blocked | 内容被拦截 |
HTTP协议接口
时序图
鉴权参数
| 参数名 | 必填 | 描述 | 示例 |
|---|---|---|---|
| Content-Type | 是 | 固定为 application/json | application/json |
| Accept | 是 | 固定为 text/event-stream | text/event-stream |
| Authorization | 是 | 认证令牌 | sk-xxxx |
请求格式
{
"audio": {
"data": "audioData",
"input": {
"transcription": {
"language": "zh",
"prompt": "请记录下你所听到的语音内容。相关的参考文本如下:音频转录,语音识别,实时处理,转录测试",
"model": "step-asr",
"full_rerun_on_commit": true,
"enable_itn": true
},
"format": {
"type": "pcm",
"codec": "pcm_s16le",
"rate": 16000,
"bits": 16,
"channel": 1
}
}
}
}参数说明
| 参数名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| format | Object | 音频格式配置 | |
| └ type | String | 容器格式,支持 pcm, ogg | ”pcm” |
| └ codec | String | 编码格式,pcm_s16le,仅type为pcm时需传 | ”pcm_s16le” |
| └ rate | Int | 采样率,默认推荐 16000 | 16000 |
| └ bits | Int | 位深,推荐 16 | 16 |
| └ channel | Int | 通道数,推荐 1 (单声道) | 1 |
| transcription | Object | 转录参数配置 | |
| └ model | String | 模型名称,目前支持 step-asr | ”step-asr” |
| └ language | String | 目标语言代码 | ”zh” |
| └ full_rerun_on_commit | bool | 用于判断是否开启二遍识别纠错,默认false关闭 | true |
| └ enable_itn | bool | 是否开启itn,默认true开启 | true |
| └ prompt | String | 系统提示词,用于纠正专业术语或提升准确性 | ”请记录你听到的语音内容,相关的参考文本如下:裘千仞,沪惠保是一款面向上海市基本医疗保险参保人员的商业医疗保险” |
响应格式
SSE流式响应,包含以下事件类型:
Delta事件 (transcript.text.delta)
{
"type": "transcript.text.delta",
"meta": {
"session_id": "sse_1642694400123456789",
"timestamp": 1642694400123
},
"delta": "识别的"
}| 字段 | 类型 | 描述 |
|---|---|---|
| type | string | 事件类型,固定为 transcript.text.delta |
| meta.session_id | string | 会话ID |
| meta.timestamp | int64 | Unix时间戳(毫秒) |
| delta | string | 增量转录文本 |
Done事件 (transcript.text.done)
{
"type": "transcript.text.done",
"meta": {
"session_id": "sse_1642694400123456789",
"timestamp": 1642694400456
},
"text": "识别的完整文字内容",
"usage": {
"type": "realtime_asr",
"input_tokens": 1000,
"input_token_details": {
"text_tokens": 0,
"audio_tokens": 1000
},
"output_tokens": 50,
"total_tokens": 1050
}
}| 字段 | 类型 | 描述 |
|---|---|---|
| type | string | 事件类型,固定为 transcript.text.done |
| meta.session_id | string | 会话ID |
| meta.timestamp | int64 | Unix时间戳(毫秒) |
| text | string | 完整转录文本 |
| usage | object | 使用统计信息 |
错误事件 (error)
{
"type": "error",
"meta": {
"session_id": "sse_1642694400123456789",
"timestamp": 1642694400789
},
"message": "错误描述信息"
}| 字段 | 类型 | 描述 |
|---|---|---|
| type | string | 事件类型,固定为 error |
| meta.session_id | string | 会话ID |
| meta.timestamp | int64 | Unix时间戳(毫秒) |
| message | string | 错误描述信息 |
错误处理
常见错误类型
- invalid_request_error: 请求参数错误
- internal_error: 服务器内部错误
- risk: 内容安全风险
故障排除
- 连接失败: 检查服务是否启动,端口是否正确
- 音频无识别结果: 确认音频格式、编码和质量
- 识别准确性低: 尝试使用系统提示词或更换模型
- 延迟过高: 减少音频分块大小或使用轻量级模型
Last updated on