开发者 API

为你的产品提供实时翻译

一个 API 即可实现 32 种语言的实时语音翻译、文本翻译、语音和视频。预付额度,按量付费,无月费。

curl https://api.sponkly.com/v1/translate \
  -H "Authorization: Bearer $SPONKLY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Merhaba dünya", "target": "en"}'

{
  "translation": "Hello world",
  "target": "en",
  "characters": 13,
  "cost_usd": "0.000130"
}

价格

每次调用都从你的预付余额中扣费。因我们一方原因失败的调用不收费。

实时语音翻译
以流的方式发送语音,几秒内即可收到翻译后的字幕和翻译后的语音。
每分钟 US$0.10
实时字幕
同样的实时流,只返回翻译后的字幕。
每分钟 US$0.05
文本翻译
自然、结合上下文的翻译,支持单条文本或最多 50 条。
每 100 万字符 US$10.00
文本转语音
用自然的声音朗读文本,输出 MP3、WAV 或 Opus。
每 100 万字符 US$30.00
语音转文本
将音频或视频转为带时间戳的文本,并可选翻译。
每分钟 US$0.01
视频字幕
返回烧录了翻译字幕的视频,并附 SRT 文件。
每分钟 US$0.20
视频配音
返回用另一种语言配音的视频,可按需添加字幕。
每分钟 US$0.50

身份验证

每个请求都在 Authorization 请求头中携带你的 API 密钥。密钥在控制台中创建和撤销;所有密钥共用同一余额。

  1. 在 sponkly.com 免费注册,然后打开 控制台 → 开发者 API。
  2. 充值($10 起)并创建 API 密钥。
  3. 向 https://api.sponkly.com/v1 发送请求,并携带 Authorization: Bearer <your key>。
Base URL:      https://api.sponkly.com/v1
Authorization: Bearer spk_…

签名请求

每个 API 密钥都附带一个签名密钥。用它为请求签名后,仅凭被盗的 API 密钥无法调用,请求在传输途中无法被篡改,同一请求也无法被重复发送。在控制台中为该密钥开启“要求签名请求”,所有未签名的请求都将被拒绝。

  1. 获取以 Unix 秒表示的当前时间,以及你所发送请求体原文的 SHA-256(上传文件时:文件的字节;GET 请求和实时 socket:空请求体)。
  2. 按以下顺序用点号连接:时间戳、请求方法、含查询字符串的路径、请求体哈希。
  3. 用你的签名密钥计算该文本的 HMAC-SHA256,并以小写十六进制表示。
  4. 将其作为 X-Sponkly-Signature: v1=<signature> 发送,并将时间作为 X-Sponkly-Timestamp 发送。签名有效期为 5 分钟,且只能用于一个请求。
  5. 需要在一秒内两次发送同一请求(例如快速重试或轮询)?请改用毫秒表示时间;毫秒同样有效,并能让每个签名保持唯一。
X-Sponkly-Timestamp: 1792693200
X-Sponkly-Signature: v1=hex( HMAC-SHA256( signing_secret,
    "1792693200" + "." + "POST" + "." + "/v1/translate" + "." + hex(SHA-256(body)) ) )
// Node.js 18+
import crypto from "node:crypto";

async function sponkly(method, path, body) {
  const raw = body === undefined ? "" : JSON.stringify(body);
  const ts = Math.floor(Date.now() / 1000).toString();
  const hash = crypto.createHash("sha256").update(raw).digest("hex");
  const sig = crypto.createHmac("sha256", process.env.SPONKLY_SIGNING_SECRET)
    .update(`${ts}.${method}.${path}.${hash}`).digest("hex");
  const res = await fetch("https://api.sponkly.com" + path, {
    method,
    headers: {
      Authorization: `Bearer ${process.env.SPONKLY_KEY}`,
      "Content-Type": "application/json",
      "X-Sponkly-Timestamp": ts,
      "X-Sponkly-Signature": `v1=${sig}`,
    },
    body: raw || undefined,
  });
  return res.json();
}

console.log(await sponkly("POST", "/v1/translate", { text: "Merhaba dünya", target: "en" }));

保护好你的密钥

  • 请从你的服务器调用 API。切勿将 API 密钥或签名密钥放在网页、移动应用或公开代码仓库中。
  • 生产环境中的每个密钥都应要求签名请求。
  • 将你的服务器地址加入密钥的允许地址,这样密钥在其他任何地方都无法使用。
  • 为每个密钥设置每日消费上限,这样即使出错或泄露,损失也有限。
  • 每个应用或环境使用一个密钥,一旦怀疑密钥泄露,立即将其撤销。你也可以随时生成新的签名密钥。
  • 同一地址多次使用错误的密钥或签名,该地址将被锁定 15 分钟。
