说明:
此接口为 API 2.0 版本,在参数风格、错误码等方面有区别于 API 3.0 版本,请知悉。
本接口服务采用 WebSocket 协议,具备「文本>播客式音频」的跨模态生成能力。可以根据客户输入的文本指令/文件/网页链接生成相关的音频内容,模拟真人语气,表达深入浅出,有效实现高密度信息传递,助力内容创作者高效生产。
接口要求
集成AI播客语音合成 API 时,需按照以下要求。
内容 | 说明 |
输入种类 | 支持文本、网页、文件类型。详见接口 InputObject 参数描述 |
音频属性 | 采样率:24000Hz 采样精度:16bits 声道:单声道(mono) |
音频格式 | pcm |
请求协议 | wss 协议 |
请求地址 | wss://tts.cloud.tencent.com/stream_ws_podcast?{请求参数} |
接口鉴权 | |
响应格式 | 音频信息通过 binary 类型帧,返回原始二进制数据,可以边接收边播放; 文本信息通过 text 类型帧,返回 JSON 格式数据(如音频脚本、时间戳、服务器事件等) |
并发限制 | 默认单账号限制并发连接数为 1 路 |
接口调用流程
接口调用流程分为三个阶段:签名握手阶段、合成阶段和结束阶段。三个阶段后台均会返回文本消息 text message(包括时间戳、服务器事件等),内容为 JSON 序列化字符串,以下是格式说明:
字段名 | 类型 | 描述 |
code | Integer | 状态码,0代表正常,非0值表示发生错误 |
message | String | 错误说明,发生错误时显示这个错误发生的具体原因,随着业务发展或体验优化,此文本可能会经常变更或更新 |
session_id | String | 客户端生成的会话ID,由客户端在握手阶段生成并赋值在调用参数中 |
request_id | String | 服务端生成的会话ID,由服务端自动生成,并随文本消息返回 |
message_id | String | 本 message 唯一ID |
result | Result | 语音合成文本时间戳 |
ready | Integer | READY 事件:该字段返回1时表示服务端已初始化,客户端可以开始发送输入文本的请求 |
final | Integer | FINAL 事件:该字段返回1时表示播客音频合成结束,客户端收到后需主动关闭 WebSocket 连接 |
heartbeat | Integer | HEARTBEAT 事件:该字段返回1时表示心跳报文,客户端收到后可忽略 |
其中合成结果 Result 结构体格式为:
字段名 | 类型 | 描述 |
scripts | Script Array | 播客音频的分段脚本信息,Script 结构体格式为: Text: String 类型,该段的内容。 Speaker:String 类型,该段的说话人,如:主持人1、主持人2。 BeginTime: Integer 类型,该段在整个音频流中的起始时间(单位:ms)。 EndTime: Integer 类型,该段在整个音频流中的结束时间(单位:ms)。 Index: Integer 类型,该段序号,从0开始。 |
Result 示例:
{"code": 0,"message": "success","session_id": "71abed34-b587-11f0-bf46-52540037edd7","request_id": "d3776b5b-c454-4bab-8aaf-e9f09444c093","message_id": "d280b857-f87c-4a6c-a9fe-8f3a00f912bb","final": 0,"ready": 0,"heartbeat": 0,"reset": 0,"result": {"scripts": [{"Text": "原来如此。所以,无论是像Harvey那样专注于某个垂直领域的AI Agent公司,还是像腾讯云这样提供平台和工具的厂商,大家都在用自己的方式,共同推动着这个产业的向前发展。好了,今天关于AI Agent的分享就到这里,感谢大家的收听。","BeginTime": 438740,"EndTime": 460500,"Index": 26,"Speaker": "主持人1"}]}}
握手阶段
请求格式
握手阶段,客户端主动发起 WebSocket 连接请求,请求 URL 格式为:
wss://tts.cloud.tencent.com/stream_ws_podcast?{请求参数}
key1=value2&key2=value2...
参数说明:
参数名称 | 必填 | 类型 | 描述 |
Action | 是 | String | 调用接口名,取值为:TextToPodcastStreamAudioWS(注意大小写) |
AppId | 是 | Integer | 账号 AppId(请确保该字段数据类型为整型 int) |
SecretId | 是 | String | |
Timestamp | 是 | Integer | 当前 UNIX 时间戳,可记录发起 API 请求的时间。例如1529223702,如果与当前时间相差过大,会引起签名过期错误 |
Expired | 是 | Integer | 签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒;Expired 必须大于 Timestamp 且 Expired-Timestamp 小于90天 |
SessionId | 是 | String | 语音合成全局唯一标识,一个 WebSocket 连接对应一个,用户自己生成(推荐使用 uuid),最长128位。 |
SampleRate | 是 | Integer | 音频采样率: 24000:24k |
Codec | 否 | String | 返回音频格式: pcm: 返回二进制 pcm 音频 |
Signature | 是 | String | 接口签名参数 |
一、签名阶段
Signature 签名生成
示例采用如下虚拟的腾讯云账号密钥演示:
AppId=1300466766SecretId=AKIDPseudoSecretId1234567890abcdefgHSecretKey=PseudoSecretKey1234567890abcdefG
1. 对除 Signature 之外的所有参数按字典序进行排序,拼接后得到请求参数为
Action=TextToPodcastStreamAudioWS&AppId=1300466766&Codec=pcm&Expired=1761903064&SampleRate=24000&SecretId=AKIDPseudoSecretId1234567890abcdefgH&SessionId=27d0a902-b573-11f0-b377-52540037edd7&Timestamp=1761816664
再拼接请求方法、域名地址,得到签名原文(注意大小写)。签名原文格式为
请求方法(GET) + 域名地址(tts.cloud.tencent.com/stream_ws_podcast) + 请求参数(?Action=TextToPodcastStreamAudioWS&其他参数...)
最终,得到的签名原文为:
GETtts.cloud.tencent.com/stream_ws_podcast?Action=TextToPodcastStreamAudioWS&AppId=1300466766&Codec=pcm&Expired=1761903064&SampleRate=24000&SecretId=AKIDPseudoSecretId1234567890abcdefgH&SessionId=27d0a902-b573-11f0-b377-52540037edd7&Timestamp=1761816664
2. 对签名原文使用 SecretKey 进行 HMAC-SHA1 加密,之后再进行 base64 编码。
对步骤一的签名原文,使用 HMAC-SHA1 算法进行加密并做 base64 编码处理:
Base64Encode(HmacSha1("GETtts.cloud.tencent.com/stream_ws_podcast?Action=TextToPodcastStreamAudioWS&AppId=1300466766&Codec=pcm&Expired=1761903064&SampleRate=24000&SecretId=AKIDPseudoSecretId1234567890abcdefgH&SessionId=27d0a902-b573-11f0-b377-52540037edd7&Timestamp=1761816664", "PseudoSecretKey1234567890abcdefG"))
得到原始签名值为:
3Ivu6TM5GFMNhUhdvMVkMMcdiX4=
将原始签名值进行 urlencode编码(必须进行 URL 编码,否则将导致鉴权失败),得到 Signature 值
3Ivu6TM5GFMNhUhdvMVkMMcdiX4%3D
3. 将 Signature 值后拼接到最后,得到 URL 为:
wss://tts.cloud.tencent.com/stream_ws_podcast?Action=TextToPodcastStreamAudioWS&AppId=1300466766&Codec=pcm&Expired=1761903064&SampleRate=24000&SecretId=AKIDPseudoSecretId1234567890abcdefgH&SessionId=27d0a902-b573-11f0-b377-52540037edd7&Timestamp=1761816664&Signature=3Ivu6TM5GFMNhUhdvMVkMMcdiX4%3D
请求响应
客户端发起连接请求后,后台建立连接并进行签名校验,校验成功则返回 code 值为 0 的确认消息表示握手成功;如果校验失败,后台返回 code 为非 0 值的消息并断开连接。
{"code":0,"message":"success","session_id":"6bb07502-b574-11f0-81a2-52540037edd7","request_id":"696752e3-100f-4b78-ba55-b3fa7953a766","message_id":"296e88d9-fecc-48fc-9c03-6486db728c68","final":0,"ready":0,"heartbeat":0,"reset":0,"result":{"scripts":null}}
二、合成阶段
2.1 接收 READY 事件
握手成功之后,等待服务端发送 READY 事件(ready=1),即可进入合成阶段。客户端根据需要发送输入文本。
{"code":0,"message":"success","session_id":"6bb07502-b574-11f0-81a2-52540037edd7","request_id":"696752e3-100f-4b78-ba55-b3fa7953a766","message_id":"6c413e23-ec0e-415c-980c-32d4e47e2c2d","final":0,"ready":1,"heartbeat":0,"reset":0,"result":{"scripts":null}}
2.2 发送合成指令与合成文本
客户端使用合成指令(ACTION_SYNTHESIS),发送 InputObject(如文本、URL 等)列表到服务端。
输入对象列表:
对象类型支持文本类型、网址类型、文件类型
列表元素不超过 10 个
列表元素需为同一类型,暂不支持混合类型
文本类型,输入列表总字数不超过 1 万字
列表项需逐个发送,间隔最长不超过 10 分钟
InputObject 参数说明:
参数名称 | 必填 | 类型 | 描述 |
ObjectType | 是 | String | 输入类型: TYPE_TEXT:文本类型 TYPE_URL:网址类型 TYPE_FILE:文件类型 注:当类型为文件时,需满足以下条件 文件格式:pdf, .txt, .docx, .md 文件大小:30M |
Text | 否 | String | 文本内容(仅当 ObjectType 设置 TYPE_TEXT 时生效) |
Url | 否 | String | 网址内容(仅当 ObjectType 设置 TYPE_URL、TYPE_FILE 时生效) TYPE_URL时,为网页地址 TYPE_FILE时,为文件地址 |
FileFormat | 否 | String | 文件格式(仅当 ObjectType 设置 TYPE_FILE 时生效) 格式取值:pdf, .txt, .docx, .md |
发送示例:
{"session_id": "ef7c0db2-b586-11f0-9e19-52540037edd7", "message_id": "efaa42fe-b586-11f0-9e19-52540037edd7", "action": "ACTION_SYNTHESIS", "data": "{\"ObjectType\": \"TYPE_TEXT\", \"Text\": \"\\u751f\\u6210\\u4e00\\u4e2a\\u5173\\u4e8e AI Agent \\u4ea7\\u4e1a\\u73b0\\u72b6\\u7684\\u64ad\\u5ba2\", \"Url\": \"\", \"FileFormat\": \"\", \"FileData\": \"\"}"}{"session_id": "ef7c0db2-b586-11f0-9e19-52540037edd7", "message_id": "efaa5064-b586-11f0-9e19-52540037edd7", "action": "ACTION_SYNTHESIS", "data": "{\"ObjectType\": \"TYPE_TEXT\", \"Text\": \"\\u4ecb\\u7ecd\\u817e\\u8baf\\u4e91 ADP \\u7684\\u53d1\\u5c55\", \"Url\": \"\", \"FileFormat\": \"\", \"FileData\": \"\"}"}
2.3 发送结束指令
全部 InputObject 发送完后,发送 结束指令(ACTION_COMPLETE),通知服务器所有输入已发送完成,开始合成播客音频。
{"session_id": "ef7c0db2-b586-11f0-9e19-52540037edd7", "message_id": "efaa58f2-b586-11f0-9e19-52540037edd7", "action": "ACTION_COMPLETE", "data": ""}
2.4 接收合成结果
合成结果:客户端需要同步接收后台返回的二进制音频数据与文本数据。文本数据示例如下:
{"code":0,"message":"success","session_id":"71abed34-b587-11f0-bf46-52540037edd7","request_id":"d3776b5b-c454-4bab-8aaf-e9f09444c093","message_id":"0ada4571-6888-4fa5-83c0-203567ad1fb4","final":0,"ready":0,"heartbeat":0,"reset":0,"result":{"scripts":[{"Text":"最近AI圈子里最火的词儿,除了大模型本身,恐怕就是“AI Agent”了。感觉一夜之间,各行各业都在聊这个。今天我们就来聊聊这个AI Agent到底是什么,它现在的发展到了什么程度。","BeginTime":0,"EndTime":20040,"Index":0,"Speaker":"主持人1"}]}}
返回错误:合成过程中如果出现错误,后台返回 code 为非 0 值的消息并断开连接。
{"code":10001,"message":"参数不合法(Please check your parameter Text)","session_id":"b6b10dc0-101a-11ee-9e72-6c92bf65e6fe","request_id":"a2edbe4f-c12f-48e6-8810-fda7a0992f79","message_id":"da63be2f-d44e-4f3b-a2d7-0b19a3748d23","final":0,"result":{"scripts":null}}
心跳消息:合成过程中,服务端会定时发送 HEARTBEAT 事件(heartbeat=1),用于保持长连接,客户端收到后不用处理。
{"code":0,"message":"success","session_id":"da916680-31f8-11ef-997c-52540037edd7","request_id":"1bc1bab3-170d-4443-8685-238ce6bb6420","message_id":"a985e1d5-a742-4f65-8a11-af1f07574237","final":0,"ready":0,"heartbeat":1,"result":{"scripts":null}}
三、结束阶段
3.1 接收 FINAL 事件
服务器:播客音频合成完成后,最终返回 FINAL 事件(final=1)。
客户端:收到合成完成消息后,需主动关闭 WebSocket 连接。
合成完成消息示例:
{"code":0,"message":"success","session_id":"dbb8417e-101a-11ee-840e-6c92bf65e6fe","request_id":"99207183-3bda-42de-a1f4-6d8838122ad3","message_id":"d56a3fed-0dd6-4dc6-b434-416ae1b69f0f","final":1,"ready":0,"heartbeat":0,"result":{"scripts":null}}
3.2 关闭 WebSocket 连接
客户端收到 FINAL 事件后,关闭 WebSocket 连接,播客音频合成结束。
四、调用流程示意图

