Skip to content

定制音色 ​

曾用名:定制声音。

创建声音定制任务 ​

说明 ​

蝉镜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多场景复刻还原,能复刻角色感,而不是只复刻声线,完美保留声音里的情绪张力

使用流程 ​

定制声音功能的实现具体流程如下:

  1. 上传待克隆的音频
  • 支持上传的文件需要遵循以下规范:

上传的音频文件格式需为: mp3、wav、m4a格式;

上传的音频文件的有效音频时长范围在30秒到5分钟,其中有效的说话人音频时长不低于10秒;

文件大小不超过 100 M;

  1. 选取相应的模型
  • speech 5.0 蝉镜语音·升级版使用 cicada2.0,8B 模型使用 cicada4.0,其他声音模型继续使用原有的模型参数。
  1. 上传声音预览文案
  • 声音预览文案不能超过50个字符,且不能仅传数字
  1. 调用声音定制接口
  • 输入上述入参,调用声音定制接口,获取响应 data 中的音色 ID;使用该 ID 查询定制结果。

注意: 此任务QPS 10/min,具体进度通过查询接口查看

请求地址 ​

http
POST /open/v1/create_customised_audio
http
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相同

请求示例 ​

json
{
  "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)。

json
{
  "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 ​

json
{
  "trace_id": "2f0f50951d0bae0a3be3569097305424",
  "code": 0,
  "msg": "success",
  "data": "C-Audio-53e4e53ba1bc40de91ffaa74f20470fc"
}

响应字段说明 ​

字段说明
code响应状态码
msg响应消息
data声音的 id

响应状态码说明 ​

code说明
0响应成功
400传入参数格式错误
10400AccessToken验证失败
APP状态错误
40000参数错误
40001超出QPS限制
50000系统内部错误

示例代码 ​

bash
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"
}'
go
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))
}
java
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();
py
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

请求地址 ​

http
GET /open/v1/customised_audio?id=xxxxxxxxxxxxx

Header ​

http
access_token: {{access_token}}

请求参数 Query Params ​

KeyValue说明
idC-Audio-53e4e53ba1bc40de91ffaa74f20470fa声音id,创建任务或列表接口返回
source0可选。默认 0,查询 OpenAPI 渠道定制音色;传 1 时查询当前 Open 应用关联用户的蝉镜主站个人定制音色。其他值返回参数错误

响应 ​

返回示例 ​

json
{
  "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响应成功
10400AccessToken验证失败
APP状态错误
该AI语音被禁用或者不存在
40000参数错误
40001超出QPS限制
50000系统内部错误

示例代码 ​

bash
curl -L 'https://open-api.chanjing.cc/open/v1/customised_audio?id=C-Audio-53e4e53ba1bc40de91ffaa74f20470fc' -H 'access_token: HjKpDp6o3o2P2el7VHaMKwpHIJs+rkYNspNBRAZ7VU8WC/bz93oUKUNhHENRt28x'
go
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))
}
java
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();
py
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

请求地址 ​

http
POST /open/v1/list_customised_audio

Header ​

http
access_token: {{access_token}}

Content-Type:application/json

请求参数 Body ​

json
{
  "page": 1,
  "page_size": 2,
  "source": 0
}

参数说明

字段说明
page当前页
page_size每页数量,最大 50
source可选。默认 0,查询 OpenAPI 渠道定制音色;传 1 时查询当前 Open 应用关联用户的蝉镜主站个人定制音色。其他值返回参数错误

使用 source=1 查到的主站音色参与视频合成时,需在 创建视频合成任务 中同时传 audio_source=1。

响应 ​

返回示例 ​

json
{
    "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传入参数格式错误
10400AccessToken验证失败
APP状态错误
40000参数错误
40001超出QPS限制
50000系统内部错误
51000系统内部错误

示例代码 ​

bash
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}'
go
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))
}
java
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();
py
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

请求地址 ​

http
POST  /open/v1/delete_customised_audio

Header ​

http
access_token: {{access_token}}
Content-Type:application/json

请求参数 Body ​

参数名称类型是否必传示例说明
idstring是C-Audio-96e769c803f24d0c9eee6d19cb0896e4声音ID

请求示例 ​

json
{
    "id":"C-Audio-96e769c803f24d0c9eee6d19cb0896e4"
}

响应JSON ​

json
{
    "trace_id": "26965518b54aeccc6a34dfc49c1ca7c8",
    "code": 0,
    "msg": "success"
}

响应参数 ​

字段说明
code响应状态码
msg响应消息

响应状态号说明 ​

code说明
0响应成功
400传入参数格式错误
40000参数错误
40001超出QPS限制
50000系统内部错误
没有找到对应的声音