POST/v1/translate

文本翻译

将单条文本或最多 50 条文本的列表翻译成 32 种语言中的任意一种。不填写源语言即可自动检测。

# One text, or up to 50: "text": ["Good morning", "Thank you"]
curl https://api.sponkly.com/v1/translate \
  -H "Authorization: Bearer $SPONKLY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Bugün hava çok güzel.", "target": "en", "source": "tr"}'
// JavaScript (Node 18+, Deno, Bun)
const res = await fetch("https://api.sponkly.com/v1/translate", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SPONKLY_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ text: ["Good morning", "Thank you"], target: "de" }),
});
const { translations } = await res.json(); // [{ text: "Guten Morgen" }, { text: "Danke" }]
# Python
import os, requests
r = requests.post("https://api.sponkly.com/v1/translate",
    headers={"Authorization": f"Bearer {os.environ['SPONKLY_KEY']}"},
    json={"text": "How are you?", "target": "ja", "context": "A message to a hotel guest"})
print(r.json()["translation"])

字段:text(字符串或数组)、target(语言代码)、source(可选)、context(可选,最多 1,000 个字符,说明文本的内容)。按发送的字符数计费。

WSwss://api.sponkly.com/v1/live?source=en&target=tr

实时语音翻译

用于实时语音的 WebSocket:边说边发送音频,即可收到翻译后的字幕,如有需要还可收到翻译后的语音。13 种主要语言由实时语音模型翻译,延迟约 1–2 秒;其他语言由我们自己的流式管道翻译。

// Node.js (npm i ws). Send 16 kHz mono 16-bit PCM in ~100 ms frames, in real time.
import WebSocket from "ws";
const ws = new WebSocket("wss://api.sponkly.com/v1/live?source=en&target=tr&voice=1", {
  headers: { Authorization: `Bearer ${process.env.SPONKLY_KEY}` },
});
ws.on("message", (raw) => {
  const e = JSON.parse(raw);
  if (e.t === "cap" && e.done) console.log("caption:", e.text);   // a translated line
  if (e.t === "pcm") play(Buffer.from(e.d, "base64"), e.r);      // translated voice, 24 kHz PCM
});
microphone.on("data", (frame) => ws.send(frame));               // binary frames

// Browsers cannot set headers: new WebSocket(url, ["sponkly-key", key]). Never put your key in a public page —
// open the socket from your server, or from an app only your own team uses.
服务器消息含义
{"t":"ready","engine":"openai|own"}会话已开启;engine 表示该语言使用哪条翻译路径。
{"t":"partial","text":"…"}正在识别的语音(可能还会变化)。
{"t":"cap","id","text","done"}一行译文:随内容增加而显示,done 为 true 时即为最终结果。
{"t":"pcm","d":"<base64>","r":24000}一段翻译后的语音:指定采样率的 16 位单声道 PCM,base64 编码。请依次连续播放各段。
{"t":"problem","text":"noMinutes"}你的余额已用完;会话将关闭。

参数:source 和 target(语言代码),voice=0 表示只要字幕(半价)。请实时发送音频(发送过快会被拒绝)。每个账号最多同时 10 个会话,每个最长 2 小时。按翻译语音的秒数计费;静音和音乐免费。

POST/v1/speech

文本转语音

将文本转为自然的语音,并直接返回音频文件。

curl https://api.sponkly.com/v1/speech \
  -H "Authorization: Bearer $SPONKLY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Merhaba, hoş geldiniz.", "language": "tr", "voice": "female", "format": "mp3"}' \
  --output welcome.mp3

字段:text(最多 4,096 个字符)、language、voice(female、male、neutral,或 alloy、ash、ballad、coral、echo、fable、onyx、nova、sage、shimmer、verse)、format(mp3、wav 或 opus)、speed(0.5–2)。费用见 X-Sponkly-Cost-Usd 响应头。

POST/v1/transcribe

语音转文本

上传音频或视频文件(最大 25 MB、60 分钟);获取带时间戳的文本,如有需要还可获取译文。

curl https://api.sponkly.com/v1/transcribe \
  -H "Authorization: Bearer $SPONKLY_KEY" \
  -F [email protected] \
  -F language=tr \
  -F translate_to=en

