- ···
- 产品服务
- ···
- 解决方案
- ···
- 文档中心
- ···
# 一、接口说明
接入声音克隆合成API前,请先授权,否则禁止使用。
# 二、接口Demo
Java示例demo (opens new window)
python3示例demo (opens new window)
# 三、接口要求
内容 | 说明 |
---|---|
请求协议 | ws[s](为提高安全性,强烈推荐wss) |
请求地址 | ws[s]: //ws-ctts.hivoice.cn/v1/tts |
接口鉴权 | 签名机制,详情请参照下方接口鉴权 |
字符编码 | UTF-8 |
响应格式 | 统一采用JSON格式 |
开发语言 | 任意,只要可以向服务发起Websocket请求的均可 |
操作系统 | 任意 |
音频属性 | 采样率24KHz或16KHz或8KHz、位长16bit、单声道 |
音频格式 | pcm,mp3 |
文本长度 | 单次调用长度需小于500个字符 |
# 四、接口鉴权
在握手阶段,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。 请求示例
/v1/tts?time=1585047674022&appkey=xxxxxxxxxxx&sign=xxxxxxxxxx
# 1. 鉴权参数
参数 | 描述 | 示例 | 备注 |
---|---|---|---|
appkey | 用户的appkey | *** | 必需 |
time | 访问时间戳,Unix时间戳(毫秒数) | 1585047674022 | 必需 |
sign | 签名 | *** | 必需 |
A)将上述参数按照appkey、time、secret顺序拼接字符串;
B)将A形成字符串获取SHA256摘要,形成一个64位的十六进制(字母大写)字符串,即为本次请求sign(签名)的值
# 2. 鉴权示例代码
/**
* 热词签名获取方法
* @param appkey
* @param timestamp
* @param secret
* @return
*/
public String getSign(String appkey, String timestamp, String secret) {
String originalStr = appkey + timestamp + secret;
StringBuilder sign = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] bytes = md.digest(originalStr.getBytes(StandardCharsets.UTF_8));
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
} catch (Exception unused) {
}
return sign.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 五、开始合成
通过websocket文本传输,json格式数据
# 1. 参数说明
参数名 | 类型 | 必传 | 描述 | 可选值 | 默认 |
---|---|---|---|---|---|
format | string | 否 | 音频格式 | pcm,mp3 | pcm |
sample | string | 否 | 采样率(单位Hz) | 8000,16000,24000 | 16000 |
vcn | string | 是 | 音色id(voiceId) | ||
speed | int | 否 | 语速 | 0~100 | 50 |
volume | int | 否 | 音量 | 0~100 | 50 |
pitch | int | 否 | 音高 | 0~100 | 50 |
bright | int | 否 | 亮度 | 50~100 | 50 |
text | string | 是 | 需要合成的文本 | ||
user_id | string | 否 | 用户标识 |
# 2. 请求参数示例
{
"vcn": "xxxxxxxxxx",
"volume": 50,
"user_id": "unisound-java-demo",
"format": "pcm",
"bright": 50,
"pitch": 50,
"smt": 0,
"text": "云知声专注于物联网人工智能服务,拥有完全自主知识产权,是世界领先的智能语音识别AI技术企业之一。公司成立于2012年6月29日,总部位于北京,在上海、深圳、厦门、合肥均设有分公司。",
"sample": "16000",
"emt": 0,
"speed": 50
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 六、接收语音
接收语音数据是通过websocket的onMessage(byte)方法, websocket返回的二进制数据即为合成的语音数据。
# 七、合成结束
当服务端合成结束或出错时会返回文本消息。
接收文本结果是通过onMessage(String)方法,文本结果描述如下:
参数 | 类型 | 描述 | 是否为空 |
---|---|---|---|
code | int | 处理结果 | NO |
msg | String | 结果说明 | NO |
sid | String | 识别的唯一id | NO |
end | boolean | 请求是否结束 | NO |
返回结果示例
{
"code": 0,
"end": true,
"msg": "success",
"sid": "29d5e5f3f2be4fac97ab97be6f8efc04"
}
1
2
3
4
5
6
2
3
4
5
6
# 八、错误码
错误码 | 说明 | 解决办法 |
---|---|---|
0 | 成功 | |
20501 | 参数错误 | 客户端检查参数是否正确 |
20502 | 发音人不可用 | 到控制台查看可用发音人 |
20503 | 服务内部错误 | 建议重试,或者提工单,工单详情请提供sid |
20504 | 并发超过限制 | 减小并发或者购买并发套餐 |
20505 | 套餐次数使用完 | 购买次数套餐 |
20506 | appkey不存在 | 检查appkey是否合法 |
20507 | 客户端ip不在白名单中 | 检查是否开启白名单,同时检查客户端出口ip是否在ip白名单中 |