文生语音 API
文生语音 API 基于 IndexTTS 2.5,提供异步语音生成、任务管理、参考音频上传、自定义音色管理和积分查询能力。支持中文、英文、日文、西班牙语和阿拉伯语,可调整语速、情绪和指定词语的读音。
创建任务后,使用任务 ID 轮询生成状态,成功后通过结果 URL 下载 WAV 音频。
接口总览
共包含 12 个接口,其中积分套餐查询与 MiniMax H3 共用:
| 功能 | 方法 | 路径 |
|---|---|---|
| 创建文生语音任务 | POST | /audio/v1/speech/jobs |
| 查询单个任务 | GET | /audio/v1/speech/jobs/{task_id} |
| 查询任务列表 | GET | /audio/v1/speech/jobs |
| 取消任务 | POST | /audio/v1/speech/jobs/{task_id}/cancel |
| 删除任务 | DELETE | /audio/v1/speech/jobs/{task_id} |
| 查询音色列表 | GET | /audio/v1/voices |
| 获取参考音频上传地址 | POST | /audio/v1/upload_urls |
| 登记参考音频素材 | POST | /audio/v1/assets |
| 创建自定义音色 | POST | /audio/v1/voices |
| 删除自定义音色 | DELETE | /audio/v1/voices/{voice_id} |
| 查询语音计价与积分余额 | GET | /audio/v1/pricing |
| 查询积分套餐包 | GET | /minimax/v2/query/point_packages |
接入信息
请求地址
https://cp.compshare.cn身份认证
使用与 MiniMax H3 相同的模型 API Key,以 sk-ml- 开头:
- 进入优云智算视频工作台 。
- 点击左侧工具栏中的 API 按钮,打开 API 密钥窗口。
- 创建或复制模型 API Key,并在调用时携带以下请求头:
Authorization: Bearer <YOUR_API_KEY>音频任务、参考素材和自定义音色归属于 API Key 对应的顶级组织。同组织的工作台用户和模型 API Key 共享这些资源及积分余额。组织归属由平台鉴权确定,请求中无需填写账号或组织 ID。
公共请求约定
| 名称 | 必填 | 描述 |
|---|---|---|
| Authorization | 是 | Bearer <YOUR_API_KEY> |
| Content-Type | 条件必填 | 携带 JSON 请求体时必须为 application/json |
| Accept | 否 | 建议设置为 application/json |
| Idempotency-Key | 条件必填 | 创建语音任务、创建自定义音色时必填,去除首尾空白后为 1~128 个字符 |
- 请求和成功响应使用本文定义的
snake_case字段;不支持的请求体字段会报错。 - 时间戳均为 Unix 秒级时间戳;
duration_ms单位为毫秒;文件大小单位为字节。 - 同一组织的模型 API 调用,在同一创建接口重复使用相同幂等键时会复用已有资源,不会按新的参数重新创建。请求超时后应使用原键重试;创建新任务或新音色时使用新的键,建议使用 UUID。
- 音频生成采用轮询查询模式。任务创建成功响应为 JSON,生成结果为 WAV 文件。
推荐调用流程
- 查询语音计价与积分余额,确认
enabled=true且balance.available_points足够。 - 查询音色列表,取得平台预设音色或自定义音色的
voice_id。 - 创建语音任务,保存返回的
task_id。 - 每隔 3 秒查询一次任务,直到状态为
succeeded、failed或cancelled。 - 成功后从
task.output_url下载音频。
需要使用自己的参考音频时,先完成「获取上传地址 → PUT 上传文件 → 登记素材」,取得 asset_id 后即可用于生成,也可将其保存为自定义音色。
创建文生语音任务
POST https://cp.compshare.cn/audio/v1/speech/jobs请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| text | String | 是 | 正文,最多 2000 个 Unicode 字符;至少包含一个汉字、字母或数字,不能只有空白、标点或符号 | 你好,欢迎使用优云智算。 |
| language | String | 否 | 语言:ZH 中文、EN 英文、JA 日文、ES 西班牙语、AR 阿拉伯语;默认 ZH,区分大小写 | ZH |
| voice | Object | 是 | 音色引用,结构见下表 | {"source":"preset","voice_id":"<VOICE_ID>"} |
| speed | Number | 否 | 语速,范围 0.5~2.0;省略或传 0 时按 1.0 处理 | 1.0 |
| auto_emotion | Boolean | 否 | 自动推断情绪,默认 true | true |
| emotion_description | String | 否 | 情绪描述,最多 200 个字符;非空时使用描述引导情绪 | 温柔、平静,适合睡前故事 |
| emotion_strength | Number | 否 | 情绪强度,范围 0~1,默认 0.8;显式传 0 时保留零值 | 0.8 |
| emotion_vector | Array of Number | 否 | 8 维手动情绪向量,约束见下文 | [0.4,0,0,0,0,0,0,0] |
| emotion_vector_mode | String | 否 | single 或 mixed;必须与 emotion_vector 一起使用 | single |
| pronunciations | Array of Object | 否 | 读音规则,最多 100 条,结构见下文 | [{"word":"重庆","kind":"pinyin","value":"chong2 qing4"}] |
| save_voice | Boolean | 否 | 默认 false;仅 voice.source=asset 时可设为 true,同时保存一个自定义音色 | false |
| voice_name | String | 条件必填 | save_voice=true 时必填,去除首尾空白后为 1~64 个字符 | 我的旁白音色 |
音色引用
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| voice.source | String | 是 | preset 平台预设音色、custom 自定义音色、asset 临时参考素材 |
| voice.voice_id | String | 条件必填 | source=preset/custom 时必填,通过音色列表或创建音色接口获取 |
| voice.asset_id | String | 条件必填 | source=asset 时必填,通过登记参考音频素材接口获取 |
使用 preset/custom 时只需传 voice_id;使用 asset 时只需传 asset_id。示例中的 ID 均为占位值,应替换为接口实际返回的 ID。
预设音色示例
curl -X POST 'https://cp.compshare.cn/audio/v1/speech/jobs' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: speech-preset-001' \
-d '{
"text": "你好,欢迎使用优云智算文生语音服务。",
"language": "ZH",
"voice": {"source": "preset", "voice_id": "<PRESET_VOICE_ID>"},
"speed": 1.0,
"auto_emotion": true
}'自定义音色与读音示例
curl -X POST 'https://cp.compshare.cn/audio/v1/speech/jobs' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: speech-custom-001' \
-d '{
"text": "欢迎来到重庆,这是一段温柔的城市介绍。",
"language": "ZH",
"voice": {"source": "custom", "voice_id": "<CUSTOM_VOICE_ID>"},
"speed": 0.9,
"auto_emotion": false,
"emotion_description": "温柔、自然,像朋友在介绍自己的家乡",
"emotion_strength": 0.8,
"pronunciations": [
{"word": "重庆", "kind": "pinyin", "value": "chong2 qing4"}
]
}'手动情绪向量
情绪向量固定为 8 维,顺序为:高兴、愤怒、悲伤、恐惧、厌恶、低落、惊讶、平静。
- 每个元素必须是
0~0.8的数值,不能为null。 - 元素之和必须大于
0且不超过0.8。 - 必须显式传入
auto_emotion=false,并省略emotion_description或传空字符串。 single模式必须恰好有一个非零元素;mixed支持组合情绪。- 省略
emotion_vector_mode时,一个非零元素自动按single处理,否则按mixed处理。 emotion_strength单独控制强度,传向量时无需先将强度乘进向量。
例如,在创建请求中加入:
{
"auto_emotion": false,
"emotion_vector": [0.4, 0, 0, 0, 0, 0, 0, 0.2],
"emotion_vector_mode": "mixed",
"emotion_strength": 0.8
}auto_emotion=false 且没有情绪描述、情绪向量时,使用参考音色本身的表现进行生成。
读音规则
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| pronunciations[].word | String | 是 | 正文中的目标词语,去除首尾空白后为 1~64 个字符;同一请求中不能重复 |
| pronunciations[].kind | String | 是 | pinyin、alias、cmu 或 kana |
| pronunciations[].value | String | 是 | 指定读音,去除首尾空白后为 1~512 个字符 |
| kind | 用途 | 示例 |
|---|---|---|
pinyin | 中文拼音;目标词须为汉字,拼音音节数量与汉字数量一致,每个音节需带声调,音节间用空格分隔 | {"word":"重庆","kind":"pinyin","value":"chong2 qing4"} |
alias | 用另一段文字引导目标词的读音 | {"word":"API","kind":"alias","value":"诶屁爱"} |
cmu | 英文 CMU/ARPAbet 音素,音素间用空格分隔 | {"word":"read","kind":"cmu","value":"R IY1 D"} |
kana | 日文假名,平台统一规范为片假名 | {"word":"今日","kind":"kana","value":"キョウ"} |
词语和读音不能包含控制字符或 <、>、|。读音规则不改变积分计费所依据的原始正文。
响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| task_id | String | 任务 ID,用于查询、取消和删除任务 |
{"task_id": "019xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}查询单个任务
GET https://cp.compshare.cn/audio/v1/speech/jobs/{task_id}路径参数 task_id 为创建接口返回的任务 ID,无请求体。
curl 'https://cp.compshare.cn/audio/v1/speech/jobs/<TASK_ID>' \
-H 'Authorization: Bearer <YOUR_API_KEY>'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| task | Object | 任务详情 |
| task.task_id | String | 任务 ID |
| task.type | String | 固定为 text_to_speech |
| task.input | Object | 规范化后的生成参数,字段与创建请求相同,包含生效的默认值 |
| task.status | String | queued、generating、succeeded、failed 或 cancelled |
| task.attempt | Integer | 已尝试的执行次数,尚未执行时为 0 |
| task.max_attempts | Integer | 最大执行尝试次数,当前为 3 |
| task.point_cost | Integer | 本任务的积分费用 |
| task.point_status | String | reserved 已预占、consumed 已扣除、released 已释放;历史未计费记录可为空 |
| task.error_message | String | 失败原因,非失败任务为空字符串 |
| task.output_url | String | 生成音频的下载 URL,成功前为空字符串 |
| task.output_size | Integer | 生成音频大小,单位为字节;未生成时为 0 |
| task.created_at | Integer | 创建时间 |
| task.started_at | Integer | 开始执行时间,尚未开始时为 0 |
| task.finished_at | Integer | 结束时间,尚未结束时为 0 |
响应示例
{
"task": {
"task_id": "019xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"type": "text_to_speech",
"input": {
"text": "你好,欢迎使用优云智算。",
"language": "ZH",
"voice": {"source": "preset", "voice_id": "<PRESET_VOICE_ID>"},
"auto_emotion": true,
"emotion_strength": 0.8,
"speed": 1
},
"status": "succeeded",
"attempt": 1,
"max_attempts": 3,
"point_cost": 2,
"point_status": "consumed",
"error_message": "",
"output_url": "https://example.com/generated/output.wav",
"output_size": 240000,
"created_at": 1789459200,
"started_at": 1789459203,
"finished_at": 1789459215
}
}示例中的积分费用仅用于说明响应结构,实际以任务返回值为准。生成结果默认在任务结束后保留 7 天,请及时下载保存;主动删除任务后,结果文件会被删除。
查询任务列表
GET https://cp.compshare.cn/audio/v1/speech/jobs查询参数
| 名称 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| offset | Integer | 否 | 从 0 开始的偏移量,默认 0 | 0 |
| limit | Integer | 否 | 每页数量,范围 1~100,默认 20 | 20 |
| task_id | String | 否 | 精确筛选任务 ID | <TASK_ID> |
| statuses | String(可重复) | 否 | 按任务状态筛选,多次传入表示匹配任一状态 | queued |
| start_time | Integer | 否 | 创建时间下界,包含边界;0 或省略表示不限制 | 1789459200 |
| end_time | Integer | 否 | 创建时间上界,包含边界;0 或省略表示不限制;同时指定时须不小于 start_time | 1789545600 |
按创建时间从新到旧返回;已删除的任务不出现在列表中。
curl 'https://cp.compshare.cn/audio/v1/speech/jobs?offset=0&limit=20&statuses=queued&statuses=generating' \
-H 'Authorization: Bearer <YOUR_API_KEY>'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| items | Array of Object | 当前页任务,元素字段与单任务查询的 task 相同 |
| total | Integer | 符合全部筛选条件的任务总数 |
| status_counts | Object | 各状态任务数;应用组织、任务 ID 和时间筛选,但不受 statuses 和分页影响;没有任务的状态可能不返回 |
例如,当前筛选没有排队或生成中的任务,但有 3 个已成功任务时:
{"items": [], "total": 0, "status_counts": {"succeeded": 3}}取消任务
POST https://cp.compshare.cn/audio/v1/speech/jobs/{task_id}/cancel路径参数 task_id 为待取消任务 ID,无请求体。仅 queued 状态可取消,取消后释放预占积分。已经开始生成或已经结束的任务会返回业务错误。
curl -X POST 'https://cp.compshare.cn/audio/v1/speech/jobs/<TASK_ID>/cancel' \
-H 'Authorization: Bearer <YOUR_API_KEY>'成功响应中的 task_id 为任务 ID,status 为 cancelled:
{"task_id": "019xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "status": "cancelled"}删除任务
DELETE https://cp.compshare.cn/audio/v1/speech/jobs/{task_id}路径参数 task_id 为待删除任务 ID,无请求体。任务必须已经处于 succeeded、failed 或 cancelled,且积分已经结算。删除后任务不再出现在查询结果中,生成文件会被删除,已消费积分不会因删除而退回。
curl -X DELETE 'https://cp.compshare.cn/audio/v1/speech/jobs/<TASK_ID>' \
-H 'Authorization: Bearer <YOUR_API_KEY>'成功响应中的 deleted=true 表示删除成功:
{"task_id": "019xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "deleted": true}查询音色列表
GET https://cp.compshare.cn/audio/v1/voices查询参数 kind 可取 preset 或 custom,默认 preset。预设音色仅返回平台已上线的音色;自定义音色返回当前组织共享的音色。
curl 'https://cp.compshare.cn/audio/v1/voices?kind=preset' \
-H 'Authorization: Bearer <YOUR_API_KEY>'
curl 'https://cp.compshare.cn/audio/v1/voices?kind=custom' \
-H 'Authorization: Bearer <YOUR_API_KEY>'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| items | Array of Object | 音色列表,无音色时为 [] |
| items[].voice_id | String | 音色 ID,创建语音任务时作为 voice.voice_id 使用 |
| items[].kind | String | preset 或 custom |
| items[].name | String | 音色名称 |
| items[].description | String | 音色描述,未设置时不返回 |
| items[].language | String | 音色语言信息,未设置时不返回 |
| items[].voice_type | String | 音色类型信息,未设置时不返回 |
| items[].style_tags | Array of String | 风格标签,无标签时为 [] |
| items[].sample_text | String | 示例文本,未设置时不返回 |
| items[].audio_url | String | 音色试听音频 URL |
| items[].created_at | Integer | 创建时间 |
| total | Integer | 音色总数 |
{
"items": [{
"voice_id": "<PRESET_VOICE_ID>",
"kind": "preset",
"name": "示例旁白",
"style_tags": ["自然"],
"audio_url": "https://example.com/voice-sample.wav",
"created_at": 1789459200
}],
"total": 1
}获取参考音频上传地址
POST https://cp.compshare.cn/audio/v1/upload_urls文件要求
- 支持 WAV、MP3、FLAC、OGG、M4A,文件扩展名和
content_type必须匹配。 - 单个文件默认上限为 15 MiB(15728640 字节)。
- 用于登记的参考音频时长必须为 500~15000 毫秒。
file_name为文件名,最多 255 个字符,不能包含目录分隔符或控制字符。
| 文件扩展名 | content_type |
|---|---|
.wav | audio/wav,也支持 audio/x-wav、audio/wave、audio/vnd.wave |
.mp3 | audio/mpeg |
.flac | audio/flac 或 audio/x-flac |
.ogg | audio/ogg |
.m4a | audio/mp4 或 audio/x-m4a |
请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| file_name | String | 是 | 参考音频文件名 | reference.wav |
| content_type | String | 是 | 文件 MIME 类型 | audio/wav |
| file_size | Integer | 是 | 实际文件大小,必须大于 0 | 240000 |
curl -X POST 'https://cp.compshare.cn/audio/v1/upload_urls' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-d '{"file_name":"reference.wav","content_type":"audio/wav","file_size":240000}'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| object_key | String | 上传对象标识,登记素材时原样传入 |
| upload_url | String | 用于 PUT 上传的完整地址,包含临时签名参数 |
| public_url | String | 上传暂存文件的地址;生成任务使用登记后返回的 asset_id |
| authorization | String | 兼容上传凭证字段,当前签名在 URL 中,该字段为空字符串 |
| bucket | String | 存储桶名称 |
| region | String | 存储地域 |
| expires_at | Integer | 上传地址失效时间,默认有效期为 15 分钟,以返回值为准 |
{
"object_key": "ai-audio/production/uploads/<OWNER>/<UPLOAD_ID>/staging/reference.wav",
"upload_url": "https://example.com/upload/reference.wav?UCloudPublicKey=...&Signature=...&Expires=1789460100",
"public_url": "https://example.com/upload/reference.wav",
"authorization": "",
"bucket": "<BUCKET>",
"region": "<REGION>",
"expires_at": 1789460100
}上传文件
使用返回的完整 upload_url 执行 PUT,Content-Type 必须与申请时一致:
curl --fail-with-body -X PUT '<UPLOAD_URL>' \
-H 'Content-Type: audio/wav' \
--data-binary '@reference.wav'上传使用 URL 自带的临时签名,无需携带模型 API Key。应保留 URL 的完整查询参数,上传成功后再登记素材。
登记参考音频素材
POST https://cp.compshare.cn/audio/v1/assets在 PUT 上传成功后调用,平台校验上传记录、实际文件大小和 MIME 类型,再生成用于语音任务的 asset_id。
请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| object_key | String | 是 | 获取上传地址接口返回的对象标识 | <OBJECT_KEY> |
| file_name | String | 是 | 与申请上传时相同的文件名 | reference.wav |
| content_type | String | 是 | 与申请上传时相同的 MIME 类型 | audio/wav |
| file_size | Integer | 是 | 与申请上传时相同的实际文件大小 | 240000 |
| duration_ms | Integer | 是 | 参考音频实际时长,范围 500~15000 毫秒 | 5000 |
curl -X POST 'https://cp.compshare.cn/audio/v1/assets' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"object_key": "<OBJECT_KEY>",
"file_name": "reference.wav",
"content_type": "audio/wav",
"file_size": 240000,
"duration_ms": 5000
}'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| asset | Object | 素材信息 |
| asset.asset_id | String | 素材 ID |
| asset.purpose | String | 固定为 speech_reference |
| asset.file_name | String | 文件名 |
| asset.content_type | String | MIME 类型 |
| asset.file_size | Integer | 文件大小,单位为字节 |
| asset.duration_ms | Integer | 参考音频时长,单位为毫秒 |
| asset.public_url | String | 登记后素材的访问地址 |
| asset.created_at | Integer | 登记时间 |
{
"asset": {
"asset_id": "<ASSET_ID>",
"purpose": "speech_reference",
"file_name": "reference.wav",
"content_type": "audio/wav",
"file_size": 240000,
"duration_ms": 5000,
"public_url": "https://example.com/reference/reference.wav",
"created_at": 1789459200
}
}同一上传记录只能成功登记一次。登记后尚未使用的素材默认保留 7 天;需要长期复用音色时,可调用创建自定义音色接口保存。
直接使用素材生成并保存音色
curl -X POST 'https://cp.compshare.cn/audio/v1/speech/jobs' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: speech-reference-001' \
-d '{
"text": "这是使用参考音频生成的语音。",
"voice": {"source": "asset", "asset_id": "<ASSET_ID>"},
"save_voice": true,
"voice_name": "我的旁白音色"
}'创建任务响应只返回 task_id。同时保存的音色可通过 GET /audio/v1/voices?kind=custom 查询。若需要立即获得 voice_id,先调用下方的创建自定义音色接口,再以 voice.source=custom 创建任务。
创建自定义音色
POST https://cp.compshare.cn/audio/v1/voices将已登记的参考音频保存为当前组织可复用的自定义音色。请求头必须包含 Idempotency-Key。
请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| asset_id | String | 是 | 已登记且可用的参考音频素材 ID | <ASSET_ID> |
| name | String | 是 | 音色名称,去除首尾空白后为 1~64 个字符 | 我的旁白音色 |
curl -X POST 'https://cp.compshare.cn/audio/v1/voices' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: custom-voice-001' \
-d '{"asset_id":"<ASSET_ID>","name":"我的旁白音色"}'响应中的 voice 与音色列表中的元素使用相同结构:
{
"voice": {
"voice_id": "<CUSTOM_VOICE_ID>",
"kind": "custom",
"name": "我的旁白音色",
"style_tags": [],
"audio_url": "https://example.com/custom-voice/reference.wav",
"created_at": 1789459200
}
}平台保存独立的音色副本,自定义音色不按临时参考素材的 7 天未使用规则清理。后续创建任务时传入 {"source":"custom","voice_id":"<CUSTOM_VOICE_ID>"} 即可。
删除自定义音色
DELETE https://cp.compshare.cn/audio/v1/voices/{voice_id}路径参数 voice_id 为要删除的自定义音色 ID,无请求体。仅可删除当前组织的自定义音色;平台预设音色由平台管理。音色被排队中或生成中的任务引用时,删除会返回业务错误。
curl -X DELETE 'https://cp.compshare.cn/audio/v1/voices/<CUSTOM_VOICE_ID>' \
-H 'Authorization: Bearer <YOUR_API_KEY>'成功响应中的 voice_id 为音色 ID,deleted=true 表示删除成功:
{"voice_id": "<CUSTOM_VOICE_ID>", "deleted": true}查询语音计价与积分余额
GET https://cp.compshare.cn/audio/v1/pricing无查询参数和请求体。返回当前语音计价规则,以及 API Key 所属组织的积分余额。
curl 'https://cp.compshare.cn/audio/v1/pricing' \
-H 'Authorization: Bearer <YOUR_API_KEY>'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| enabled | Boolean | 是否开启语音积分计费;为 false 时无法创建语音任务 |
| pricing_version | Integer | 当前价格版本 |
| unit_characters | Integer | 单价对应的计费字符数量,固定为 10 |
| costs.text_to_speech | Integer | 每 10 个正文计费字符的积分单价 |
| balance.total_points | Integer | 有效套餐中的剩余总积分,包含预占积分 |
| balance.reserved_points | Integer | 已被进行中任务预占的积分 |
| balance.available_points | Integer | 可用于创建新任务的积分 |
{
"enabled": true,
"pricing_version": 3,
"unit_characters": 10,
"costs": {"text_to_speech": 2},
"balance": {"total_points": 100, "reserved_points": 20, "available_points": 80}
}计费规则
积分费用按下式计算,整次请求只向上取整一次:
积分费用 = ceil(正文计费字符数 × costs.text_to_speech / 10)- Unicode 字母(含汉字)和十进制数字计费。
- 空白、标点、其他符号不计费,但仍占用 2000 字符输入长度。
- 情绪描述、读音规则不计入正文计费字符数。
- 创建任务时预占积分,成功后扣除,失败或取消后释放。
- 音频与 MiniMax H3 共用组织积分余额,创建前以
available_points判断是否足够。
例如,上述响应的单价为每 10 字符 2 积分,正文有 11 个计费字符时,费用为 ceil(11 × 2 / 10) = 3 积分。该价格仅为示例,实际单价以接口返回值为准。
查询积分套餐包
GET https://cp.compshare.cn/minimax/v2/query/point_packages复用 MiniMax H3 的积分套餐查询接口,查询当前组织已经领取或购买的积分套餐;无查询参数和请求体。
curl 'https://cp.compshare.cn/minimax/v2/query/point_packages' \
-H 'Authorization: Bearer <YOUR_API_KEY>'响应参数
| 名称 | 类型 | 描述 |
|---|---|---|
| items | Array of Object | 积分套餐列表 |
| items[].id | String | 套餐包 ID |
| items[].code | String | 套餐规格编码 |
| items[].name | String | 套餐名称 |
| items[].status | String | pending 待生效、active 可用、exhausted 已用完、expired 已过期 |
| items[].total_points | Integer | 套餐初始积分 |
| items[].remaining_points | Integer | 尚未扣除的积分,包含预占积分 |
| items[].reserved_points | Integer | 预占积分 |
| items[].available_points | Integer | 可用积分;不可用状态下为 0 |
| items[].purchased_at | Integer | 购买或激活时间,尚未激活时可能不返回 |
| items[].expires_at | Integer | 过期时间,尚未激活时可能不返回 |
| items[].created_at | Integer | 记录创建时间 |
| items[].order_no | String | 订单号,无订单时不返回 |
| items[].total_price | Integer | 实付金额,单位为分;无付费金额时不返回 |
| total | Integer | 套餐总数 |
{
"items": [{
"id": "<PACKAGE_ID>",
"code": "<PACKAGE_CODE>",
"name": "示例积分包",
"status": "active",
"total_points": 100,
"remaining_points": 80,
"reserved_points": 10,
"available_points": 70,
"created_at": 1789459200
}],
"total": 1
}更多说明参见 MiniMax H3 视频任务 API — 查询积分套餐包。
任务状态与错误处理
任务状态
| 状态 | 含义 | 调用方处理 |
|---|---|---|
queued | 排队中 | 继续轮询,或调用取消接口 |
generating | 生成或上传结果中 | 继续轮询 |
succeeded | 生成成功 | 从 output_url 下载音频 |
failed | 生成失败 | 查看 error_message;需重新生成时使用新的幂等键 |
cancelled | 已取消 | 停止轮询 |
请求错误
鉴权失败返回 HTTP 401;OpenAPI 参数格式错误返回 HTTP 400;下游服务连接或响应解析失败返回 HTTP 502。参数格式错误示例:
{
"type": "error",
"error": {
"type": "bad_request_error",
"message": "Idempotency-Key is required and must contain 1 to 128 characters",
"http_code": "400"
},
"request_id": "<REQUEST_ID>"
}业务后端的错误会保留原 HTTP 状态和响应体,常见字段为 RetCode、Message、request_uuid。即使 HTTP 状态为 200,只要 RetCode 非零,也表示请求失败。下游 HTTP 错误也可能返回非 JSON 内容。
| 情况 | 处理建议 |
|---|---|
| 文本、语言、语速、情绪或读音参数不符合要求 | 根据 Message 修正请求 |
| 积分不足 | 查询可用积分并补充积分 |
| 组织存储空间已满 | 清理不需要的任务和文件后重试 |
| 任务、素材或音色不存在 | 检查 ID、所属组织及资源是否已删除或清理 |
| 上传信息不匹配 | 确认文件名、MIME 类型、文件大小与申请上传时一致 |
| 取消时任务已经开始执行 | 查询最新任务状态 |
| 删除音色时仍有活动任务引用 | 等待相关任务结束后再删除 |
| 创建请求超时或连接中断 | 保留并复用原 Idempotency-Key 重试 |
完整调用示例
以下 Python 示例使用标准库完成「查价格和余额 → 选择预设音色 → 创建任务 → 轮询 → 下载」。先设置环境变量 COMPSHARE_API_KEY;可选设置 COMPSHARE_VOICE_ID 指定一个预设音色,否则选择列表中的第一个。
import json
import os
import time
import uuid
from pathlib import Path
from urllib.request import Request, urlopen
BASE_URL = "https://cp.compshare.cn"
API_KEY = os.environ["COMPSHARE_API_KEY"]
def api(method, path, body=None, idempotency_key=None):
headers = {"Authorization": f"Bearer {API_KEY}", "Accept": "application/json"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body, ensure_ascii=False).encode("utf-8")
if idempotency_key:
headers["Idempotency-Key"] = idempotency_key
request = Request(BASE_URL + path, data=data, headers=headers, method=method)
# 非 2xx 响应由 urlopen 抛出 HTTPError;2xx 响应仍需检查业务错误。
with urlopen(request, timeout=60) as response:
result = json.load(response)
if result.get("RetCode", 0) != 0 or "error" in result:
raise RuntimeError(result)
return result
text = "你好,欢迎使用优云智算文生语音服务。"
pricing = api("GET", "/audio/v1/pricing")
if not pricing["enabled"]:
raise RuntimeError("语音生成当前不可用")
characters = sum(character.isalpha() or character.isdecimal() for character in text)
unit = pricing["unit_characters"]
cost = (characters * pricing["costs"]["text_to_speech"] + unit - 1) // unit
if pricing["balance"]["available_points"] < cost:
raise RuntimeError("可用积分不足")
voice_id = os.environ.get("COMPSHARE_VOICE_ID")
if not voice_id:
voices = api("GET", "/audio/v1/voices?kind=preset")["items"]
if not voices:
raise RuntimeError("当前没有可用的预设音色")
voice_id = voices[0]["voice_id"]
# 保存此键;若创建请求超时,应使用同一键和相同请求重试。
idempotency_key = str(uuid.uuid4())
print("Idempotency-Key:", idempotency_key)
result = api("POST", "/audio/v1/speech/jobs", {
"text": text,
"language": "ZH",
"voice": {"source": "preset", "voice_id": voice_id},
"speed": 1.0,
"auto_emotion": True,
}, idempotency_key=idempotency_key)
task_id = result["task_id"]
print("task_id:", task_id)
deadline = time.monotonic() + 1200
while time.monotonic() < deadline:
task = api("GET", f"/audio/v1/speech/jobs/{task_id}")["task"]
if task["status"] == "succeeded":
# 下载公共结果地址时无需携带模型 API Key。
with urlopen(task["output_url"], timeout=60) as audio:
Path("speech.wav").write_bytes(audio.read())
print("已保存 speech.wav,消耗积分:", task["point_cost"])
break
if task["status"] in {"failed", "cancelled"}:
raise RuntimeError(task["error_message"] or task["status"])
time.sleep(3)
else:
raise TimeoutError(f"轮询超时,可继续查询任务 {task_id}")