定制音色
曾用名:定制声音。
创建声音定制任务
说明
蝉镜TTS的语音模型提供方便的声音复刻能力,支持用户使用克隆的音色合成试听音频,以及在语音合成阶段使用自己的音色。
支持模型
以下为蝉镜TTS已提供的语音模型及其特性说明
| 声音类型 | 模型参数(model_type) | 特性 |
|---|---|---|
| speech 1.0 蝉镜语音·基础版 | cicada1.0 | 稳定、音色还原度高,适用于对效果稳定性需求高的场景 |
| speech 5.0 蝉镜语音·升级版 | cicada2.0 | 音色还原度高,适用于对效果还原需求高的场景 |
| speech 2.0 蝉镜语音·保真版 | cicada3.0-turbo | 情感表现力强、上限高,适用于对情感表达要求高的场景 |
| speech 3.0 蝉镜语音·高保真版(8B) | cicada4.0 | 多场景复刻还原,能复刻角色感,而不是只复刻声线,完美保留声音里的情绪张力 |
使用流程
定制声音功能的实现具体流程如下:
- 上传待克隆的音频
- 支持上传的文件需要遵循以下规范:
上传的音频文件格式需为: mp3、wav、m4a格式;
上传的音频文件的有效音频时长范围在30秒到5分钟,其中有效的说话人音频时长不低于10秒;
文件大小不超过 100 M;
- 选取相应的模型
- speech 5.0 蝉镜语音·升级版使用
cicada2.0,8B 模型使用cicada4.0,其他声音模型继续使用原有的模型参数。
- 上传声音预览文案
- 声音预览文案不能超过50个字符,且不能仅传数字
- 调用声音定制接口
- 输入上述入参,调用声音定制接口,获取响应
data中的音色 ID;使用该 ID 查询定制结果。
注意: 此任务QPS 10/min,具体进度通过查询接口查看
请求地址
POST /open/v1/create_customised_audioHeader
access_token: {{access_token}}
Content-Type: application/json请求参数 Body
| 字段 | 类型 | 是否必传 | 说明 |
|---|---|---|---|
| name | 字符串 | 是 | 声音名称 |
| url | 字符串 | 是 | 声音链接,支持 mp3,wav,m4a, 目前只支持以下四种编码:audio/x-wav, audio/mpeg, audio/m4a, video/mp4 录制环境要安静,无背景杂音,正常语速,嚼字清晰,连续讲话不低于10秒,最好带有情感讲话 时长30秒-5分钟,文件大小不超过 100 M |
| model_type | 模型类型 | 否 | 默认模型为 cicada1.0;speech 5.0 蝉镜语音·升级版传 cicada2.0;8B 模型传 cicada4.0,原有 cicada1.0、cicada3.0、cicada3.0-turbo 参数保持兼容。具体收费参考 计费说明 |
| language | 语种 | 否 | 默认为cn,支持en英文,其他语种暂不支持,如有特殊语种需要支持,请联系客服 |
| text | 字符串 | 否 | 声音预览文案,文本内容不得超过50个字符,不得仅传数字 |
| callback | 字符串 | 否 | 回调地址,任务结束后会向该地址发送一个 POST 请求。请求体的格式和获取声音定制结果详情查询结果返回的data相同 |
请求示例
{
"name": "example",
"url": "https://example.com/abc.mp3",
"callback": "https://example.com/callback"
}8B 声音克隆
8B 对应 speech 3.0 蝉镜语音·高保真版,调用同一个定制接口,显式传入 model_type=cicada4.0。不传时仍使用默认模型,不会自动切换为 8B。支持中文(cn)和英文(en)。
{
"name": "8B定制音色",
"url": "https://example.com/reference.wav",
"model_type": "cicada4.0",
"language": "cn",
"text": "你好,这是我的定制音色。"
}将 url 替换为符合上方要求、服务端可访问的音频地址。请求成功后,以返回的 data 作为音色 ID 查询定制结果。当 status=2 时,可将该 ID 填入语音合成的 audio_man;详情与列表中的声音类型 type 均返回 cicada4.0。
8B 克隆标准价为 60 蝉豆/次。8B API 限免活动生效时,符合条件的克隆任务免费;按服务端受理时的活动状态确定,活动结束后新受理的任务恢复标准价,已免费受理的任务不补扣。具体范围见 8B API 计费与限免。
响应
响应JOSN
{
"trace_id": "2f0f50951d0bae0a3be3569097305424",
"code": 0,
"msg": "success",
"data": "C-Audio-53e4e53ba1bc40de91ffaa74f20470fc"
}响应字段说明
| 字段 | 说明 |
|---|---|
| code | 响应状态码 |
| msg | 响应消息 |
| data | 声音的 id |
响应状态码说明
| code | 说明 |
|---|---|
| 0 | 响应成功 |
| 400 | 传入参数格式错误 |
| 10400 | AccessToken验证失败 |
| APP状态错误 | |
| 40000 | 参数错误 |
| 40001 | 超出QPS限制 |
| 50000 | 系统内部错误 |
示例代码
curl -X "POST" "https://open-api.chanjing.cc/open/v1/create_customised_audio" \
-H 'access_token: {你的 access_token}' \
-d '{
"name": "example",
"url": "https://example.com/abc.mp3",
"callback": "https://example.com/callback"
}'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://open-api.chanjing.cc/open/v1/create_customised_audio"
method := "POST"
payload := strings.NewReader("%7B%0A%20%20%22name%22%3A%20%22example%22%2C%0A%20%20%22url%22%3A%20%22https%3A%2F%2Fexample.com%2Fabc.mp3%22%2C%0A%20%20%22callback%22%3A%20%22https%3A%2F%2Fexample.com%2Fcallback%22%0A%7D=")
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("access_token", "{你的 access_token}")
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "{
\"name\": \"example\",
\"url\": \"https://example.com/abc.mp3\",
\"callback\": \"https://example.com/callback\"
}=");
Request request = new Request.Builder()
.url("https://open-api.chanjing.cc/open/v1/create_customised_audio")
.method("POST", body)
.addHeader("access_token", "{你的 access_token}")
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = client.newCall(request).execute();import requests
url = "https://open-api.chanjing.cc/open/v1/create_customised_audio"
payload = '%7B%0A%20%20%22name%22%3A%20%22example%22%2C%0A%20%20%22url%22%3A%20%22https%3A%2F%2Fexample.com%2Fabc.mp3%22%2C%0A%20%20%22callback%22%3A%20%22https%3A%2F%2Fexample.com%2Fcallback%22%0A%7D='
headers = {
'access_token': '{你的 access_token}',
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)获取声音定制结果
说明
查询定制音色详情,异步任务的具体进度通过查询接口查看。默认查询通过 OpenAPI 创建的定制音色;如需查询当前 Open 应用关联用户在蝉镜主站网页端或 App 创建的个人音色,请传 source=1。
响应中的 supported_dialects 是该音色在视频合成中实际可用的方言 ID 集合。创建视频时,audio.tts.dialect 必须包含在该集合中;[] 表示当前音色不支持视频方言合成。支持的方言 ID 见方言视频合成。不得根据 type、language 或音色名称推断;source=1 的主站音色同样适用。
QPS 10/min
请求地址
GET /open/v1/customised_audio?id=xxxxxxxxxxxxxHeader
access_token: {{access_token}}请求参数 Query Params
| Key | Value | 说明 |
|---|---|---|
| id | C-Audio-53e4e53ba1bc40de91ffaa74f20470fa | 声音id,创建任务或列表接口返回 |
| source | 0 | 可选。默认 0,查询 OpenAPI 渠道定制音色;传 1 时查询当前 Open 应用关联用户的蝉镜主站个人定制音色。其他值返回参数错误 |
响应
返回示例
{
"trace_id": "7994cedae0f068d1e9e4f4abdf99215b",
"code": 0,
"msg": "success",
"data": {
"id": "C-Audio-53e4e53ba1bc40de91ffaa74f20470fc",
"name": "声音克隆",
"type": "cicada1.0",
"progress": 0,
"audio_path": "",
"err_msg": "不支持的音频格式,请阅读接口文档",
"status": 2,
"supported_dialects": []
}
}响应字段说明
| 一级字段 | 二级字段 | 说明 |
|---|---|---|
| code | 响应状态码 | |
| msg | 响应消息 | |
| data | 响应数据 | |
| id | 声音 id | |
| progress | 任务进度 0-100 | |
| type | 声音模型类型(cicada1.0、cicada2.0、cicada3.0、cicada3.0-turbo、cicada4.0);cicada2.0 为 speech 5.0 蝉镜语音·升级版,cicada4.0 为 8B | |
| name | 声音名称 | |
| err_msg | 异常或失败的错误信息 | |
| audio_path | 训练音频片段(从原音频中截取的有效片段用于训练) | |
| status | 制作状态 0 等待制作1制作中 2已完成 3已过期 4 制作失败 99 已删除 | |
| supported_dialects | 视频合成实际可用的方言 ID 集合;创建视频时所选 dialect 必须包含在集合中,[] 表示当前音色不支持视频方言合成 |
响应状态码说明
| code | 说明 |
|---|---|
| 0 | 响应成功 |
| 10400 | AccessToken验证失败 |
| APP状态错误 | |
| 该AI语音被禁用或者不存在 | |
| 40000 | 参数错误 |
| 40001 | 超出QPS限制 |
| 50000 | 系统内部错误 |
示例代码
curl -L 'https://open-api.chanjing.cc/open/v1/customised_audio?id=C-Audio-53e4e53ba1bc40de91ffaa74f20470fc' -H 'access_token: HjKpDp6o3o2P2el7VHaMKwpHIJs+rkYNspNBRAZ7VU8WC/bz93oUKUNhHENRt28x'package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://open-api.chanjing.cc/open/v1/customised_audio?id=C-Audio-53e4e53ba1bc40de91ffaa74f20470fc"
method := "GET"
client := &http.Client {
}
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("access_token", "HjKpDp6o3o2P2el7VHaMKwpHIJs+rkYNspNBRAZ7VU8WC/bz93oUKUNhHENRt28x")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://open-api.chanjing.cc/open/v1/customised_audio?id=C-Audio-53e4e53ba1bc40de91ffaa74f20470fc")
.method("GET", body)
.addHeader("access_token", "HjKpDp6o3o2P2el7VHaMKwpHIJs+rkYNspNBRAZ7VU8WC/bz93oUKUNhHENRt28x")
.build();
Response response = client.newCall(request).execute();import requests
url = "https://open-api.chanjing.cc/open/v1/customised_audio?id=C-Audio-53e4e53ba1bc40de91ffaa74f20470fc"
payload = {}
headers = {
'access_token': 'HjKpDp6o3o2P2el7VHaMKwpHIJs+rkYNspNBRAZ7VU8WC/bz93oUKUNhHENRt28x'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)获取声音定制列表
说明
默认仅查询通过 OpenAPI 声音定制任务创建的音色;传 source=1 时,查询当前 Open 应用关联用户在蝉镜主站网页端或 App 创建的个人定制音色。
主站音色查询只返回当前关联用户的个人音色,不返回团队音色、已删除音色、不可用音色或其他用户音色。列表可返回定制中或失败音色用于进度查看;视频合成时仅已完成音色可用。每个音色的 supported_dialects 表示视频合成实际可用的方言 ID;创建视频时所选 audio.tts.dialect 必须包含在集合中,[] 表示当前音色不支持视频方言合成。不能根据 type、language 或音色名称推断,source=1 的主站音色也必须以此字段为准。
QPS 10/min
请求地址
POST /open/v1/list_customised_audioHeader
access_token: {{access_token}}Content-Type:application/json
请求参数 Body
{
"page": 1,
"page_size": 2,
"source": 0
}参数说明
| 字段 | 说明 |
|---|---|
| page | 当前页 |
| page_size | 每页数量,最大 50 |
| source | 可选。默认 0,查询 OpenAPI 渠道定制音色;传 1 时查询当前 Open 应用关联用户的蝉镜主站个人定制音色。其他值返回参数错误 |
使用
source=1查到的主站音色参与视频合成时,需在 创建视频合成任务 中同时传audio_source=1。
响应
返回示例
{
"trace_id": "",
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": "C-Audio-793d02b175994ece930001a5589e514c",
"progress": 100,
"name": "声音克隆",
"audio_path": "https://chanjin.cc/chanjing/custom/person/2024-12-26/29e3e5eff93a676eecc2b00530081dab.wav",
"err_msg": "",
"supported_dialects": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
},
{
"id": "C-Audio-7984a80178434b868788a45cfd6abfbb",
"progress": 0,
"name": "声音克隆",
"audio_path": "",
"err_msg": "任务失败,请重试,或联系客服处理"
}
],
"page_info": {
"page": 1,
"size": 2,
"total_count": 2,
"total_page": 1
}
}
}响应字段说明
| 一级字段 | 二级字段 | 三级字段 | 说明 |
|---|---|---|---|
| code | 响应状态码 | ||
| msg | 响应消息 | ||
| data | 响应数据 | ||
| list | 声音定制列表 | ||
| id | 声音 id | ||
| progress | 任务进度 0-100 | ||
| type | 声音模型类型(cicada1.0、cicada2.0、cicada3.0、cicada3.0-turbo、cicada4.0);cicada2.0 为 speech 5.0 蝉镜语音·升级版,cicada4.0 为 8B | ||
| name | 声音名称 | ||
| err_msg | 异常或失败的错误信息 | ||
| audio_path | 训练音频片段(从原音频中截取的有效片段用于训练) | ||
| status | 制作状态 0等待制作 1制作中 2已完成 3已过期 4 制作失败 99 已删除 | ||
| supported_dialects | 视频合成实际可用的方言 ID 集合;创建视频时所选 dialect 必须包含在集合中,[] 表示当前音色不支持视频方言合成 | ||
| page_info | 分页信息 | ||
| page | 当前页码 | ||
| size | 页面大小(与请求参数 page_size 对应,最大 50) | ||
| total_count | 声音总数 | ||
| total_page | 总页数 |
响应状态码说明
| code | 说明 |
|---|---|
| 0 | 响应成功 |
| 400 | 传入参数格式错误 |
| 10400 | AccessToken验证失败 |
| APP状态错误 | |
| 40000 | 参数错误 |
| 40001 | 超出QPS限制 |
| 50000 | 系统内部错误 |
| 51000 | 系统内部错误 |
示例代码
curl -L -X POST 'https://open-api.chanjing.cc/open/v1/list_customised_audio' -H 'access_token: NPSMe0G338uGmGEIAWfjfoI+YaGFquongf70BsiOOUifE+icRi3tEae1G2TaH/Db' -H 'Content-Type: application/json' -d '{"page":1,"page_size":5}'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://open-api.chanjing.cc/open/v1/list_customised_audio"
method := "POST"
payload := strings.NewReader(`{"page":1,"page_size":5}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("access_token", "NPSMe0G338uGmGEIAWfjfoI+YaGFquongf70BsiOOUifE+icRi3tEae1G2TaH/Db")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"page\":1,\"page_size\":5}");
Request request = new Request.Builder()
.url("https://open-api.chanjing.cc/open/v1/list_customised_audio")
.method("POST", body)
.addHeader("access_token", "NPSMe0G338uGmGEIAWfjfoI+YaGFquongf70BsiOOUifE+icRi3tEae1G2TaH/Db")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();import requests
import json
url = "https://open-api.chanjing.cc/open/v1/list_customised_audio"
payload = json.dumps({
"page": 1,
"page_size": 5
})
headers = {
'access_token': 'NPSMe0G338uGmGEIAWfjfoI+YaGFquongf70BsiOOUifE+icRi3tEae1G2TaH/Db',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)删除定制声音
说明
删除用户通过声音定制接口创建的声音ID。 异步任务,具体进度通过查询接口查看
QPS 10/min
请求地址
POST /open/v1/delete_customised_audioHeader
access_token: {{access_token}}
Content-Type:application/json请求参数 Body
| 参数名称 | 类型 | 是否必传 | 示例 | 说明 |
|---|---|---|---|---|
| id | string | 是 | C-Audio-96e769c803f24d0c9eee6d19cb0896e4 | 声音ID |
请求示例
{
"id":"C-Audio-96e769c803f24d0c9eee6d19cb0896e4"
}响应JSON
{
"trace_id": "26965518b54aeccc6a34dfc49c1ca7c8",
"code": 0,
"msg": "success"
}响应参数
| 字段 | 说明 |
|---|---|
| code | 响应状态码 |
| msg | 响应消息 |
响应状态号说明
| code | 说明 |
|---|---|
| 0 | 响应成功 |
| 400 | 传入参数格式错误 |
| 40000 | 参数错误 |
| 40001 | 超出QPS限制 |
| 50000 | 系统内部错误 |
| 没有找到对应的声音 |