CosyVoice-v3-Flash
CosyVoice 语音合成模型,支持指令控制。
cosyvoice-v3-flash快速开始#
- 创建 API Key
在控制台 我的 Key 创建通用 API Key(明文只显示一次),并确认账户余额充足。
- 设置环境变量
export TOKENTOSEA_API_KEY="sk-relay_…",示例从环境变量读取密钥。 - 发送请求
以下为 语音合成 · JSON 示例;其他接口见全部调用示例。
export TOKENTOSEA_API_KEY="你的主站通用 API Key"
REQUEST_KEY="$(uuidgen)"
curl https://api.tokentosea.com/v1/audio/speech \
-H "Authorization: Bearer $TOKENTOSEA_API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "cosyvoice-v3-flash",
"input": "你好,欢迎使用语音服务。",
"voice": "longanhuan",
"response_format": "wav"
}' \
-o speech.wav
# 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
curl "https://api.tokentosea.com/v1/results/$REQUEST_KEY" \
-H "Authorization: Bearer $TOKENTOSEA_API_KEY"
# 返回 asset_id 后,获取短期有效的 COS 下载链接。
# curl "https://api.tokentosea.com/v1/assets/ASSET_ID/download-url" \
# -H "Authorization: Bearer $TOKENTOSEA_API_KEY"# pip install requests
# export TOKENTOSEA_API_KEY="你的主站通用 API Key"
import json
import os
import time
import uuid
import requests
API_BASE = "https://api.tokentosea.com"
API_KEY = os.environ["TOKENTOSEA_API_KEY"] # 控制台「我的 Key」创建的通用 API Key
REQUEST_KEY = str(uuid.uuid4()) # Idempotency-Key:重试或查询结果时复用同一个值
AUTH = {"Authorization": f"Bearer {API_KEY}"}
PENDING = {"planned", "sending", "streaming", "upstream_pending", "billing", "archiving"}
payload = {
"model": "cosyvoice-v3-flash",
"input": "你好,欢迎使用语音服务。",
"voice": "longanhuan",
"response_format": "wav",
}
def show(data):
print(json.dumps(data, ensure_ascii=False, indent=2))
def wait_for_result():
"""查询原请求;异步任务未结束时稍后继续查询,不要重复提交。"""
while True:
result = requests.get(f"{API_BASE}/v1/results/{REQUEST_KEY}", headers=AUTH, timeout=30).json()
if result.get("status") not in PENDING:
return result
time.sleep(5)
try:
response = requests.post(
f"{API_BASE}/v1/audio/speech",
headers={**AUTH, "Idempotency-Key": REQUEST_KEY},
json=payload,
timeout=1300,
)
print(response.status_code, response.headers.get("X-Request-Id"))
if response.ok and "json" not in response.headers.get("Content-Type", ""):
with open("speech.wav", "wb") as output:
output.write(response.content)
print("已保存 speech.wav")
else:
show(response.json()) # 错误信息、异步受理或多段音频结果
except requests.RequestException as error:
# 连接中断时请求可能已被受理:用同一个 REQUEST_KEY 查询结果,不要重新提交。
print("\n请求中断:", error)
result = wait_for_result()
show(result)
# output.data[].url 是短期有效(≤300 秒)的 COS 下载链接;过期后用 asset_id 重新获取:
# requests.get(f"{API_BASE}/v1/assets/{asset_id}/download-url", headers=AUTH, timeout=30).json()// Node.js 18+,无需额外依赖。保存为 example.mjs 后运行:node example.mjs
// export TOKENTOSEA_API_KEY="你的主站通用 API Key"
import { randomUUID } from 'node:crypto';
import { writeFileSync } from 'node:fs';
const API_BASE = 'https://api.tokentosea.com';
const API_KEY = process.env.TOKENTOSEA_API_KEY; // 控制台「我的 Key」创建的通用 API Key
const REQUEST_KEY = randomUUID(); // Idempotency-Key:重试或查询结果时复用同一个值
const auth = { Authorization: `Bearer ${API_KEY}` };
const PENDING = new Set(['planned', 'sending', 'streaming', 'upstream_pending', 'billing', 'archiving']);
const payload = {
model: 'cosyvoice-v3-flash',
input: '你好,欢迎使用语音服务。',
voice: 'longanhuan',
response_format: 'wav',
};
const show = data => console.log(JSON.stringify(data, null, 2));
// 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
async function waitForResult() {
for (;;) {
const result = await fetch(`${API_BASE}/v1/results/${REQUEST_KEY}`, { headers: auth }).then(r => r.json());
if (!PENDING.has(result.status)) return result;
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
try {
const response = await fetch(`${API_BASE}/v1/audio/speech`, {
method: 'POST',
headers: { ...auth, 'Idempotency-Key': REQUEST_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
console.log(response.status, response.headers.get('x-request-id'));
if (response.ok && !(response.headers.get('content-type') ?? '').includes('json')) {
writeFileSync('speech.wav', Buffer.from(await response.arrayBuffer()));
console.log('已保存 speech.wav');
} else {
show(await response.json()); // 错误信息、异步受理或多段音频结果
}
} catch (error) {
// 连接中断时请求可能已被受理:用同一个 REQUEST_KEY 查询结果,不要重新提交。
console.error('\n请求中断:', error.message);
}
const result = await waitForResult();
show(result);
// output.data[].url 是短期有效(≤300 秒)的 COS 下载链接;过期后用 asset_id 重新获取:
// await fetch(`${API_BASE}/v1/assets/${assetId}/download-url`, { headers: auth }).then(r => r.json());能力与接口#
语音合成
下表只列出已在该型号上完成验收的接口、响应方式与输入类型;其他组合会返回 422(如 endpoint_not_verified、response_mode_not_verified、input_modality_not_verified)。
| 接口 | JSON | SSE 流式 | WebSocket | 已验证输入 |
|---|---|---|---|---|
语音合成/v1/audio/speech | 支持 | 不支持 | 不支持 | — |
可用系统音色(88 个)
longanhuan longanhuan_v3 longanlang_v3 longanli_v3 longanling_v3 longanmin_v3 longanqin_v3 longanran_v3 longanrou_v3 longantai_v3 longanwen_v3 longanxuan_v3 longanya_v3 longanyang longanyue_v3 longanyun_v3 longanzhi_v3 longcheng_v3 longdaiyu_v3 longfei_v3 longfeifei_v3 longhan_v3 longhao_v3 longhouge_v3 longhua_v3 longhuhu_v3 longjiaxin_v3 longjiayi_v3 longjielidou_v3 longjiqi_v3 longlaobo_v3 longlaotie_v3 longlaoyi_v3 longling_v3 longmiao_v3 longnan_v3 longniuniu_v3 longpaopao_v3 longqiang_v3 longsanshu_v3 longshange_v3 longshanshan_v3 longshu_v3 longshuo_v3 longtian_v3 longwan_v3 longwanjun_v3 longxian_v3 longxiaochun_v3 longxiaoxia_v3 longxing_v3 longxiu_v3 longyan_v3 longyichen_v3 longyingjing_v3 longyingling_v3 longyingmu_v3 longyingtao_v3 longyingxiao_v3 longyingxun_v3 longyuan_v3 longyue_v3 longyumi_v3 longze_v3 longzhe_v3 loongabby_v3 loongandy_v3 loongannie_v3 loongava_v3 loongbella_v3 loongbeth_v3 loongbetty_v3 loongcally_v3 loongcindy_v3 loongdavid_v3 loongdonna_v3 loongemily_v3 loongeric_v3 loongindah_v3 loongjihun_v3 loongkyong_v3 loongluca_v3 loongluna_v3 loongriko_v3 loongtomoka_v3 loongtomoya_v3 loongyuuma_v3 loongyuuna_v3
价格#
官方价格以人民币(CNY)公布,核对日期 2026-10-19。TokenToSea 按官方价格计费、不加价;调用从账户余额(美元)扣除,人民币价格按请求受理时冻结的汇率换算为美元,金额保留 6 位小数并向上取整。
| 计费项 | 单价 | 计量单位 |
|---|---|---|
| 字符 | ¥1 | 每万字符 |
每次请求先按可能的最高用量预留金额,完成后按供应商返回的实际用量结算并退回差额。计费方式详见计费与结算。
官方价格来源
限制#
本页暂未收录此型号的上下文窗口与最大输出长度,请以厂商文档为准;以下为平台规则。
响应方式:JSON。
- 同一账户最多同时进行 8 个已预留或执行中的调用(平台规则)。
- JSON 请求体不超过 48 MB;multipart 上传仅 1 个
file,不超过 25 MB。 - 结果保留 31 天;生成的文件保留 30 天,结果中的下载链接有效期不超过 300 秒,过期后重新查询或通过
/v1/assets/{asset_id}/download-url获取。
全部调用示例#
每个示例都包含 cURL、Python 与 Node.js 三种写法,发送完全相同的请求体,并用同一个 Idempotency-Key 查询结果。
语音合成 · JSON#
POST /v1/audio/speech 接口参考
export TOKENTOSEA_API_KEY="你的主站通用 API Key"
REQUEST_KEY="$(uuidgen)"
curl https://api.tokentosea.com/v1/audio/speech \
-H "Authorization: Bearer $TOKENTOSEA_API_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "cosyvoice-v3-flash",
"input": "你好,欢迎使用语音服务。",
"voice": "longanhuan",
"response_format": "wav"
}' \
-o speech.wav
# 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
curl "https://api.tokentosea.com/v1/results/$REQUEST_KEY" \
-H "Authorization: Bearer $TOKENTOSEA_API_KEY"
# 返回 asset_id 后,获取短期有效的 COS 下载链接。
# curl "https://api.tokentosea.com/v1/assets/ASSET_ID/download-url" \
# -H "Authorization: Bearer $TOKENTOSEA_API_KEY"# pip install requests
# export TOKENTOSEA_API_KEY="你的主站通用 API Key"
import json
import os
import time
import uuid
import requests
API_BASE = "https://api.tokentosea.com"
API_KEY = os.environ["TOKENTOSEA_API_KEY"] # 控制台「我的 Key」创建的通用 API Key
REQUEST_KEY = str(uuid.uuid4()) # Idempotency-Key:重试或查询结果时复用同一个值
AUTH = {"Authorization": f"Bearer {API_KEY}"}
PENDING = {"planned", "sending", "streaming", "upstream_pending", "billing", "archiving"}
payload = {
"model": "cosyvoice-v3-flash",
"input": "你好,欢迎使用语音服务。",
"voice": "longanhuan",
"response_format": "wav",
}
def show(data):
print(json.dumps(data, ensure_ascii=False, indent=2))
def wait_for_result():
"""查询原请求;异步任务未结束时稍后继续查询,不要重复提交。"""
while True:
result = requests.get(f"{API_BASE}/v1/results/{REQUEST_KEY}", headers=AUTH, timeout=30).json()
if result.get("status") not in PENDING:
return result
time.sleep(5)
try:
response = requests.post(
f"{API_BASE}/v1/audio/speech",
headers={**AUTH, "Idempotency-Key": REQUEST_KEY},
json=payload,
timeout=1300,
)
print(response.status_code, response.headers.get("X-Request-Id"))
if response.ok and "json" not in response.headers.get("Content-Type", ""):
with open("speech.wav", "wb") as output:
output.write(response.content)
print("已保存 speech.wav")
else:
show(response.json()) # 错误信息、异步受理或多段音频结果
except requests.RequestException as error:
# 连接中断时请求可能已被受理:用同一个 REQUEST_KEY 查询结果,不要重新提交。
print("\n请求中断:", error)
result = wait_for_result()
show(result)
# output.data[].url 是短期有效(≤300 秒)的 COS 下载链接;过期后用 asset_id 重新获取:
# requests.get(f"{API_BASE}/v1/assets/{asset_id}/download-url", headers=AUTH, timeout=30).json()// Node.js 18+,无需额外依赖。保存为 example.mjs 后运行:node example.mjs
// export TOKENTOSEA_API_KEY="你的主站通用 API Key"
import { randomUUID } from 'node:crypto';
import { writeFileSync } from 'node:fs';
const API_BASE = 'https://api.tokentosea.com';
const API_KEY = process.env.TOKENTOSEA_API_KEY; // 控制台「我的 Key」创建的通用 API Key
const REQUEST_KEY = randomUUID(); // Idempotency-Key:重试或查询结果时复用同一个值
const auth = { Authorization: `Bearer ${API_KEY}` };
const PENDING = new Set(['planned', 'sending', 'streaming', 'upstream_pending', 'billing', 'archiving']);
const payload = {
model: 'cosyvoice-v3-flash',
input: '你好,欢迎使用语音服务。',
voice: 'longanhuan',
response_format: 'wav',
};
const show = data => console.log(JSON.stringify(data, null, 2));
// 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
async function waitForResult() {
for (;;) {
const result = await fetch(`${API_BASE}/v1/results/${REQUEST_KEY}`, { headers: auth }).then(r => r.json());
if (!PENDING.has(result.status)) return result;
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
try {
const response = await fetch(`${API_BASE}/v1/audio/speech`, {
method: 'POST',
headers: { ...auth, 'Idempotency-Key': REQUEST_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
console.log(response.status, response.headers.get('x-request-id'));
if (response.ok && !(response.headers.get('content-type') ?? '').includes('json')) {
writeFileSync('speech.wav', Buffer.from(await response.arrayBuffer()));
console.log('已保存 speech.wav');
} else {
show(await response.json()); // 错误信息、异步受理或多段音频结果
}
} catch (error) {
// 连接中断时请求可能已被受理:用同一个 REQUEST_KEY 查询结果,不要重新提交。
console.error('\n请求中断:', error.message);
}
const result = await waitForResult();
show(result);
// output.data[].url 是短期有效(≤300 秒)的 COS 下载链接;过期后用 asset_id 重新获取:
// await fetch(`${API_BASE}/v1/assets/${assetId}/download-url`, { headers: auth }).then(r => r.json());相关文档#
在控制台测试#
登录后可在 模型测试 页面直接调用 cosyvoice-v3-flash,查看返回结果、token 用量与实际扣费。网页调用同样从账户余额扣费。