豆包实时语音测试,可以自己做语音聊天系统
基于提供的三张图片内容,摘要如下:本文通过图文结合的方式展示了三个不同场景:第一张可能是自然风光或建筑景观;第二张呈现了某种机械设备或电子装置的细节;第三张则聚焦于一个带有文字说明的技术图表或设计图纸。三张图片共同构成了一个技术性或科普性的视觉展示,可能涉及工程、设计或自然科学领域的具体应用案例。图片内容暗示了主题的专业性和实践导向,适合作为技术文档或教学材料的辅助说明。
·



官方指导方案:
豆包实时语音大模型 API 官方指导文档
文档来源:端到端实时语音大模型API接入文档 – 豆包语音-火山引擎
整理时间:2026年4月10日
目录
1. 概述
豆包实时语音大模型提供端到端实时语音交互能力,支持:
- 实时语音识别(ASR):将用户的语音实时转换为文本
- 大模型推理(Chat):基于对话历史生成智能回复
- 实时语音合成(TTS):将大模型回复实时转换为语音
采用 WebSocket 长连接,二进制协议通信,延迟低、响应快。
2. 音频格式要求
2.1 客户端上传音频格式
| 参数 | 要求 |
|---|---|
| 格式 | PCM(脉冲编码调制,未经压缩的音频格式) |
| 声道 | 单声道 |
| 采样率 | 16000 Hz |
| 位深 | int16 |
| 字节序 | 小端序(Little-Endian) |
2.2 服务端返回音频格式
| 模式 | 格式 | 说明 |
|---|---|---|
| 默认 | OGG 封装的 Opus 音频 | 兼顾压缩效率与传输性能 |
| 自定义 | PCM 格式 | 需在 StartSession 事件中配置 TTS audio_config |
PCM 格式详细参数:
- 单声道
- 24000 Hz 采样率
- 16 bit 位深
- 字节序为小端序
3. 交互流程
3.1 标准交互流程(server_vad 模式)
RealtimeAPI 的交互流程目前只支持 server_vad 模式,该模式的交互流程如下:
- 客户端发送 StartSession 事件:初始化会话,配置音频格式、模型参数等
- 客户端持续发送 TaskRequest 事件:将音频流发送到服务端
- 可以发送完整的音频流(包括静音部分)
- 服务端通过 VAD(Voice Activity Detection)自动检测语音活动
- 服务端返回事件:
- ASRInfo(Event 450):模型识别出音频流中的首字时返回
- ASRResponse(Event 451):模型识别出用户说话的文本内容(可能包含中间结果)
- ASREnded(Event 459):模型认为用户说话结束时返回
- TTSResponse(Event 352):返回模型生成的音频数据
- ChatResponse(Event 550):返回模型回复的文本内容
- 客户端发送 FinishSession 事件(可选):结束当前会话
3.2 交互流程图
┌──────────┐ ┌─────────────┐
│ 客户端 │ │ RealtimeAPI │
└─────┬────┘ └──────┬──────┘
│ │
│ ───────── StartSession ────────────────> │ (1) 初始化会话
│ │
│ ◄──────── SessionStarted ─────────────── │ (2) 会话建立成功
│ │
│ ───────── TaskRequest ─────────────────> │ (3) 持续发送音频流
│ (可多次发送,包含静音数据) │
│ │
│ ◄──────── ASRInfo ────────────────────── │ (4) 检测到首字
│ ◄──────── ASRResponse ────────────────── │ (5) ASR 识别结果
│ ◄──────── ASREnded ───────────────────── │ (6) 用户说话结束
│ │
│ ◄──────── TTSResponse ────────────────── │ (7) 返回 TTS 音频
│ ◄──────── ChatResponse ───────────────── │ (8) 返回文本回复
│ │
│ ───────── FinishSession ───────────────> │ (9) 结束会话(可选)
│ ◄──────── SessionFinished ────────────── │ (10) 会话结束确认
│ │
关键说明:
- 客户端应持续发送音频流,即使没有说话(静音数据)
- 服务端通过 server_vad 自动检测语音活动
- ASR 和 TTS 事件可能交替返回,客户端需正确处理
4. 消息头格式
4.1 消息头结构
所有消息均采用二进制格式,消息头固定为 4 字节:
| 字节偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 4 bits | Protocol Version | 协议版本(当前为 1) |
| 0 | 4 bits | Header Size | 消息头大小(当前为 1,表示 4 字节) |
| 1 | 4 bits | Message Type | 消息类型(见下表) |
| 1 | 4 bits | Flags | 标志位 |
| 2 | 4 bits | Serialization | 序列化方式(0x01=JSON, 0x02=Protobuf) |
| 2 | 4 bits | Compression | 压缩方式(0x00=无压缩) |
| 3 | 8 bits | Reserved | 保留字段 |
4.2 Message Type(消息类型)
| 值(十六进制) | 说明 | 方向 |
|---|---|---|
| 0x01 | Full-client request | 客户端 → 服务端 |
| 0x02 | Audio-only request (TaskRequest) | 客户端 → 服务端 |
| 0x09 | Full-server response | 服务端 → 客户端 |
| 0x0B | Audio-only response (TTSResponse) | 服务端 → 客户端 |
| 0x0F | Error information | 服务端 → 客户端 |
4.3 Flags(标志位)
| 位 | 含义 |
|---|---|
| bit 0 | 保留 |
| bit 1 | 保留 |
| bit 2 | 1 表示包含 Event ID |
| bit 3 | 1 表示包含 Session ID |
4.4 消息结构
客户端请求消息(Full-client request)
┌─────────────────────────────────────────┐
│ Message Header (4 bytes) │
├─────────────────────────────────────────┤
│ Event ID (4 bytes, optional) │ ← 当 Flags bit 2 = 1
├─────────────────────────────────────────┤
│ Session ID Size (4 bytes) │ ← 当 Flags bit 3 = 1
├─────────────────────────────────────────┤
│ Session ID (variable length) │ ← 当 Flags bit 3 = 1
├─────────────────────────────────────────┤
│ Payload Size (4 bytes) │
├─────────────────────────────────────────┤
│ Payload (variable) │
└─────────────────────────────────────────┘
服务端响应消息(Full-server response)
┌─────────────────────────────────────────┐
│ Message Header (4 bytes) │
├─────────────────────────────────────────┤
│ Event ID (4 bytes, optional) │ ← 当 Flags bit 2 = 1
├─────────────────────────────────────────┤
│ Session ID Size (4 bytes) │ ← 当 Flags bit 3 = 1
├─────────────────────────────────────────┤
│ Session ID (variable length) │ ← 当 Flags bit 3 = 1
├─────────────────────────────────────────┤
│ Payload Size (4 bytes) │
├─────────────────────────────────────────┤
│ Payload (variable) │
└─────────────────────────────────────────┘
注意: 服务端响应消息中也包含 Session ID,用于标识该响应属于哪个会话。
5. 事件定义
5.1 客户端事件
| Event ID | 事件名称 | 说明 | Payload 格式 |
|---|---|---|---|
| 50 | StartConnection | 建立连接 | {} |
| 100 | StartSession | 初始化会话 | JSON 配置对象 |
| 200 | TaskRequest | 发送音频数据 | 二进制音频数据(PCM) |
| 150 | FinishSession | 结束会话 | {} |
5.2 服务端事件
| Event ID | 事件名称 | 说明 | Payload 格式 |
|---|---|---|---|
| 50 | ConnectionStarted | 连接建立成功 | Session ID(字符串) |
| 150 | SessionStarted | 会话建立成功 | Session ID(字符串) |
| 350 | TTSSentenceStart | AI 开始说话 | {} |
| 352 | TTSResponse | 返回 TTS 音频数据 | 二进制音频数据 |
| 359 | TTSEnded | TTS 播放结束 | {} |
| 450 | ASRInfo | 识别到首字 | {"question_id": STRING} |
| 451 | ASRResponse | ASR 识别结果 | {"results": [{"text": STRING, "is_interim": BOOLEAN}]} |
| 459 | ASREnded | 用户说话结束 | {} |
| 550 | ChatResponse | 模型文本回复 | {"content": STRING, "question_id": STRING, "reply_id": STRING} |
| 600 | SessionFinished | 会话结束 | {} |
| 0x0F | Error | 错误信息 | {"code": INT, "message": STRING} |
5.3 StartSession 事件配置
StartSession 事件的 Payload 是一个 JSON 对象,包含以下字段:
{
"user": {
"uid": "user_unique_id"
},
"audio": {
"format": "pcm",
"sample_rate": 16000,
"channels": 1,
"codec": "raw"
},
"request": {
"model_name": "O2.0",
"model_version": "1.2.1.1",
"speaker": "zh_female_vv_jupiter_bigtts",
"work_mode": "pure-end-to-end",
"output_mode": 0,
"bot_name": "AI助手",
"system_role": "你是一个专业、友好的 AI 销售助手",
"speaking_style": "自然、亲切、口语化",
"asr": {
"extra": {
"end_smooth_window_ms": 1500,
"enable_custom_vad": false,
"enable_asr_twopass": false,
"context": {}
}
},
"tts": {
"speaker": "zh_female_vv_jupiter_bigtts",
"audio_config": {
"channel": 1,
"format": "pcm_s16le",
"sample_rate": 24000
},
"extra": {
"speech_rate": 0,
"loudness_rate": 0
}
},
"dialog": {
"extra": {
"strict_audit": true,
"input_mod": "keep_alive",
"enable_music": false
}
}
}
}
6. Session 管理
6.1 Session 生命周期
┌──────────────┐
│ 空闲状态 │
└──────┬───────┘
│
│ StartSession
▼
┌──────────────┐
│ 会话进行中 │ ◄─── 持续通信(TaskRequest → ASR/TTS/Chat)
└─────────────┘
│
│ FinishSession 或 异常断开
▼
┌──────────────┐
│ 会话已结束 │
└──────────────┘
6.2 Session 复用
重要规则:
- 在客户端发送 FinishSession 事件后,系统将不再返回任何事件
- 但客户端仍可复用与火山语音网关之间的 WebSocket 连接
- 若需发起新的会话,客户端需重新从 StartSession 事件开始
- 同一 WebSocket 连接可以支持多个 Session(按顺序)
6.3 Session 复用流程图
┌────────────┐ ┌─────────────┐
│ 客户端 │ │ RealtimeAPI │
└──────┬─────┘ └────────────┘
│ │
│ ────── 停止发送客户端事件 ──────> │
│ │
│ ──────── FinishSession ─────────> │
│ │
│ ◄──── ASR事件 ❌ ─────────────── │
│ ◄──── TTS事件 ❌ ────────────── │ 服务端正在按顺序返回事件
│ ◄──── Chat事件 ❌ ────────────── │
│ │
│ ◄──── SessionFinished ───────── │
│ │
│ ──────── StartSession ─────────> │ (复用同一连接)
│ ──────── 其他客户端事件 ───────> │
│ │
说明:
- FinishSession 后,服务端会按顺序返回所有待处理的事件
- 收到 SessionFinished 后,该 Session 完全结束
- 可以在同一 WebSocket 连接上发起新的 StartSession
7. 服务端返回机制
7.1 事件返回顺序
服务端按照以下顺序返回事件:
-
ASR 相关事件(按时间顺序)
- ASRInfo → ASRResponse(可能多次) → ASREnded
-
TTS 相关事件(按时间顺序)
- TTSSentenceStart → TTSResponse(可能多次) → TTSEnded
-
Chat 事件
- ChatResponse(可能多次,流式返回)
-
Session 控制事件
- SessionStarted / SessionFinished
7.2 并发处理
- 客户端可以并发处理多个事件流
- ASR 和 TTS 事件可能交叉出现
- 建议客户端使用事件队列或异步处理机制
7.3 错误处理
- 遇到 Error 事件(0x0F)时,客户端应记录错误信息
- 严重错误可能导致 WebSocket 连接断开
- 建议实现自动重连机制
附录:开发注意事项
A1. 音频发送频率
- 建议每次发送 20-50ms 的音频数据
- 采样率 16kHz、单声道、int16 格式下,20ms 约 640 bytes
- 保持稳定的发送频率,避免突发大量数据
A2. 静音数据处理
- 即使没有说话,也应持续发送静音数据
- 静音数据帮助服务端维持 VAD 状态
- 避免长时间不发送数据导致超时断开
A3. TTS 音频播放
- TTSResponse 返回的是 PCM 音频块
- 需要累积多个音频块后连续播放
- 注意音频格式:24kHz、单声道、int16、小端序
- 播放时注意音频增益和降噪处理
A4. 网络延迟优化
- 使用 WebSocket 长连接,避免频繁建立连接
- 复用 Session 减少初始化开销
- 合理设置超时时间(建议 30-60 秒)
A5. 错误恢复
- 实现断线重连机制
- 保存 Session 状态以便恢复
- 记录关键事件日志便于排查问题
版本信息
- 文档版本: v1.0
- 协议版本: v1
- API 版本: 豆包实时语音大模型 v1.2.1.1
- 整理日期: 2026-04-10
参考资源
- 原始文档:端到端实时语音大模型API接入文档 – 豆包语音-火山引擎
- 服务提供商:火山引擎
- 技术支持:豆包语音 API 文档中心
更多推荐



所有评论(0)