豆包端到端实时语音大模型API即RealtimeAPI支持低延迟、多模式交互,可用于构建语音到语音的对话工具。该API支持中文和英语两大语种,目前只支持WebSocket协议连接到此API,同时支持客户边发送数据边接收数据的流式交互方式。
功能 | O版本 | O2.0版本 | SC版本 | SC2.0版本 |
|---|---|---|---|---|
精品音色(vv、xiaohe、yunzhou、xiaotian) | ✅ | ✅ | ❌ | ❌ |
System Prompt开放配置 | ✅ | ✅ | ✅ | ✅ |
克隆音色1.0( | ❌ | ❌ | ✅ | ❌ |
克隆音色2.0( | ❌ | ❌ | ❌ | ✅ |
注:当前“端到端实时语音大模型”控制台直接购买的克隆音色均为1.0音色,2.0音色需要前往“声音复刻模型2.0”页面进行购买。
int16表示、字节序为小端序。
{ "asr": { "audio_info": { "format": "speech_opus", "sample_rate": 16000, "channel": 1 } } }
{ "tts" : { "audio_config": { "channel": 1, "format": "pcm", "sample_rate": 24000 } } }
{ "tts" : { "audio_config": { "channel": 1, "format": "pcm_s16le", "sample_rate": 24000 } } }
{ "tts": { "speaker": {{STRING}} } }
SC版本
SC2.0版本
saturn_zh_female_aojiaonvyou_tob
saturn_zh_female_bingjiaojiejie_tob
saturn_zh_female_chengshujiejie_tob
saturn_zh_female_keainvsheng_tob
saturn_zh_female_nuanxinxuejie_tob
saturn_zh_female_tiexinnvyou_tob
saturn_zh_female_wenrouwenya_tob
saturn_zh_female_wumeiyujie_tob
saturn_zh_female_xingganyujie_tob
saturn_zh_male_aiqilingren_tob
saturn_zh_male_aojiaogongzi_tob
saturn_zh_male_aojiaojingying_tob
saturn_zh_male_aomanshaoye_tob
saturn_zh_male_badaoshaoye_tob
saturn_zh_male_bingjiaobailian_tob
saturn_zh_male_bujiqingnian_tob
saturn_zh_male_chengshuzongcai_tob
saturn_zh_male_cixingnansang_tob
saturn_zh_male_cujingnanyou_tob
saturn_zh_male_fengfashaonian_tob
saturn_zh_male_fuheigongzi_tob
除了官方克隆音色之外,客户还可以在火山豆包语音控制台开通、上传音频训练自定义克隆音色等功能。
2. SC2.0版本在豆包声音复刻模型2.0商品里面,在这里购买的音色能同时用于tts和实时语音
3. 需要注意的是:购买克隆音色之后目前是分钟级生效,即2分钟之后才可以发起音色注册请求
curl -L -X POST 'https://openspeech.bytedance.com/api/v1/mega_tts/audio/upload' \ -H 'Authorization: Bearer; your-access-key' \ -H 'Resource-Id: {{Resource-Id}}' \ -H 'Content-Type: application/json' \ -d '{ "speaker_id": "S_123456", "appid": "12345678", "audios": [ { "audio_bytes": "必填,二进制音频字节,需对二进制音频进行base64编码", "text":"必填,音频所对应的文本,可以让用户按照该文本念诵,服务会对比音频与该文本的差异。若差异过大会返回1109 WERError", "audio_format": "wav" } ], "model_type": 4, // 该参数仅SC2.0版本音色需要 "source": 2 }'
{ "dialog": { "extra": { "input_mod": "keep_alive" } } }
{ "dialog": { "extra": { "input_mod": "text" } } }
{ "dialog": { "extra": { "input_mod": "audio_file" } } }
在客户端发送 FinishSession 事件后,系统将不再返回任何事件。但客户端仍可复用与火山语音网关之间的 WebSocket 连接。若需发起新的会话,客户端需重新从 StartSession 事件开始。
在没有对话需求时候,可以发送FinishSession事件结束会话。如果不想复用websocket连接,可以继续发送FinishConnection事件,释放对应的websocket连接。
推荐客户端在事件的 optional 字段中携带 event 和 session ID,以降低开发成本,并将事件处理的复杂性交由火山语音服务端负责。
客户在集成端到端语音合成模型过程中,使用 ChatTTSText 进行音频合成请求的最佳实践方法,其中黄色部分需要客户实现:
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不需要闲聊结果,可以指定文本合成音频 |
| |
501 | ChatTextQuery | 用户输入文本query,模型输出闲聊结果。若用户判断不采用音频输入进行query,可使用该事件输入文本进行query |
| |
502 | ChatRAGText | 用户query之后,模型会生成闲聊结果。如果客户判断用户query不需要闲聊结果,可以输入外部RAG知识,通过模型的总结和口语化改写之后输出对应音频。外部RAG输入整体长度不超过4K个字符。 |
| |
510 | ConversationCreate | 上下文追加规则:
|
| |
511 | ConversationUpdate | 更新上下文规则(用于更新指定 item_id 对应消息的文本内容):
|
| |
512 | ConversationRetrieve | 查询上下文规则:
|
| |
514 | ConversationDelete | 删除上下文规则:
|
|
备注:
[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 }
{ "title": {{STRING}}, "content": {{STRING}}, }
事件ID | 事件定义 | 事件类型 | 说明 | 示例 |
|---|---|---|---|---|
50 | ConnectionStarted | Connect类 | 成功建立连接 |
|
51 | ConnectionFailed | 建立连接失败 |
| |
52 | ConnectionFinished | 连接结束 |
| |
150 | SessionStarted | Session类 | 成功启动会话,返回的dialog id用于接续最近的对话内容,增加模型智能度 |
|
152 | SessionFinished | 会话已结束 |
| |
153 | SessionFailed | 会话失败 |
| |
154 | UsageResponse | 每一轮交互对应的用量信息 |
| |
350 | TTSSentenceStart | 合成音频的起始事件,tts_type取值类型有:
|
| |
351 | TTSSentenceEnd | 合成音频的分句结束事件 |
| |
352 | TTSResponse | 返回模型生成的音频数据 | payload装载二进制音频数据 | |
359 | TTSEnded | 模型一轮音频合成结束事件 |
| |
450 | ASRInfo | 模型识别出音频流中的首字返回的事件,用于打断客户端的播报 |
| |
451 | ASRResponse | 模型识别出用户说话的文本内容 |
| |
459 | ASREnded | 模型认为用户说话结束的事件 |
| |
550 | ChatResponse | 模型回复的文本内容 |
| |
553 | ChatTextQueryConfirmed | ChatTextQuery请求对应的ack |
| |
559 | ChatEnded | 模型回复文本结束事件 |
| |
567 | ConversationCreated | 增加上下文请求对应的ack 返回创建成功的上下文item数组 |
| |
568 | ConversationUpdated | 更新上下文请求对应的ack 更新成功返回{} , |
| |
569 | ConversationRetrieved | 查询上下文请求对应的ack |
| |
571 | ConversationDeleted ** | 删除上下文请求对应的ack 会把被删除的上下文返回,如右所示。 如果没有被删除的上下文,则会返回
|
| |
599 | DialogCommonError | 实时通话过程中相关错误描述 |
|
备注:
您可以通过以下步骤,快速体验与 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.12.17 | O版本和SC版本升级到2.0版本,其中O2.0包含唱歌能力提升,SC2.0包含克隆音色以及角色扮演效果提升;支持客户端发送opus音频到实时通话API |
25.11.27 | 支持初始化上下文,以及上下文增删改查能力 |
25.11.24 | 提供java示例 |
25.10.28 | 服务端事件ASRInfo增加返回question_id字段;TTSSentenceStart事件增加返回question_id和reply_id字段;客户端增加麦克风静音模式保活机制;ChatTextQuery增加ack事件553; |
25.10.10 | 支持按需开启流式和非流式二遍识别模式,即在一次语音请求中先使用流式实时返回逐字文本,再使用非流式提升最终的识别准确率; |
25.09.23 | 放开和prompt相关的长度限制,丰富客户接入场景; |
25.09.22 | 支持自定义配置判断用户说话停止的参数;s2s模型-SC版本开放支持内置联网和外部RAG输入能力; |
25.09.11 | s2s模型-O版本支持外部RAG输入;客户在使用录音文件或者文本输入时候,客户端不需要补充发送静音,只需指定对应的模式参数即可,同时无需配置recv_timeout参数; |
25.09.09 | s2s模型-SC版本支持角色扮演、声音复刻能力;在使用此能力时候,需要传入对应的克隆音色以及角色描述,之前的bot_name、system_role、speaking_style参数不会生效; |
25.09.05 | 支持纯文本模式demo,t2s模式可以使用recv_timeout参数扩大超时时间避免还需要发送静音的问题; |
25.08.27 | 支持文本query和端到端模型进行交互,需要注意的是,再使用文本query进行交互时候,静音音频还是要发送的; |
25.08.20 | demo示例放开用户说话停止时间参数;system_role和speaking_style总长放开到4000; |
25.08.13 | Go demo修复并发写websocket的问题;支持内置联网开关,默认关闭;支持用户自己开通火山融合搜索服务;支持返回用量信息到客户端;支持system_role和speaking_style传入带转义字符的文本; |
25.08.06 | demo示例新增代码:支持传入录音文件;支持多音色;支持两种pcm位深; |
25.08.01 | 文档更新功能:支持两种pcm位深;支持多发音人;支持内置联网; |
25.07.14 | 支持客户自定义用户query命中安全审核时候的回复话术,新增audit_response字段 |
25.07.09 | go示例修复一个tts音色配置bug |
25.07.03 | python示例开放模型人设区域,提升端到端模型自定义能力;增加SayHello、ChatTTSText事件发送示例; |
25.07.01 | 客户端在发送ChatTTSText事件时候一定要在收到ASREnded事件之后;增加一些报错处理,例如appkey错误、sp配置长度超过限制; |
25.06.25 | Go示例开放模型人设区域,提升端到端模型自定义能力;增加SayHello、ChatTTSText事件发送示例; |
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,修复录音上传慢问题 |