1、接口描述
语音合成(Text To Speech,TTS)将文本转成拟人化的语音。目前仅支持中文语音合成,提供男、女两种音色的选择,支持自定义语调、语速等参数,更符合业务场景的需要。
2、请求方法
POST
3、接口要求
- 目前仅支持 base64 编码方式请求,暂不支持 url 方式请求
- 一次请求仅支持一条数据
4、URI
/v1/aiop/api/2z0yhhrzgv0g/tts/predict
5、请求参数
请求头header参数
参数 | 是否必填 | 参数类型 | 说明 | 示例 | 下级对象 |
---|---|---|---|---|---|
Content-Type | 是 | String | json 格式 | application/json | |
appkey | 是 | String | 应用appkey | 562b89493b1a40e1b97ea05e50dd8170 | |
ctyun-eop-request-id | 是 | String | 用户请求 id,由用户构造,用户可以通过 uuid 等方法自行生成唯一字符串,用于日志请求追踪。 详见文档:Python3调用示例 |
33dfa732-b27b-464f-b15a-21ed6845afd5 | |
eop-date | 是 | String | 请求时间,由用户构造,形如 yyyymmddTHHMMSSZ。 详见文档:Python3调用示例 |
20211221T163014Z | |
host | 是 | String | 终端节点域名,固定字段 | ai-global.ctapi.ctyun.cn | |
Eop-Authorization | 是 | String | 由天翼云官网 accessKey 和 securityKey 经签名后生成,参与签名生成的字段包括天翼云官网 accessKey 、securityKey、平台应用的appkey(非必须),用户请求 id(非必须),请求时间,终端节点域名(非必须)以及请求体内容。 签名逻辑详见文档:认证鉴权和Python3调用示例 |
请求体body参数
参数 | 是否必填 | 参数类型 | 说明 | 示例 | 下级对象 |
---|---|---|---|---|---|
Action | 是 | String | 算法名称 | TTS | |
TextData | 是 | String | 合成语音的文本,按 UTF-8 编码。 最小支持 3 个汉字,最多支持 150 个汉字。 英文、数字、标点均等同于一个字符。 强烈建议输入文本加上标点符号,便于合成更正确的语音数据。 音色3和4仅支持中文语音合成 | 今晚去吃火锅吗 | |
VoiceType | 是 | Int | 声音类型。0和1为老版音色, 2表示新版双语女生声音,3表示新版女生声音,4表示新版男生声音,建议使用新版2、3、4的声音 | 2 | |
Pitch | 否 | Float | 语调。返回范围 [0.8, 2],默认值为 1.0,原调。 | 1.0 | |
Speed | 否 | Float | 语速。返回范围 [0.5, 2],默认值为 1.0,原速。"1.0" | ||
Volume | 否 | int | 音量。返回范围[-5, 5],默认值为 0,表示正常音量。值越大表示音量越大,值越小表示音量越小。取值为 -5 时为音量最小值,并非为无声。 |
6、请求代码示例
Curl -X POST
"https://ai-global.ctapi.ctyun.cn/v1/aiop/api/2z0yhhrzgv0g/tts/predict"
-H "Content-Type: application/json"
-H "ctyun-eop-request-id:33dfa732-b27b-464f-b15a-21ed6845afd5"
-H "appkey:XXX"
-H "Eop-Authorization:XXX"
-H "eop-date:20211109T104641Z"
-H "host:ai-global.ctapi.ctyun.cn"
--data '{"Action": "TTS", "TextData": "今晚去吃火锅吗", "VoiceType":"2"}'
7、返回值说明
请求成功返回响应参数
参数 | 是否必填 | 参数类型 | 说明 | 示例 | 下级对象 |
---|---|---|---|---|---|
statusCode | 是 | Int | 返回状态,返回 0 表示成功,返回错误代码参考下面的错误代码列表 | 0 | |
message | 是 | String | 如果statusCode 为 0,返回 success;如果 statusCode非 0,则返回对应的可读错误信息 | success | |
returnObj | 是 | Object | 返回结果对象 | returnObj |
表returnObj
参数 | 是否必填 | 参数类型 | 说明 | 示例 | 下级对象 |
---|---|---|---|---|---|
Audio | 是 | String | **语音编码数据。**Base64 编码的 wav 格式音频数据 | "_9j_4AAQSkZJRgA......Zuv_9k=" |
请求失败返回响应参数
参数 | 是否必填 | 参数类型 | 说明 | 示例 | 下级对象 |
---|---|---|---|---|---|
statusCode | 是 | Int | 错误码,放置API对应的错误码 | 500001 | |
message | 是 | String | 返回对应的错误信息 | 服务接口异常,请联系管理员 | |
details | 是 | String | 返回对应的错误描述 | 需要联系管理员处理 | |
error | 是 | String | 返回对应的错误码 | AI_OP_500001 |
8、返回值示例
请求成功返回值示例
{
"statusCode": 0,
"message": "success",
"returnObj": {
"Audio": "_9j_4AAQSkZJRgA......Zuv_9k="
}
}
请求失败返回值示例
{
"statusCode": 400003,
"message": "Body 内容为空",
"details": "Body 请求数据为空,没有包含内容",
"error":"AI_OP_400003"
}
9、状态码
http状态码 | 描述 |
---|---|
200 | 表示请求成功 |
10、错误码说明
6 位错误码。4 开头为业务错误码,5 开头为服务错误码。
错误码 | 错误信息 | 错误描述 |
---|---|---|
AI_OP_400003 | 请求体内容为空 | 请求体请求数据为空,没有包含内容 |
AI_OP_400004 | 请求体非 json 格式 | 请求体内容需要符合 json 要求 |
AI_OP_400005 | 请求体类型错误 | 请求体需为字典,不能为其他类型 |
AI_OP_400006 | 必传的参数未传 | 必须的参数(Action、TextData)未传 |
AI_OP_400008 | 请求体的参数字段类型错误 | 请求体的参数字段类型错误 |
AI_OP_400009 | 请求体的参数字段值为空 | 请求体的参数字段值为空 |
AI_OP_400010 | 请求体的参数字段值设置错误 | 请求体的参数字段值设置错误 |
AI_OP_420001 | 文本长度超过限制 | 文本输入过长,请参考接口文档说明 |
AI_OP_420002 | 文本长度低于阈值 | 文本输入过短,请参考接口文档说明 |
AI_OP_500001 | 服务接口异常,请联系管理员 | 需要联系管理员处理 |
base64 解码规则:使用常规的 safe base64 编码方式
- python 中推荐使用
base64.urlsafe_b64decode()
函数进行编码 - java 中推荐使用
BASE64.getUrlDecoder().encodeToString()
函数进行编码 - 语音合成服务调用收到的base64编码转为wav格式音频python示例:
import json
import base64
if __name__ == "__main__":
filename = "result.json" # 调用后的 json 结果
with open(filename, 'r') as file:
data = json.load(file)
audio_base64 = data["result"]["Audio"] # 获取返回结果中的 base64
audio_wav = base64.urlsafe_b64decode(audio_base64) # 解码
with open("output.wav", "wb") as f: # 保存音频为 wav 格式
f.write(audio_wav)