TokenToSea开发者文档
控制台

Step Audio 2

阶跃端到端语音模型,支持音色复刻、工具调用与联网搜索。

本页内容
阶跃星辰

阶跃星辰 · 阶跃星辰

国内 语言模型 官方直供

在控制台测试
模型 ID(请求中的 model 字段)
step-audio-2

快速开始#

  1. 创建 API Key

    在控制台 我的 Key 创建通用 API Key(明文只显示一次),并确认账户余额充足。

  2. 设置环境变量

    export TOKENTOSEA_API_KEY="sk-relay_…",示例从环境变量读取密钥。

  3. 发送请求

    以下为 Chat Completions · SSE 流式 示例;其他接口见全部调用示例。

export TOKENTOSEA_API_KEY="你的主站通用 API Key"
REQUEST_KEY="$(uuidgen)"
curl -N https://api.tokentosea.com/v1/chat/completions \
  -H "Authorization: Bearer $TOKENTOSEA_API_KEY" \
  -H "Idempotency-Key: $REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "step-audio-2",
  "messages": [
    {
      "role": "user",
      "content": "请简短介绍一下你能帮助我完成什么。"
    }
  ],
  "max_tokens": 1024,
  "modalities": [
    "text"
  ],
  "stream": true
}'

# 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
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"

能力与接口#

文本生成 多模态理解

下表只列出已在该型号上完成验收的接口、响应方式与输入类型;其他组合会返回 422(如 endpoint_not_verified、response_mode_not_verified、input_modality_not_verified)。

接口JSONSSE 流式WebSocket已验证输入
Chat Completions/v1/chat/completions不支持支持不支持文本
实时会话/v1/realtime不支持不支持支持音频
可用系统音色(4 个)

wenrounansheng qingchunshaonv elegantgentle-female livelybreezy-female

价格#

官方价格以人民币(CNY)公布,核对日期 2026-10-19。TokenToSea 按官方价格计费、不加价;调用从账户余额(美元)扣除,人民币价格按请求受理时冻结的汇率换算为美元,金额保留 6 位小数并向上取整。下表适用于:标准服务。

计费项单价计量单位
输入 token¥10每百万 token
输出 token¥70每百万 token
缓存命中 token¥2每百万 token

每次请求先按可能的最高用量预留金额,完成后按供应商返回的实际用量结算并退回差额。计费方式详见计费与结算。

官方价格来源

限制#

项目取值说明
输出长度参数上限131,072 token平台校验 max_tokens 等参数;实际可输出长度以模型为准
默认输出长度4,096 token请求未指定输出长度参数时自动填入

响应方式:SSE 流式、WebSocket。

  • 同一账户最多同时进行 8 个已预留或执行中的调用(平台规则)。
  • JSON 请求体不超过 48 MB;multipart 上传仅 1 个 file,不超过 25 MB。
  • 实时会话:单次最长 60 秒、最多 8 轮,排队中的输入音频不超过 4 MiB;断线后请查询结果,不要自动重连重新生成。

完整限制与错误码见用量限制和错误处理。

全部调用示例#

每个示例都包含 cURL、Python 与 Node.js 三种写法,发送完全相同的请求体,并用同一个 Idempotency-Key 查询结果。

Chat Completions · SSE 流式#

POST /v1/chat/completions 接口参考

export TOKENTOSEA_API_KEY="你的主站通用 API Key"
REQUEST_KEY="$(uuidgen)"
curl -N https://api.tokentosea.com/v1/chat/completions \
  -H "Authorization: Bearer $TOKENTOSEA_API_KEY" \
  -H "Idempotency-Key: $REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "step-audio-2",
  "messages": [
    {
      "role": "user",
      "content": "请简短介绍一下你能帮助我完成什么。"
    }
  ],
  "max_tokens": 1024,
  "modalities": [
    "text"
  ],
  "stream": true
}'

# 查询原请求;异步任务未结束时稍后继续查询,不要重复提交。
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"

实时会话 · WebSocket#

WS /v1/realtime?model=step-audio-2 接口参考

  • 需要准备单声道 PCM16 音频文件 audio.pcm(可用示例中的 ffmpeg 命令转换)
  • 单次会话最多 60 秒。断线后先查询原会话状态,不会自动重连并重新生成。
// npm install ws
// export TOKENTOSEA_API_KEY="你的主站通用 API Key"
// ffmpeg -i your-audio.wav -ac 1 -ar 24000 -f s16le audio.pcm
// node realtime.mjs
import WebSocket from 'ws';
import { readFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';
const key = process.env.TOKENTOSEA_API_KEY;
const requestKey = randomUUID();
const taskId = randomUUID().replaceAll('-', '');
const kind = "session";
const init = {
  "type": "session.update",
  "session": {
    "modalities": [
      "text"
    ],
    "instructions": "Reply briefly to the spoken greeting.",
    "voice": "wenrounansheng"
  }
};
const ws = new WebSocket("wss://api.tokentosea.com/v1/realtime?model=step-audio-2", {
  headers: { Authorization: 'Bearer ' + key, 'Idempotency-Key': requestKey }
});
let finishing = false;
const send = value => {
  if (ws.readyState !== WebSocket.OPEN || value.type === 'session.finish' && finishing) return;
  if (value.type === 'session.finish') finishing = true;
  ws.send(JSON.stringify({...value,...(value.type ? {event_id:'example-'+randomUUID()} : {})}));
};
let started = false;
async function produce() {
  if (started) return; started = true;
  if (kind === 'tts-session') {
    send({type:'input_text_buffer.append', text:""});
    send({type:'input_text_buffer.commit'});
    send({type:'session.finish'}); return;
  }
  const audio = readFileSync('audio.pcm'), step = 4800;
  for (let i = 0; i < audio.length && ws.readyState === WebSocket.OPEN; i += step) {
    const part = audio.subarray(i, i + step);
    if (kind === 'inference') ws.send(part);
    else send({type:'input_audio_buffer.append', audio:part.toString('base64')});
    await new Promise(resolve => setTimeout(resolve,100));
  }
  if (kind === 'inference') send({header:{action:'finish-task',task_id:taskId,streaming:'duplex'},payload:{input:{}}});
  else send({type:kind === 'translate-auto' ? 'session.finish' : 'input_audio_buffer.commit'});
}
ws.on('open',()=>send(init));
ws.on('message',raw=>{
  const event = JSON.parse(raw.toString()), type = event.type ?? event.header?.event;
  console.log(event);
  if (type === 'session.updated' || type === 'task-started') void produce();
  if (type === 'input_audio_buffer.committed' && kind === 'session') send({type:'response.create'});
  if (type === 'response.done') {
    if (['tts-session','translate-commit'].includes(kind)) send({type:'session.finish'});
    else if (kind !== 'translate-auto') ws.close();
  }
  if (['session.finished','task-finished','error','task-failed'].includes(type) || type === 'conversation.item.input_audio_transcription.completed' && kind === 'asr-session') ws.close();
});
const timer = setTimeout(()=>ws.close(),60000);
ws.on('close',async()=>{
  clearTimeout(timer);
  const result = await fetch('https://api.tokentosea.com/v1/results/'+requestKey,{headers:{Authorization:'Bearer '+key}}).then(r=>r.json());
  console.log('Result / billing status:',result);
  // 如仍在结算或处理中,继续 GET 同一地址;不要自动重新连接生成。
});
ws.on('error',error=>console.error(error.message));

在控制台测试#

登录后可在 模型测试 页面直接调用 step-audio-2,查看返回结果、token 用量与实际扣费。网页调用同样从账户余额扣费。

    输入关键词搜索全部文档与模型。