{ "text": "…", "language": "tr", "duration_seconds": 182.4,
  "segments": [{ "start": 0.0, "end": 4.2, "text": "…" }],
  "translation": { "text": "…", "target": "en" }, "cost_usd": "0.030430" }
POST/v1/videos

视频字幕和配音

发送最长 5 分钟的视频,即可取回翻译版本:烧录字幕、翻译配音或两者兼有,并附双语字幕文件。

# 1. Ask for a video: dubbed into Turkish, with Turkish subtitles
curl https://api.sponkly.com/v1/videos -H "Authorization: Bearer $SPONKLY_KEY" -H "Content-Type: application/json" \
  -d '{"target": "tr", "dub": true, "subtitles": "translated", "content_type": "video/mp4", "size_bytes": 48211022}'
# → { "id": "…", "upload": { "method": "PUT", "url": "https://…", "headers": { "Content-Type": "video/mp4" } } }

# 2. Upload the file to that link
curl -X PUT -H "Content-Type: video/mp4" --data-binary @talk.mp4 "<upload.url>"

# 3. Start it, then poll until "status": "ready"
curl -X POST https://api.sponkly.com/v1/videos/<id>/start -H "Authorization: Bearer $SPONKLY_KEY"
curl https://api.sponkly.com/v1/videos/<id> -H "Authorization: Bearer $SPONKLY_KEY"
# → { "status": "ready", "cost_usd": "0.500000",
#     "result": { "video_url": "https://…", "subtitles": { "tr": "https://…srt", "en": "https://…srt" } } }

字段:target、source(可选)、dub(true 表示翻译配音)、subtitles(translated、original、both 或 none)、content_type(video/mp4 或 video/quicktime)、size_bytes、title(可选)。视频时长确定后按秒计费。结果可在 7 天内下载。

GET/v1/balance · /v1/usage · /v1/languages

余额、用量和语言

查询余额及最早一笔额度的到期时间,列出已计费的调用,并获取支持的语言和当前价格。

curl https://api.sponkly.com/v1/balance -H "Authorization: Bearer $SPONKLY_KEY"
# → { "balance_usd": "48.213400", "next_expiry": "2027-10-22T09:12:00.000Z" }

curl "https://api.sponkly.com/v1/usage?limit=20" -H "Authorization: Bearer $SPONKLY_KEY"
# → { "data": [{ "product": "live", "units": 312.5, "unit": "second", "cost_usd": "0.520834", … }], "has_more": false }

错误

错误以 JSON 形式返回,包含固定的错误代码和易读的说明。

{ "error": { "code": "insufficient_balance", "message": "…" } }
400invalid_text · invalid_target · text_too_long …请求中缺少某些内容或包含不允许的内容;说明中会指出具体问题。
401missing_key · invalid_key缺少 API 密钥,或密钥错误或已被撤销。
402insufficient_balance你的余额不足以支付此次调用。请在控制台中充值。
429—同时发出的请求过多。请稍候再试。
502translation_failed · speech_failed …我们这边或服务商出现故障。不会向你收费;请重试。

限制

  • 文本翻译:每个请求最多 50 条文本、20,000 个字符,每条文本最多 5,000 个字符。
  • 文本转语音:每个请求最多 4,096 个字符。
  • 语音转文本:文件最大 25 MB、60 分钟。
  • 实时翻译:每个账号最多同时 10 个会话,每个最长 2 小时,音频需实时发送。
  • 视频:最长 5 分钟、最大 4 GB,最多同时处理 3 个;结果保留 7 天。
  • 每个密钥每分钟上限:300 次翻译、120 次语音、60 次转写和 20 个新视频。
  • 32 种语言:英语、土耳其语、德语、法语、西班牙语、意大利语、葡萄牙语、俄语、日语、韩语、中文、阿拉伯语、印地语、荷兰语、波兰语、瑞典语、挪威语、丹麦语、芬兰语、希腊语、捷克语、罗马尼亚语、匈牙利语、乌克兰语、希伯来语、泰语、越南语、印尼语、马来语、爱沙尼亚语、波斯语和加泰罗尼亚语。

计费

  • 预付:用银行卡充值,$10 起;每次调用都从余额中扣除。
  • 银行卡手续费会在结账时显示并加收,因此充值的额度可全部使用。
  • 额度自购买之日起 12 个月内有效,不予退款。
  • 因我们一方原因失败的调用不收费,失败的视频会退还费用。
  • 余额不足时我们会发邮件提醒你;余额为零时,调用将以 402 被拒绝,直到你充值为止。