流式文本在线合成(备用)
接口描述
流式文本在线合成基于websocket协议,可以将输入的文本合成为二进制格式的语音数据。与发起多次短文本语音合成相比,可以获得更高的实时性,在用户输入文本的同时就能接近同步的返回合成音频数据,达到“边合成边播放”的效果。 流式语音合成示例:TTS-ws-demo.zip
接口说明
- 建议文本不超过2000 GBK字节,即1000个汉字或者字母数字;
- 输入的文本必须采用UTF-8编码;
- 支持多音字通过标注自行定义发音。格式如:重(chong2)报集团。
权限说明
调用本能力需要使用API Key进行鉴权认证。获取及使用API Key的流程请参考:APIKey鉴权说明文档
事件流程
- 建立WebSocket连接,收到 101 Switching Protocols(握手成功)
- 发送 system.start,收到 system.started
- 发送 text(可按任意粒度分片推送文本,单次不超过1000汉字),不断返回音频流;音频通过 WebSocket Binary二进制帧分块返回
- 全部文本推送完成,发送 system.finish,服务端合成完缓存残留文本后返回system.finished,随后服务端主动断开WebSocket连接

请求参数
初始化阶段:开始帧的类型,固定值 system.start
发送文本阶段:数据帧的类型,固定值 text
结束合成阶段:结束帧的类型,固定值 system.finish
合成参数,详见下表
显示子属性
隐藏子属性
语速,取值 0-15,默认为 5
音调,取值 0-15,默认为 5
音量,基础音库取值0-9,其他音库取值 0-15,默认为 5
音频格式,3=mp3-16k/24k,4=pcm-16k/24k,5=pcm-8k,6=wav-16k/24k,默认为3
- sampling_rate: 采样率,仅支持降采样,示例 {"sampling_rate":16000}
* AIGC: 元数据标识,仅支持mp3格式音频添加,默认不添加。
示例:{ "ContentPropagator":"内容传播服务提供者", "PropagateID":"内容传播编号" }
ContentPropagator、PropagateID请传入string类型的数据。
若不传入两个字段,默认不添加元数据标识;传入字段后音频header将添加Label、ContentProducer、ProduceID、ContentPropagator、PropagateID总计5个字段。
发送文本阶段参数:需要进行语音合成的文字,不超过1000字
示例代码
握手建立连接
握手阶段,客户端主动发起 websocket 连接请求 请求地址:wss://aip.baidubce.com/ws/2.0/speech/publiccloudspeech/v1/tts
curl --location 'wss://aip.baidubce.com/ws/2.0/speech/publiccloudspeech/v1/tts?access_token=xxx&per=xxx'
初始化
握手成功后客户端和服务端会建立websocket连接,客户端通过websocket连接可以同时上传和接收数据。
{
"type": "system.start",
"payload": {
"spd": 5,
"pit": 5,
"vol": 5,
"audio_ctrl": '{"AIGC": {"ContentPropagator":"XXX","PropagateID":"XXX"},"sampling_rate":16000}',
"aue": 3
}
}
发送文本
{
"type": "text",
"payload": {
"text": "需要进行语音合成的文字"
}
}
结束合成
- 表示客户端没有文本需要合成了,客户端要求服务端立即合成所有缓存的文本;
- 注意事项:
- 由于流式文本语音合成接口,服务端会分句合成音频,所以服务端会缓存客户端的文本,客户端需要再没有文本合成时,立刻发送此消息,否则可能丢失文本。
- 客户端发送此消息后,服务端不在接收任何客户端后续请求。
{
"type":"system.finish",
}
返回响应
错误码,使用能力引擎标准的错误码,0表示成功
错误消息
初始化阶段:开始帧的类型,固定值system.started
结束合成阶段:结束帧的类型,固定值 system.finished
系统定义的请求头
显示子属性
隐藏子属性
暂无参数
SN信息,格式为 [0-9a-zA-Z_-]{1,64}
握手建立连接
响应说明
如果握手成功,会返回 101状态码,表示协议握手成功;如果握手失败,则根据不同错误类型返回不同 http status,详细说明如下:
成功: 状态码101 Switching Protocols
失败: 错误码及描述见结尾
429 Too Many Requests
{
"code": 276001,
"message": "Rate limit exceeded error"
}
初始化
服务端对客户端「开始合成」的响应
- code 等于 0:表示通道各个参数已经设置完成;
- code 不等于 0:表示通道参数设置有误,服务端会断开所有ws连接。
#### 正常响应
```text
{
"type": "system.started",
"code": 0,
"message": "success",
"headers": {
"session_id": "xxx"
}
}
```
#### 异常响应
```text
{
"type": "system.started",
"code": 216100,
"message": "语速参数错误, 请输入0-15的整数",
"headers": {
"session_id": "xxx"
}
}
```
发送文本
异常响应列表-文本限制说明
- 单次发送文本不超过1000汉字,若超过,下发提示帧【文本过长,请控制在1000字以内】
- 未处理文本长度超过10000汉字后不处理新增文本,下发提示帧【当前待处理文本过长,请稍后发送】
不响应
- 未发送开始合成就发送文本
- 已经发送结束合成仍发送文本
- 发送文本信息无内容
其他响应
- 若发送文本信息无标点隔断,server等待标点或字符数变多(至少60字)再进行合成。有效的隔断标点如下:
, . 、? ! : ; , 。 ? ! : ; — …
- 若5~6s内未接收到新文本,则强制以当前文本切句
#### 正常响应
```text
WebSocket opcode`:`binary
WebSocket消息体:音频二进制数据
```
#### 异常响应
```text
{
"type": "system.error",
"code": 216103,
"message": "文本过长, 请控制在1000字以内",
"headers": {
"session_id": "xxx"
}
}
```
结束合成
正常响应
- 服务端对客户端「合成结束」的响应,表示服务端已经完成所有文本的合成,且所有音频数据下发完毕。
异常响应
暂无
不响应
- 文本未合成完成,合成结束后会响应结束
{
"type":"system.finished",
"code": 0,
"message": "success",
}
断开连接
正常断开
服务端响应结束合成后,会主动断开连接
异常断开
客户端超过一分钟不发送消息,服务端会异常断开连接
HTTP状态码
| 状态码 | 状态信息 | 描述 | 解决方案 |
|---|---|---|---|
| 400 | Bad Request | 参数错误、参数缺失 | 请参考官网文档,自查token和per |
| 401 | Unauthorized | 鉴权失败 | |
| 403 | Forbidden | 无访问权限,接口功能未开通 | |
| 404 | Not Found | 输入的url错误 | |
| 429 | Too Many Requests | 触发限流 | |
| 500 | Internal Server Error | 服务器内部错误 | |
| 502 | Bad Request | 后端服务连接失败 |
异常响应与错误码
| type | code | message | 说明 |
|---|---|---|---|
system.started |
216100 | 参数错误 | 参数类型错误 |
system.started |
216100 | 语速参数错误, 请输入0-15的整数 | 语速取值超限 |
system.started |
216100 | 音调参数错误, 请输入0-15的整数 | 音调取值超限 |
system.started |
216100 | 基础音库音量参数错误, 请输入0-9的整数 | 基础音库音量取值超限 |
system.started |
216100 | 精品/臻品音库音量参数错误, 请输入0-15的整数 | 精品/臻品音库音量取值超限 |
system.started |
216100 | 音频格式错误, 3:mp3, 4:pcm-16k, 5:pcm-8k, 6:wav | 音频格式取值错误 |
| text | 216101 | 参数缺失 | 缺少必需的参数 |
| text | 216103 | 文本过长, 请控制在1000字以内 | 单次文本不能超过1000字 |
| text | 216419 | 当前待处理文本过长,请稍后发送 | 发送频率过快,待处理文本过长 |
评价此篇文章
