本文介绍了自部署模型与 AI 加速网关集成的通信协议规范。该协议基于 OpenAI 标准协议构建,并针对语音合成(TTS)、语音识别(ASR)等场景进行了一系列功能扩充,包括采样率控制、音频通道配置以及自定义参数透传等能力。
自部署模型作为服务端需实现本文所描述的接口协议,AI 加速网关将作为中间层调用这些接口,完成客户端请求到自部署模型的转发与协议适配。
自部署的语音合成服务可通过 HTTP/HTTPS 或 WebSocket(WS)/WebSockets Secure(WSS)协议接入 AI 加速网关。
/audio/speechHTTP 请求头需包含以下字段:
Key | Value |
|---|---|
|
|
请求体为 JSON 格式,包含以下参数:
名称 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| string | 是 | 待合成的文本内容。 |
| string | 是 | 指定使用的 TTS 模型名称。 |
| string | 是 | 指定使用的音色名称。 |
| string | 是 | 指定输出音频的格式。当前版本仅支持 |
| number | 是 | 指定输出音频的语速。 |
| integer | 是 | 指定输出音频的采样率,单位:Hz。 |
| integer | 是 | 指定输出音频的通道数。取值: |
| object | 否 | 用于传递其他自定义参数的 JSON 对象。这些参数将直接透传至下游的自部署模型服务。 |
一个典型的 HTTP 请求体示例如下:
{ "model": "your_model", "input": "The text to be generated", "voice": "alloy", "response_format": "pcm", "speed": 1.0, "sample_rate": 16000, "channel": 1, "extra_data": { "room_id": "123", "key_a": "value_a" } }
服务成功处理请求后,将以 HTTP 分块传输编码(Chunked Transfer Encoding)的方式流式返回合成的音频数据。
200 OKX-Biz-Trace-Info 响应头,用以携带需要透传的元信息。AI 加速网关在转发响应时将原样透传此响应头。详细的接入配置流程,请参见通过 AI 加速网关接入和调用自部署模型。
自部署的语音合成服务也可以通过 WebSocket(WS)/WebSockets Secure(WSS)协议接入 AI 加速网关。客户端与服务端之间通过交换 JSON 格式的事件消息(以 WebSocket Text Frame 形式传输)实现双向实时通信。
/realtimeKey | Value |
|---|---|
|
|
下表列出了客户端与服务端之间交互的主要事件类型及其说明:
事件类型 | 事件名 | 说明 |
|---|---|---|
客户端 | 初始会话参数 - | 客户端在连接建立后发送,用于配置或更新当前语音合成会话的参数。此事件必须在连接初始化后发送,且仅能发送一次。 |
上报合成文本 - | 客户端通过此事件向服务端上报待合成的文本。 | |
文本上报结束 - | 客户端发送此事件,以通知服务端当前批次的文本已上报完毕。 | |
服务端 | 会话参数确认 - | 服务端成功处理客户端的参数配置请求并建立会话后,发送此事件作为响应。 |
增量音频数据 - | 服务端通过此事件实时增量返回合成的音频数据。 | |
音频合成结束- | 服务端发送此事件,以通知客户端本次音频合成已全部完成。 | |
字幕信息 - | 当 |
tts_session.update客户端在建立 WebSocket 连接后,必须首先发送此事件来配置本次 TTS 会话的核心参数。
{ "event_id": "event_123", "type": "tts_session.update", "session": { "voice": "xxx", "output_audio_format": "pcm", "output_audio_sample_rate": 16000, "output_audio_speed_rate": 0.0, "output_audio_volume": 1.0, "output_audio_pitch_rate": 0, "output_audio_channel": 1, "enable_subtitle": true, "extra_data": {} } }
字段说明:
session.voice (string, 必填):指定使用的音色名称。session.output_audio_format (string, 必填):指定输出音频的格式。当前版本仅支持 pcm。session.output_audio_sample_rate (integer, 必填):指定输出音频的采样率(Hz),例如 8000、16000、24000。session.output_audio_speed_rate (number, 选填):指定输出音频的语速,默认为 1.0。session.output_audio_volume (number, 选填):指定输出音频的音量,默认为 1.0。session.output_audio_pitch_rate (number, 选填):指定输出音频的音调,默认为 0.0。session.output_audio_channel (integer, 必填):指定输出音频的通道数。1 表示单声道,2 表示双声道。session.enable_subtitle (boolean, 选填):是否启用字幕功能,默认为 false。session.extra_data (object, 选填):JSON 对象,用于传递其他自定义参数。这些参数将直接透传至下游的自部署模型服务。input_text.append客户端通过此事件向服务端流式发送待合成的文本内容。可以将一段长文本拆分为多个 input_text.append 事件分次发送。
{ "event_id": "event_345", "type": "input_text.append", "delta": "待合成的文本片段" }
字段说明:
delta: 本次上报的文本片段。input_text.done当客户端完成所有文本片段的发送后,应发送此事件来通知服务端文本输入已结束。
{ "event_id": "event_346", "type": "input_text.done" }
tts_session.updated服务端在成功处理客户端的 tts_session.update 请求后,会返回此事件,确认本次 TTS 会话的参数配置已生效。
{ "event_id": "server_event_001", "type": "tts_session.updated", "session": { "voice": "your_voice_name", "output_audio_format": "pcm", "output_audio_sample_rate": 16000, "output_audio_speed_rate": 1.0, "output_audio_volume": 1.0, "output_audio_pitch_rate": 0.0, "output_audio_channel": 1, "enable_subtitle": false, "extra_data": {} } }
字段说明:
session: 包含已确认生效的会话参数,字段含义同客户端发送的 tts_session.update 事件。response.audio.delta服务端通过此事件,以流式方式增量返回合成的音频数据。
{ "event_id": "event_wQp5vyn4VloVTOcrQS6bo", "type": "response.audio.delta", "item_id": "item_ezC2f0aiYLtsTILllMIXe", "delta": "base64_encoded_audio_chunk" }
字段说明:
delta: 经过 Base64 编码的 PCM 音频数据片段。response.audio.done当服务端完成所有音频的合成与发送后,会发送此事件,标志着本次 TTS 请求处理完毕。
{ "event_id": "event_zh366ItZEWdcnSOiTPR2N", "type": "response.audio.done", "item_id": "item_ezC2f0aiYLtsTILllMIXe" }
response.audio_subtitle.delta如果客户端在初始化时设置了 enable_subtitle 为 true,服务端将通过此事件推送与合成音频同步的字幕信息。
{ "event_id": "event_2122", "type": "response.audio_subtitle.delta", "item_id": "msg_003", "subtitles": { "text": "你好", "words": [{ "start": 0.0, "end": 1.319999933242798, "word": "你" },{ "start": 1.319999933242798, "end": 2.6, "word": "好" }] } }
字段说明:
subtitles.text: 当前字幕片段对应的完整文本。subtitles.words: 一个数组,包含当前片段中每个词汇及其在音频流中的起始时间(start)和结束时间(end),单位为秒。自部署的语音识别(ASR)服务通过 WebSocket(WS)/WebSockets Secure(WSS)协议接入 AI 加速网关。客户端与服务端之间通过交换 JSON 格式的事件消息(以 WebSocket Text Frame 形式传输)实现双向实时通信。
/realtimeKey | Value |
|---|---|
|
|
下表列出了客户端与服务端之间交互的主要事件类型及其说明:
事件类型 | 事件名 | 说明 |
|---|---|---|
客户端 | 初始化会话参数 - | 客户端在连接建立初始阶段发送,用于配置或更新当前语音识别会话的参数。此事件必须在连接初始化后发送,且仅能发送一次。 |
音频数据上报 - | 客户端通过此事件向服务端持续上报音频数据块。 | |
音频上报结束通知 - | 客户端发送此事件,以明确通知服务端当前批次的音频数据已上报完毕。 | |
服务端 | 会话参数确认 - | 服务端成功处理客户端的参数配置请求并建立会话后,发送此事件作为响应。 |
增量识别结果 - | 服务端在识别过程中,实时推送最新识别出的文本片段。具体使用 | |
累计识别结果 - | 服务端在识别过程中,实时推送截至当前的完整识别结果。具体使用 | |
最终识别结果 - | 服务端在完成对某段音频的完整识别后,通过此事件发送最终的识别结果。 |
transcription_session.update此事件用于客户端向服务端传递本次 ASR 会话所需的各项参数。
{ "type": "transcription_session.update", "session": { "input_audio_format": "pcm", "input_audio_codec": "raw", "input_audio_sample_rate": 16000, "input_audio_bits": 16, "input_audio_channel": 1, "extra_data": {} } }
字段说明:
session.input_audio_format:音频容器格式,例如 pcm。session.input_audio_codec:音频编码格式,例如 raw(表示未压缩的原始音频数据)。session.input_audio_sample_rate:音频采样率(Hz)。session.input_audio_bits:每个采样点的位数,例如 16(表示 16-bit)。session.input_audio_channel:音频声道数。session.extra_data:(可选)JSON 对象,用于承载特定 ASR 服务提供商所需的自定义参数。网关会将此部分数据原样透传给后端自部署的 ASR 模型。input_audio_buffer.append客户端通过此事件持续向服务端流式发送经过 Base64 编码的音频数据。对于支持连续流式识别的场景,通常无需发送 input_audio_buffer.commit 事件,服务端会根据接收到的音频流实时返回识别结果。
{ "event_id": "event_wQp5vyn4VloVTOcrQS6bo", "type": "input_audio_buffer.append", "item_id": "item_ezC2f0aiYLtsTILllMIXe", "audio": "base64_encoded_audio_data" }
字段说明:
event_id:客户端生成的唯一事件 ID。item_id:客户端生成的唯一数据项 ID,用于关联同一段音频流的不同数据块。audio:经过 Base64 编码的音频数据片段。input_audio_buffer.commit(可选)此事件用于明确告知服务端,客户端已完成当前一段完整音频的上报。网关在收到此事件后,会确保与后端模型的连接在处理完已接收音频前保持有效。
{ "event_id": "event_wQp5vyn4VloVTOcrQS6bo", "type": "input_audio_buffer.commit", "item_id": "item_ezC2f0aiYLtsTILllMIXe" }
适用场景:
主要针对那些需要显式结束指令的 ASR 服务提供商。若服务端或自部署模型开启了语音活动检测(VAD)功能,则通常由服务端判断语音结束,客户端无需发送此事件。
transcription_session.updated服务端在成功处理客户端的初始化请求并建立 WebSocket 连接后,会返回此事件,确认本次 ASR 会话所采用的参数配置。
{ "type": "transcription_session.updated", "session": { "input_audio_format": "pcm", "input_audio_codec": "raw", "input_audio_sample_rate": 16000, "input_audio_bits": 16, "input_audio_channel": 1, "result_type": 0, "extra_data": {} } }
字段说明:
session 内各字段含义同客户端发送的 transcription_session.update 事件中的定义。session.result_type:(重要)标识后端 ASR 模型返回识别结果的模式:
0:全量输出(服务端将使用 conversation.item.input_audio_transcription.result 事件返回截止到当前的完整识别结果)。1:增量输出(服务端将使用 conversation.item.input_audio_transcription.delta 事件返回新增识别片段)。conversation.item.input_audio_transcription.delta当 ASR 模型配置为增量输出模式(即 result_type 为 1)时,服务端会通过此事件实时推送最新识别出的文本片段。
{ "type": "conversation.item.input_audio_transcription.delta", "event_id": "event_001", "item_id": "item_001", "content_index": 0, "delta": "Hello", "start": 0.0, "end": 3.319999933242798 }
字段说明:
event_id:服务端生成的唯一事件 ID。item_id:对应客户端上报音频时的 item_id。content_index:内容索引,用于处理可能的并发或多段内容。delta:最新识别出的文本片段。start:该识别文本片段在原始音频流中的起始时间点(单位:秒)。end:该识别文本片段在原始音频流中的结束时间点(单位:秒)。conversation.item.input_audio_transcription.result当 ASR 模型配置为全量输出模式(即 result_type 为 0)时,服务端会通过此事件实时推送截至当前时间点的完整累计识别结果。
以下示例展示了两次连续的 result 事件,体现了识别结果的逐步累积:
{ "type": "conversation.item.input_audio_transcription.result", "event_id": "event_001", "item_id": "item_001", "transcript": "Hello, how?" }
{ "type": "conversation.item.input_audio_transcription.result", "event_id": "event_002", "item_id": "item_001", "transcript": "Hello, how are you?" }
字段说明:
transcript:截至当前时间点的完整识别文本。conversation.item.input_audio_transcription.completed当一段完整的语音输入处理完毕后(例如客户端发送了 input_audio_buffer.commit 事件,或服务端通过 VAD 检测到语音结束),服务端会发送此事件,返回该段语音的最终完整识别结果。
{ "event_id": "event_2122", "type": "conversation.item.input_audio_transcription.completed", "item_id": "msg_003", "content_index": 0, "transcript": "Hello, how are you?", "words": [ { "start": 0.0, "end": 1.319999933242798, "word": "Hello" } ] }
字段说明:
transcript:该段语音的最终完整识别文本。words:(可选)一个数组,包含了每个识别出的词汇及其对应的时间戳信息(start、end、word),有助于进行更细致的分析或后续处理。关于结束判断:
input_audio_buffer.commit 事件。服务端在接收到此指令并完成对已缓存音频的识别后,会返回 conversation.item.input_audio_transcription.completed 事件。conversation.item.input_audio_transcription.completed 事件,此时客户端无需发送 commit 事件。