语音合成接口

语音合成

服务概述

  • 通过云上曲率的人工智能技术,将文本内容实时转换为自然流畅的语音流,适用于边合成边播放等低时延场景。

服务申请

语音合成 API 采用全流程自助申请模式。在云上曲率官网(https://www.ilivedata.com/)注册并激活账号后,在控制台创建语音合成项目,即可获得 appId 和服务密钥。

如需开通更多服务,可在管理控制台-总览页面开通其他服务。

接入方式

参数规范

请求URL: https://tts.ilivedata.com/api/v1/speech/synthesis/stream

HTTP请求头

请求头 描述
Content-Type application/json;charset=UTF-8 请求体类型
Accept application/octet-stream 接受的返回类型。建议明确指定为音频二进制流
X-AppId 例:81900001 项目或应用的唯一标识符。可通过 Header 传入;若未传入,则需在请求体中传入 appId
X-TimeStamp 例:2024-07-01T07:59:59Z 请求的 UTC 时间戳。需要把时间戳按 W3C 标准格式化,例如:2024-07-01T07:59:59Z. (http://www.w3.org/TR/xmlschema-2/#dateTime)。
Authorization 例:Njl86M/jY6zZaZoGhZdGO+GI/8+yGFECusGH1yQHUFE= 签名值

请求方法:POST

请求体:

参数 是否必需 类型 描述
text 必须 String 文本内容,去除首尾空白后不能为空。默认长度范围[1,2000]
language 可选 String 文本内容所属语种,推荐传入此语言参数,不传则使用自动语种检测结果。支持语种请参考语种列表
voice 必须 VoiceSetting 合成声音相关配置,参数为空时使用语种对应的系统默认声音
output 必须 OutputSetting 输出音频相关配置

VoiceSetting:

参数 必需 类型 描述
name 必选 String 联系客服获取相关音色

OutputSetting:

参数 必需 类型 描述
format 必选 String 选择输出合成音频格式,候选为 pcm、wav、mp3、opus,默认为 wav

请求体示例

Request Sample

{
    "text": "您好,欢迎来到云上曲率。",
    "language": "zh-CN",
    "voice": {
        "name": "juvenile"
    },
    "output": {
        "format": "mp3"
    }
}

请求签名:

当用户请求语音合成 API 时,可以使用 appId 和 secretKey 对请求做签名。当 API 收到带签名信息的请求之后,将使用相同的算法验证签名,如果发现签名不一致,API 将会返回 401 给用户。

如果 API 验证签名一致,且 appId 对应的用户有权限操作请求的资源,则请求成功,否则 API 返回 401。

通过 HTTP 请求 Header 发送签名

方法:在请求中加入名为 Authorization 的 Header,值为签名值。如下:

Authorization: Njl86M/jY6zZaZoGhZdGO+GI/8+yGFECusGH1yQHUFE=

签名计算方法

1.构造规范化的请求字符串(Canonicalized Query String)

将请求体 JSON 字符串以 UTF-8 字符编码做 sha256 编码后转换为 16 进制字符串(注意不是 Base64)

CanonicalizedQueryString = hex(sha256(jsonBody))

2.构造被签名字符串 StringToSign("\n" 代表 ASCII 里的换行符)

StringToSign = HTTPMethod + "\n" +
               HostHeaderInLowercase + "\n" +
               HTTPRequestURI + "\n" +
               CanonicalizedQueryString <从上一步得到> + "\n" +
               "X-AppId:" + SAME_APPID_IN_HEADER + "\n" +
               "X-TimeStamp:" + SAME_TIMESTAMP_IN_HEADER

HTTPRequestURI 是请求 URI 的绝对路径,不包含请求串。如果 HTTPRequestURI 为空,也要保留一个正斜杠(/)

使用 HMAC-SHA256 协议创建基于哈希的消息身份验证代码(HMAC),然后计算签名。

3.StringToSign 作为签名字符串,secretKey 作为秘钥,SHA256 作为哈希算法

有关 HMAC 的更多信息,请参阅 https://tools.ietf.org/html/rfc2104

4.将上一步的结果转换为 Base64 串

5.将 Base64 串放入 HTTP 请求 Header 的 Authorization

签名示例

下面是 appId 和 secretKey 的示例:

appId=81900001
secrectKey=****

下面是示例请求体:

{"text":"您好,欢迎来到云上曲率。","language":"zh-CN","voice":{"name":"juvenile"},"output":{"format":"mp3"}}

生成 CanonicalizedQueryString

4625d9e60b1fce4a6b4a01fb3ba8e7f33cd2751587ce79e4dc29e6d38b1fb1e9

生成 StringToSign

POST
tts.ilivedata.com
/api/v1/speech/synthesis/stream
4625d9e60b1fce4a6b4a01fb3ba8e7f33cd2751587ce79e4dc29e6d38b1fb1e9
X-AppId:81900001
X-TimeStamp:2024-11-01T07:59:59Z

HMAC 计算得到的签名

1nNkKezG9XgkbCau9aENhDDRJhoTMHAI85NnjY+Mm4k=

HTTP响应

流式接口成功时返回音频二进制流,而不是 JSON 结构。

成功响应头

响应头 类型 描述
Content-Type String application/octet-stream
Cache-Control String no-store
X-Task-Id String 任务唯一标识
X-Audio-Format String 输出音频格式
Transfer-Encoding String chunked

成功响应示例

Sample Response Headers

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Cache-Control: no-store
X-Task-Id: bj_367a9314e0294cf1afcaee5c93b58129
X-Audio-Format: mp3
Transfer-Encoding: chunked

响应体为音频二进制流(如 mp3、wav、pcm、opus 分片数据),客户端需按二进制方式接收并播放或保存。

失败响应

请求参数错误、应用不存在、语种或输出格式不支持等场景下,接口会返回非 200 错误响应。失败时响应体为 JSON。

字段名 类型 描述
errorCode Number 错误码
errorMessage String 错误信息

失败响应示例

Sample Error Response

{
    "errorCode": 3003,
    "errorMessage": "Invalid voice name."
}

调用示例

curl -N -X POST 'https://tts.ilivedata.com/api/v1/speech/synthesis/stream' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/octet-stream' \
  -H 'X-AppId: 81900001' \
  -d '{"text":"您好,这是一个流式语音合成示例。","language":"zh-CN","output":{"format":"mp3"}}' \
  --output stream_audio.mp3 -D headers.txt