语音转文字
POST
/v1/audio/transcriptions
将音频转换为文本
请求参数
请求头
Authorization
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
请求体必须使用 multipart/form-data;使用 curl -F 或 SDK 时让客户端自动生成 boundary。
表单字段
表单字段(7 个)
| 参数 | 类型 | 默认值 | 说明 | 是否必填 |
|---|---|---|---|---|
file | file | — | 要转录的音频文件。 | 是 |
model | string | — | 转录模型 ID,例如 whisper-1。 | 是 |
language | string | 未声明 | ISO-639-1 语言代码,例如 zh 或 en;省略时通常由上游自动检测。 | 否 |
prompt | string | — | 提示词,可用于改善专有名词和上下文识别。 | 否 |
response_format | string | json | 可选 json、text、srt、verbose_json 或 vtt。 | 否 |
temperature | number | 未声明 | 采样温度,数值越高结果越随机;0 是常用示例值。 | 否 |
timestamp_granularities | array<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。
| 字段 | 类型 | 说明 |
|---|---|---|
text | string | 转录后的文本。 |
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 由上游模型和渠道决定。