语音转文字

POST /v1/audio/transcriptions

将音频转换为文本

请求参数

请求头

Authorization

使用 Bearer Token 认证。

格式: Authorization: Bearer sk-xxxxxx

请求体必须使用 multipart/form-data;使用 curl -F 或 SDK 时让客户端自动生成 boundary。

表单字段

表单字段(7 个)
参数类型默认值说明是否必填
filefile—要转录的音频文件。是
modelstring—转录模型 ID,例如 whisper-1。是
languagestring未声明ISO-639-1 语言代码,例如 zh 或 en;省略时通常由上游自动检测。否
promptstring—提示词,可用于改善专有名词和上下文识别。否
response_formatstringjson可选 json、text、srt、verbose_json 或 vtt。否
temperaturenumber未声明采样温度,数值越高结果越随机;0 是常用示例值。否
timestamp_granularitiesarray<string>—时间戳粒度,可选 word 或 segment;通常与 verbose_json 一起使用。否

请求示例代码

curl -X POST "https://10000router.com/v1/audio/transcriptions" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@audio.mp3" \
  -F "model=whisper-1" \
  -F "language=zh" \
  -F "response_format=verbose_json" \
  -F 'timestamp_granularities[]=segment'
const form = new FormData();
form.append("file", new Blob([audioBytes]), "audio.mp3");
form.append("model", "whisper-1");
form.append("language", "zh");
form.append("response_format", "verbose_json");
form.append("timestamp_granularities[]", "segment");
const response = await fetch("https://10000router.com/v1/audio/transcriptions", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.API_KEY },
  body: form
});
console.log(await response.json());
import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["API_KEY"], base_url="https://10000router.com/v1")

with open("audio.mp3", "rb") as audio:
    response = client.post(
        "https://10000router.com/v1/audio/transcriptions",
        headers={"Authorization": "Bearer " + os.environ["API_KEY"]},
        files={"file": ("audio.mp3", audio, "audio/mpeg")},
        data={
            "model": "whisper-1",
            "language": "zh",
            "response_format": "verbose_json",
            "timestamp_granularities[]": "segment",
        },
    )
print(response)
file, _ := os.Open("audio.mp3")
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "audio.mp3")
io.Copy(part, file)
writer.WriteField("model", "whisper-1")
writer.WriteField("language", "zh")
writer.Close()
req, _ := http.NewRequest("POST", "https://10000router.com/v1/audio/transcriptions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("API_KEY"))
req.Header.Set("Content-Type", writer.FormDataContentType())
var boundary = "----10000routerBoundary";
var body = new java.io.ByteArrayOutputStream();
var utf8 = java.nio.charset.StandardCharsets.UTF_8;
java.util.function.BiConsumer<String, String> addField = (name, value) -> body.writeBytes(
    ("--" + boundary + "\r\n"
        + "Content-Disposition: form-data; name=\"" + name + "\"\r\n\r\n"
        + value + "\r\n").getBytes(utf8));
addField.accept("model", "whisper-1");
addField.accept("language", "zh");
addField.accept("response_format", "verbose_json");
addField.accept("timestamp_granularities[]", "segment");
body.writeBytes(("--" + boundary + "\r\n"
    + "Content-Disposition: form-data; name=\"file\"; filename=\"audio.mp3\"\r\n"
    + "Content-Type: audio/mpeg\r\n\r\n").getBytes(utf8));
body.writeBytes(java.nio.file.Files.readAllBytes(java.nio.file.Path.of("audio.mp3")));
body.writeBytes(("\r\n--" + boundary + "--\r\n").getBytes(utf8));
var request = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://10000router.com/v1/audio/transcriptions"))
    .header("Authorization", "Bearer " + System.getenv("API_KEY"))
    .header("Content-Type", "multipart/form-data; boundary=" + boundary)
    .POST(java.net.http.HttpRequest.BodyPublishers.ofByteArray(body.toByteArray()))
    .build();
var response = java.net.http.HttpClient.newHttpClient().send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new("Bearer", Environment.GetEnvironmentVariable("API_KEY"));
using var form = new MultipartFormDataContent();
form.Add(new StreamContent(File.OpenRead("audio.mp3")), "file", "audio.mp3");
form.Add(new StringContent("whisper-1"), "model");
form.Add(new StringContent("zh"), "language");
var response = await client.PostAsync("https://10000router.com/v1/audio/transcriptions", form);
Console.WriteLine(await response.Content.ReadAsStringAsync());

返回响应

响应示例

{
  "text": "你好,这是语音转文字的结果。"
}
{
  "error": {
    "message": "Missing required parameter: file",
    "type": "invalid_request_error",
    "param": "file",
    "code": null
  }
}
{
  "error": {
    "message": "Rate limit reached",
    "type": "rate_limit_exceeded",
    "param": null,
    "code": null
  }
}
{
  "error": {
    "message": "Invalid authentication credentials",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

返回字段参数

标准 JSON 响应(1 个)

以下结构适用于 response_format=json。

字段类型说明
textstring转录后的文本。
verbose_json 响应

选择 verbose_json 时,NewAPI 会透传上游返回的任务、语言、时长和分段时间戳;具体字段由模型决定:

{
  "task": "transcribe",
  "language": "Chinese",
  "duration": 2.4,
  "text": "你好,这是语音转文字的结果。",
  "segments": [
    {
      "id": 0,
      "seek": 0,
      "start": 0.0,
      "end": 2.4,
      "text": "你好,这是语音转文字的结果。",
      "tokens": [ 1234, 5678 ],
      "temperature": 0.0,
      "avg_logprob": -0.12,
      "compression_ratio": 1.1,
      "no_speech_prob": 0.01
    }
  ]
}

segments 中的 seek、tokens、temperature、avg_logprob、compression_ratio 和 no_speech_prob 由上游转录模型决定,可能省略。

其他响应格式
response_format响应体说明
text纯文本仅返回转录文本。
srt字幕文本返回 SubRip 字幕格式。
vtt字幕文本返回 WebVTT 字幕格式。

非 json 格式的具体 Content-Type 由上游模型和渠道决定。

results matching ""

    No results matching ""