五、指令、事件与格式
5.1 客户端指令
客户端根据场景需要,发送指令到服务端。
指令类型
指令 | 名称 | data | 描述 |
ACTION_SYNTHESIS | 发送 InputObject 指令 | InputObject(文本、URL等) | 客户端收到 READY 事件后,可多次调用该指令发送 InputObject。 两次指令发送间隔不超过 10 分钟。 若发送超时,服务端将返回超时报错(错误码 10009,仅作通知,可忽略),并使用已发送文本正常合成播客音频后,通知客户端关闭连接。 |
ACTION_COMPLETE | 发送完成指令 | 空字符串 | 客户端发送完所有 InputObject 后,发送该指令通知服务端文本发送完成。 |
指令格式
{"session_id": "dbb8417e-101a-11ee-840e-6c92bf65e6fe", // 会话唯一id,客户端建立连接时传入"message_id": "3b46df26-31f6-11ef-894a-52540037edd7", // 本次消息唯一id"action": "ACTION_SYNTHESIS", // 指令类型"data": "" // 指令数据}
5.2 服务端事件
服务端将音频脚本(如时间戳)、错误消息、服务器事件,通过文本消息方式返回客户端。
事件类型
final, ready, heartbeat 等,详情参见上面返回参数列表(该字段未来可能会扩展更多类型)
事件格式
{"code": 0, // 错误码"message": "success", // 错误信息"session_id": "dbb8417e-101a-11ee-840e-6c92bf65e6fe", // 会话唯一id,客户端建立连接时传入"request_id": "99207183-3bda-42de-a1f4-6d8838122ad3", // 会话唯一id,服务器生成,随消息返回"message_id": "d56a3fed-0dd6-4dc6-b434-416ae1b69f0f", // 本次消息唯一id"final": 1, // 事件类型"ready": 0,"heartbeat": 0,"result": { // 服务器事件,该字段可忽略"scripts": null}}
开发者资源
SDK
错误码
客户端错误
数值 | 说明 |
10001 | 参数不合法,具体详情参考 message 字段 |
10002 | 账号当前调用并发超限 |
10003 | 鉴权失败 |
10004 | 客户端数据上传超时 |
10005 | 客户端连接断开 |
10008 | 输入通道已关闭 |
10009 | 输入文本超时未发送,服务端合成完毕后将正常关闭连接 |
服务端错误
数值 | 说明 |
20000 | 后台错误 |
20001 | 后台服务处理失败 |
20002 | 后台引擎合成失败 |
20003 | 后台引擎合成超时 |