豆包端到端实时语音大模型API即RealtimeAPI支持低延迟、多模式交互,可用于构建语音到语音的对话工具。该API支持中文和英语两大语种,目前只支持WebSocket协议连接到此API,同时支持客户边发送数据边接收数据的流式交互方式。
int16
表示、字节序为小端序。{ "tts" : { "audio_config": { "channel": 1, "format": "pcm", "sample_rate": 24000 } } }
WebSocket是一种广泛支持的实时数据传输API,也是服务器应用程序中连接到豆包端到端实时语音大模型API的最佳选择。在客户服务器上集成此API时候,可以通过WebSocket直接连接到实时语音大模型API,具体鉴权参数可以在火山控制台获取。
URL | wss://openspeech.bytedance.com/api/v3/realtime/dialogue | |||
---|---|---|---|---|
Request Headers | Key | 说明 | 是否必须 | Value示例 |
X-Api-App-ID | 使用火山引擎控制台获取的APP ID,可参考 控制台使用FAQ-Q1 | 是 | 123456789 | |
X-Api-Access-Key | 使用火山引擎控制台获取的Access Token,可参考 控制台使用FAQ-Q1 | 是 | your-access-key | |
X-Api-Resource-Id | 表示调用服务的资源信息 ID | 是 | volc.speech.dialog | |
X-Api-App-Key | 固定值 | 是 | PlgvMymc7f3tQnJ6 | |
X-Api-Connect-Id | 用于追踪当前连接情况的标志 ID | 否 | d1dcd999-9a9e-4ed6-b227-8649e946f6c4 |
Key | 说明 | Value示例 |
---|---|---|
X-Tt-Logid | 服务端返回的 logid,建议用户获取和打印方便定位问题 | 20250506234111719BC62BBA7C4C0C635A |
豆包端到端实时语音大模型API使用二进制协议传输数据,协议由4字节的header、optioanl、payload size和payload三部分组成,其中:
Byte | Left-4bit | Right-4bit | 说明 |
---|---|---|---|
0 | Protocol Version | 目前只有v1,固定0b0001 | |
Header Size | 目前只有4字节固定0b0001 | ||
1 | Message Type | Message type specific flags | 详细见下面消息说明 |
2 | Serialization method |
| |
Compression method |
| ||
3 | 0x00 | Reserved |
Message Type | 含义 | 说明 |
---|---|---|
0b0001 | Full-client request | 客户端发送文本事件的消息类型 |
0b1001 | Full-server response | 服务器返回的文本事件的消息类型 |
0b0010 | Audio-only request | 客户端发送音频数据的消息类型 |
0b1011 | Audio-only response | 服务器返回音频数据的消息类型 |
0b1111 | Error information | 服务器返回的错误事件的消息类型 |
Optional可选字段code、sequence、event取决于Message type specific flags,而connect id和session id取决于事件类型。如果设置对应flag请按照表格顺序进行二进制组装。目前支持的全集如下所示:
字段 | 长度(Byte) | 说明 | Message type specific flags |
---|---|---|---|
code | 4 | 【可选】错误码code |
|
sequence | 4 | 【可选】描述客户端的事件序号 |
|
event | 4 | 【必须】描述连接过程中状态管理的预定义事件,详细参考实时对话事件中的事件ID |
|
connect id size | 4 | 【可选】客户事件携带的connect id对应的长度,只有Connect事件才能携带此字段 | —— |
connect id | 取决于connect id size | 【可选】客户生成的connect id | |
session id size | 4 | 【必须】客户事件携带的session id对应的长度,只有Session级别的事件携带此字段 | |
session id | 取决于session id size | 【必须】客户事件携带的session id |
payload可以放音频二进制数据,也可以放类似StartSession事件中的json数据。
字段 | 长度(Byte) | 说明 |
---|---|---|
payload size | 4 | paylaod长度 |
payload | 长度取决于payload size | payload内容,可以是二进制音频数据,也可以是json字符串 |
{ "error": {{STRING}} }
通过WebSocket连接到豆包端到端实时语音大模型API之后,可以调用S2S模型
进行语音到语音的对话。需要发送客户端事件来启动操作,并监听服务器事件以采取对应的操作。
事件ID | 事件定义 | 事件类型 | 说明 | 示例 |
---|---|---|---|---|
1 | StartConnection | Connect类事件 | Websocket 阶段申明创建连接 |
|
2 | FinishConnection | 断开websocket连接,后面需要重新发起websocket连接 | ||
100 | StartSession | Session类事件 | Websocket 阶段申明创建会话,其中:
|
|
102 | FinishSession | 客户端声明结束会话,后面可以复用websocket连接 |
| |
200 | TaskRequest | 客户端上传音频 | 音频二进制数据 | |
300 | SayHello | 客户端提交打招呼文本 |
| |
500 | ChatTTSText | 用户query之后,模型会生成闲聊结果。如果客户判断用户query不需要闲聊结果,可以指定文本合成音频 |
|
备注:
[17 20 16 0 0 0 0 100 0 0 0 36 55 53 97 54 49 50 54 101 45 52 50 55 102 45 52 57 97 49 45 97 50 99 49 45 54 50 49 49 52 51 99 98 57 100 98 51 0 0 0 60 123 34 100 105 97 108 111 103 34 58 123 34 98 111 116 95 110 97 109 101 34 58 34 232 177 134 229 140 133 34 44 34 100 105 97 108 111 103 95 105 100 34 58 34 34 44 34 101 120 116 114 97 34 58 110 117 108 108 125 125]
{ "start": true, "content": "今天是", "end": false }
{ "start": false, "content": "星期二。", "end": false }
{ "start": false, "content": "", "end": true }
事件ID | 事件定义 | 事件类型 | 说明 | 示例 |
---|---|---|---|---|
50 | ConnectionStarted | Connect类 | 成功建立连接 |
|
51 | ConnectionFailed | 建立连接失败 |
| |
52 | ConnectionFinished | 连接结束 |
| |
150 | SessionStarted | Session类 | 成功启动会话,返回的dialog id用于接续最近的对话内容,增加模型智能度 |
|
152 | SessionFinished | 会话已结束 |
| |
153 | SessionFailed | 会话失败 |
| |
350 | TTSSentenceStart | 合成音频的起始事件,tts_type取值类型有:
|
| |
351 | TTSSentenceEnd | 合成音频的分句结束事件 |
| |
352 | TTSResponse | 返回模型生成的音频数据 | payload装载二进制音频数据 | |
359 | TTSEnded | 模型一轮音频合成结束事件 |
| |
450 | ASRInfo | 模型识别出音频流中的首字返回的事件,用于打断客户端的播报 | ||
451 | ASRResponse | 模型识别出用户说话的文本内容 |
| |
459 | ASREnded | 模型认为用户说话结束的事件 |
| |
550 | ChatResponse | 模型回复的文本内容 |
| |
559 | ChatEnded | 模型回复文本结束事件 |
|
备注:
您可以通过以下步骤,快速体验与 Realtime 模型API实时对话的功能。
gordonklaus/portaudio
依赖进行安装:
brew install portaudio
sudo yum install -y portaudio portaudio-devel
sudo apt-get install portaudio19-dev
go执行命令:go run . -v=0 python执行命令:python main.py
RealtimeAPI的交互流程目前只支持server_vad模式,该模式的交互流程如下:
当客户判定不使用模型生成闲聊内容时,系统允许客户多次上传文本执行音频合成,以满足多样化需求。整体交互示例如下所示:
类型 | 错误码 | 错误定义 | 说明 |
---|---|---|---|
客户端 | 45000002 | Empty audio | 客户上传空的音频包,即TaskRequest事件中的音频长度为0 |
45000003 | Abnormal silence audio | 10分钟静音释放链接 | |
服务端 | 55000001 | Server processing error | 服务端超过10秒没有收到query音频(客户端想要保持链接需要一直发送静音音频) |
下游服务超过35秒没有收到tts回复 | |||
服务端处理错误(通用型错误,需要借助logid进行深入排查) | |||
55000030 | Service unavailable | 下游模块建立连接失败 | |
55002070 | AudioFlow error | 下游返回错误信息,统一对外的错误码 |
日期 | update |
---|---|
25.06.10 | 更新realtime_dialog示例,用户query打断本地播放音频 |
25.06.05 | 更新realtime_dialog 示例,ctrl+c之后发送FinishSession、FinishConnection事件之后,再调用close断开websocket连接 |
25.06.05 | 补充客户接入ChatTTSText的最佳实践 |
25.06.04 | 删除服务端返回的UsageResponse事件,客户可以在火山控制台查看用量 |
25.06.04 | 更新realtime_dialog Go示例demo,新增sayHello、chatTTSTesxt数据构造示例 |
25.06.03 | 新增realtime_dialog Python示例demo |
25.05.30 | 更新realtime_dialog示例,新增pcm保存到文件代码示例 |
25.05.30 | 更新Message type specific flags说明,注明必须传的字段 |
25.05.28 | 更新realtime_dialog Go示例demo,修复录音上传慢问题 |