模型介绍
ChatTTS 是一款专为实时对话场景深度定制的语音生成(TTS)模型。不同于传统朗读型模型,ChatTTS 旨在解决 AI 交互中的自然语音合成问题。
模型基于约 10 万小时的高质量中英文混合数据进行训练,具备极强的韵律感与表现力。它能够完美支持中文与英文的混合合成,为对话机器人、虚拟数字人及音视频内容创作提供高度拟人、流畅自然的语音输出能力。
基础信息
| 项目 | 说明 |
|---|---|
| 接口名称 | ChatTTS 语音合成 |
| 接口地址 | https://www.yuntts.com/api/v1/chattts_generate |
| 请求方式 | POST |
| 返回格式 | JSON |
| 是否需要认证 | 是 (Bearer Token) |
请求头
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Content-Type | String | 是 | 固定值:application/json |
| Authorization | String | 是 | 认证令牌,格式:Bearer {API_KEY} |
请求参数
公共参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| input | String | 是 | 无 | 要合成的文本内容,最大长度根据实际情况限制 |
| prompt | String | 否 | [oral_1] |
此参数表示口语化程度,取值范围为 [0,9] 数值越小,表达越官方,数值越大,表达越生活化。 |
| temperature | Number | 否 | 0.2 |
采样温度控制输出的随机性。温度值在 [0.0, 1.0] 范围内,值越高,输出越随机和创造性;值越低,输出越稳定。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。 |
| top_P | Number | 否 | 0.7 |
采样方法的取值范围为 [0.0,1.0]。top_p 值确定模型从概率最高的前 p% 的候选词中选取 tokens;当 top_p 为 0 时,此参数无效。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。 |
| top_K | Number | 否 | 20 |
取值范围为 [0,20],限制模型在每一步选择下一个词时,只从概率最高的前 k 个词中选取。数值越大,文本生成越多样。 |
| voice | String | 否 | 空 | 自定义音色标识,如:alloy |
| voice_url | String | 否 | 空 | .pt 格式的文件链接,用于调整生成语音的音色 |
| skip_refine | Integer | 否 | 0 |
是否跳过文本优化:0-否,1-是 |
| custom_voice | Integer | 否 | 0 |
是否使用自定义音色:0-否,1-是,开启后可传入voice_url |
参数详细说明
input
- 类型:字符串
- 必填:是
- 说明:要转换为语音的文本内容
- 示例:
"今天天气真好,适合出去游玩"
prompt
- 类型:字符串
- 必填:否
- 默认值:
[oral_1] - 说明:ChatTTS 的提示词参数,用于控制语音的语调和风格
- 可选值:
[oral_1]- 默认口语风格[oral_2]- 另一种口语风格[oral_3]- 正式风格- 数字格式如
1、2、3会自动转换为[oral_1]、[oral_2]、[oral_3]
temperature
- 类型:浮点数
- 必填:否
- 默认值:
0.2 - 范围:0.0 - 1.0
- 说明:控制生成结果的随机性,值越小越稳定,值越大越随机
top_P
- 类型:浮点数
- 必填:否
- 默认值:
0.7 - 范围:0.0 - 1.0
- 说明:Nucleus 采样参数,值越高词汇选择范围越广
top_K
- 类型:整数
- 必填:否
- 默认值:
20 - 范围:大于 0
- 说明:Top-K 采样参数,从概率最高的 K 个词中采样
voice
- 类型:字符串
- 必填:否
- 说明:指定使用某个预设音色
voice_url
- 类型:字符串 (URL)
- 必填:否
- 说明:自定义音色参考音频的 URL 地址
skip_refine
- 类型:整数
- 必填:否
- 默认值:
0 - 说明:是否跳过文本优化步骤,1 表示跳过,0 表示不跳过
custom_voice
- 类型:整数
- 必填:否
- 默认值:
0 - 说明:是否使用自定义音色,1 表示使用,0 表示不使用
请求示例
cURL 请求
curl -X POST 'https://www.yuntts.com/api/v1/chattts_generate'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer YOUR_API_KEY'
-d '{
"input": "今天天气真好,适合出去游玩",
"prompt": "[oral_1]",
"temperature": "0.2",
"top_P": "0.7",
"top_K": "20",
"skip_refine": "0",
"custom_voice": "0"
}'JavaScript 请求
async function synthesizeSpeech() {
const apiKey = 'YOUR_API_KEY';
const inputText = '今天天气真好,适合出去游玩';
const response = await fetch('https://www.yuntts.com/api/v1/chattts_generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({
input: inputText,
prompt: '[oral_1]',
temperature: 0.2,
top_P: 0.7,
top_K: 20,
skip_refine: 0,
custom_voice: 0
})
});
const data = await response.json();
console.log(data);
}Python 请求
import requests
url = 'https://www.yuntts.com/api/v1/chattts_generate'
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY'
}
data = {
'input': '今天天气真好,适合出去游玩',
'prompt': '[oral_1]',
'temperature': 0.2,
'top_P': 0.7,
'top_K': 20,
'skip_refine': 0,
'custom_voice': 0
}
response = requests.post(url, headers=headers, json=data)
print(response.json())返回数据
成功返回
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Integer | 状态码,固定为 200 |
| message | String | 返回消息,固定为 "语音合成成功" |
| data | Object | 返回数据对象 |
| data.task_id | String | 任务ID,格式如 chtts_abc123def456 |
| data.audio_url | String | 合成音频的 URL 地址 |
| data.char_count | Integer | 输入文本的字符数 |
| data.cost | Number | 本次合成费用(元) |
| data.balance | Number | 用户剩余余额(元) |
成功返回示例
{
"code": 200,
"message": "语音合成成功",
"data": {
"task_id": "chtts_abc123def456",
"audio_url": "https://your-domain.com/uploads/abc123.mp3",
"char_count": 12,
"cost": 0.03,
"balance": 99.97
}
}失败返回
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Integer | HTTP 状态码或自定义错误码 |
| error | String | 错误代码 |
| message | String | 错误描述信息 |
失败返回示例
{
"code": 403,
"error": "insufficient_balance",
"message": "余额不足,需要0.03元,当前余额0元"
}状态码说明
| HTTP 状态码 | 错误码 | 说明 |
|---|---|---|
| 200 | 成功 | 请求成功,语音合成完成 |
| 400 | json_decode_failed | JSON 解析失败,请求体格式错误 |
| 400 | invalid_parameters | 缺少必要参数或参数格式错误 |
| 401 | empty_key | Authorization 请求头为空 |
| 401 | invalid_key | API 密钥无效 |
| 401 | db_connection_failed | 数据库连接失败 |
| 403 | insufficient_balance | 用户余额不足 |
| 405 | method_not_allowed | 请求方法不允许,仅支持 POST |
| 500 | deduct_failed | 扣费失败 |
| 500 | api_request_failed | API 请求失败(网络错误、超时等) |
| 500 | api_error | API 返回错误响应 |
| 500 | api_format_error | API 返回格式错误 |
| 500 | file_write_failed | 临时文件写入失败 |
| 500 | oss_upload_failed | 音频上传到 OSS 失败 |
| 500 | db_insert_failed | 任务记录保存失败 |
计费说明
计费方式
- 计费类型:按次计费(不是按字符数)
- 基础费率:0.03 元/次
- 最低扣费:0.01 元
折扣说明
| 用户类型 | 折扣 | 折后价格 |
|---|---|---|
| 普通用户 | 无折扣 | 0.03 元/次 |
| VIP 会员 | 9 折 | 0.027 元/次 |
| SVIP 会员 | 8 折 | 0.024 元/次 |
费用计算示例
- 普通用户:0.03 元/次
- VIP 用户:0.03 × 0.9 = 0.027 元/次
- SVIP 用户:0.03 × 0.8 = 0.024 元/次
余额不足处理
当用户余额小于所需费用时,接口会返回 403 错误,不会扣除任何费用。
扣费失败处理
当扣费失败时,接口会返回 500 错误,不会扣除任何费用。
错误处理建议
常见错误及解决方案
1. 余额不足 (403)
{
"code": 403,
"error": "insufficient_balance",
"message": "余额不足,需要0.03元,当前余额0元"
}解决方案:请充值后再试。
2. API 密钥无效 (401)
{
"code": 401,
"error": "invalid_key",
"message": "通过API密钥查询用户失败"
}解决方案:检查 API Key 是否正确,或重新生成 API Key。
3. 缺少必要参数 (400)
{
"code": 400,
"error": "invalid_parameters",
"message": "缺少必要参数:input"
}解决方案:确保请求中包含 input 参数。
4. 网络超时 (500)
{
"code": 500,
"error": "api_request_failed",
"message": "语音合成失败:cURL error 28: Resolving timed out..."
}解决方案:
- 检查网络连接
- 稍后重试
- 联系服务器管理员检查 DNS 配置
音频文件说明
音频格式
- 格式:MP3
- 采样率:根据 API 返回
音频有效期
- 请在 24 小时内下载,过期后可能自动清理
下载方式
- 直接访问返回的
audio_url下载
版本历史
| 版本 | 日期 | 更新内容 |
|---|---|---|
| v1.0.0 | 2026-01-24 | 初始版本 |
注意事项
- 字符限制:单次请求的文本长度建议不超过实际限制
- 并发限制:请勿过于频繁请求,以免触发 API 限流
- 余额检查:建议在请求前检查用户余额
- 错误重试:建议实现错误重试机制
- HTTPS:生产环境建议使用 HTTPS
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。


评论(0)