Whisper-1 音频转录
- 支持 99 种语言的语音识别
-
多种输出格式:json、text、srt、vtt 等
-
最大文件大小 25 MB
curl --request POST \ --url https://aiboxapi.com/v1/audio/transcriptions \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: multipart/form-data' \ --form 'file=@/path/to/audio.mp3' \ --form 'model=whisper-1' \ --form 'language=zh' \ --form 'response_format=json'import requests url = "https://aiboxapi.com/v1/audio/transcriptions" files = { "file": open("/path/to/audio.mp3", "rb") } data = { "model": "whisper-1", "language": "zh", "response_format": "json" } headers = { "Authorization": "Bearer <token>" } response = requests.post(url, files=files, data=data, headers=headers) print(response.json())const url = "https://aiboxapi.com/v1/audio/transcriptions"; const formData = new FormData(); formData.append("file", audioFile); formData.append("model", "whisper-1"); formData.append("language", "zh"); formData.append("response_format", "json"); const headers = { "Authorization": "Bearer <token>" }; fetch(url, { method: "POST", headers: headers, body: formData }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));package main import ( "bytes" "fmt" "io" "mime/multipart" "net/http" "os" ) func main() { url := "https://aiboxapi.com/v1/audio/transcriptions" file, _ := os.Open("/path/to/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.WriteField("response_format", "json") writer.Close() req, _ := http.NewRequest("POST", url, body) req.Header.Set("Authorization", "Bearer <token>") req.Header.Set("Content-Type", writer.FormDataContentType()) client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() responseBody, _ := io.ReadAll(resp.Body) fmt.Println(string(responseBody)) }import java.io.File; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; public class Main { public static void main(String[] args) throws Exception { String url = "https://aiboxapi.com/v1/audio/transcriptions"; File audioFile = new File("/path/to/audio.mp3"); // 使用 Apache HttpClient 或 OkHttp 库来发送 multipart/form-data 请求 } }<?php $url = "https://aiboxapi.com/v1/audio/transcriptions"; $file = new CURLFile('/path/to/audio.mp3', 'audio/mpeg', 'audio.mp3'); $data = [ "file" => $file, "model" => "whisper-1", "language" => "zh", "response_format" => "json" ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer <token>" ]); $response = curl_exec($ch); curl_close($ch); echo $response; ?>require 'net/http' require 'uri' url = URI("https://aiboxapi.com/v1/audio/transcriptions") File.open('/path/to/audio.mp3', 'rb') do |file| request = Net::HTTP::Post.new(url) request["Authorization"] = "Bearer <token>" form_data = [ ['file', file, { filename: 'audio.mp3', content_type: 'audio/mpeg' }], ['model', 'whisper-1'], ['language', 'zh'], ['response_format', 'json'] ] request.set_form form_data, 'multipart/form-data' http = Net::HTTP.new(url.host, url.port) http.use_ssl = true response = http.request(request) puts response.body endimport Foundation let url = URL(string: "https://aiboxapi.com/v1/audio/transcriptions")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization") let boundary = "Boundary-\(UUID().uuidString)" request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") var body = Data() // Add file let fileURL = URL(fileURLWithPath: "/path/to/audio.mp3") if let fileData = try? Data(contentsOf: fileURL) { body.append("--\(boundary)\r\n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=\"file\"; filename=\"audio.mp3\"\r\n".data(using: .utf8)!) body.append("Content-Type: audio/mpeg\r\n\r\n".data(using: .utf8)!) body.append(fileData) body.append("\r\n".data(using: .utf8)!) } // Add other fields let fields = ["model": "whisper-1", "language": "zh", "response_format": "json"] for (key, value) in fields { body.append("--\(boundary)\r\n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) body.append("\(value)\r\n".data(using: .utf8)!) } body.append("--\(boundary)--\r\n".data(using: .utf8)!) request.httpBody = body let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error: \(error)") return } if let data = data, let responseString = String(data: data, encoding: .utf8) { print(responseString) } } task.resume()using System; using System.IO; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { var url = "https://aiboxapi.com/v1/audio/transcriptions"; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer <token>"); using var form = new MultipartFormDataContent(); var fileStream = File.OpenRead("/path/to/audio.mp3"); form.Add(new StreamContent(fileStream), "file", "audio.mp3"); form.Add(new StringContent("whisper-1"), "model"); form.Add(new StringContent("zh"), "language"); form.Add(new StringContent("json"), "response_format"); var response = await client.PostAsync(url, form); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); } }#include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; struct curl_httppost *formpost = NULL; struct curl_httppost *lastptr = NULL; struct curl_slist *headers = NULL; curl_global_init(CURL_GLOBAL_ALL); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "file", CURLFORM_FILE, "/path/to/audio.mp3", CURLFORM_END); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "model", CURLFORM_COPYCONTENTS, "whisper-1", CURLFORM_END); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "language", CURLFORM_COPYCONTENTS, "zh", CURLFORM_END); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "response_format", CURLFORM_COPYCONTENTS, "json", CURLFORM_END); curl = curl_easy_init(); headers = curl_slist_append(headers, "Authorization: Bearer <token>"); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://aiboxapi.com/v1/audio/transcriptions"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); curl_formfree(formpost); curl_slist_free_all(headers); } curl_global_cleanup(); return 0; }#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSURL *url = [NSURL URLWithString:@"https://aiboxapi.com/v1/audio/transcriptions"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"Bearer <token>" forHTTPHeaderField:@"Authorization"]; NSString *boundary = @"Boundary-12345"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; NSMutableData *body = [NSMutableData data]; // Add file NSData *fileData = [NSData dataWithContentsOfFile:@"/path/to/audio.mp3"]; [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"audio.mp3\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: audio/mpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:fileData]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // Add other fields NSDictionary *fields = @{@"model": @"whisper-1", @"language": @"zh", @"response_format": @"json"}; for (NSString *key in fields) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", fields[key]] dataUsingEncoding:NSUTF8StringEncoding]]; } [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"Error: %@", error); return; } NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@", result); }]; [task resume]; [[NSRunLoop mainRunLoop] run]; } return 0; }(* Requires cohttp and yojson libraries *) open Lwt open Cohttp open Cohttp_lwt_unix let url = "https://aiboxapi.com/v1/audio/transcriptions" (* Note: Multipart form data handling in OCaml requires additional libraries *) let () = print_endline "使用 multipart_form 库来处理文件上传"import 'dart:io'; import 'package:http/http.dart' as http; void main() async { final url = Uri.parse('https://aiboxapi.com/v1/audio/transcriptions'); var request = http.MultipartRequest('POST', url); request.headers['Authorization'] = 'Bearer <token>'; request.files.add(await http.MultipartFile.fromPath('file', '/path/to/audio.mp3')); request.fields['model'] = 'whisper-1'; request.fields['language'] = 'zh'; request.fields['response_format'] = 'json'; var response = await request.send(); var responseData = await response.stream.bytesToString(); print(responseData); }library(httr) url <- "https://aiboxapi.com/v1/audio/transcriptions" response <- POST( url, add_headers(Authorization = "Bearer <token>"), body = list( file = upload_file("/path/to/audio.mp3"), model = "whisper-1", language = "zh", response_format = "json" ), encode = "multipart" ) cat(content(response, "text")){ "text": "这是一段测试音频的转录文本内容。" }{ "task": "transcribe", "language": "zh", "duration": 8.5, "text": "这是一段测试音频的转录文本内容。", "segments": [ { "id": 0, "seek": 0, "start": 0.0, "end": 3.5, "text": "这是一段测试音频", "tokens": [50364, 1234, 5678], "temperature": 0.0, "avg_logprob": -0.3, "compression_ratio": 1.2, "no_speech_prob": 0.01 } ] }1 00:00:00,000 --> 00:00:03,500 这是一段测试音频 2 00:00:03,500 --> 00:00:08,500 的转录文本内容。{ "error": { "code": 400, "message": "请求参数无效", "type": "invalid_request_error" } }{ "error": { "code": 401, "message": "身份验证失败,请检查您的API密钥", "type": "authentication_error" } }{ "error": { "code": 402, "message": "账户余额不足,请充值后再试", "type": "payment_required" } }{ "error": { "code": 413, "message": "文件大小超过限制(最大 25MB)", "type": "invalid_request_error" } }{ "error": { "code": 429, "message": "请求过于频繁,请稍后再试", "type": "rate_limit_error" } }{ "error": { "code": 500, "message": "服务器内部错误,请稍后重试", "type": "server_error" } }{ "error": { "code": 502, "message": "网关错误,服务器暂时不可用", "type": "bad_gateway" } }
Authorizations
string 必填
所有接口均需要使用Bearer Token进行认证
获取 API Key:
访问 API Key 管理页面 获取您的 API Key
使用时在请求头中添加:
Authorization: Bearer YOUR_API_KEY
Body
⚠️ 此接口不支持在线调用(Try it)
由于文件上传的限制,请使用以下方式测试:
- Apifox / Postman - 导入后手动将
file参数改为文件类型 - cURL - 参考右侧代码示例
- SDK - 使用各语言的 SDK 示例代码
file string 必填
要转录的音频文件(文件类型)
⚠️ 注意:如果使用 Apifox 等工具测试:
- 导入后需要手动将此参数类型改为
file - 确保请求 Content-Type 为
multipart/form-data
支持的格式:mp3, mp4, mpeg, mpga, m4a, wav, webm
最大文件大小:25 MB
model string 必填
语音识别模型名称
Example: "whisper-1"
language string
音频的语言代码(ISO-639-1 格式)
指定语言可以提高准确率和速度
支持的语言包括:zh(中文)、en(英文)、ja(日文)、ko(韩文)等 99 种语言
Example: "zh"
prompt string
可选的文本提示,用于指导模型的转录风格或延续前一段音频
最长 224 个 tokens
response_format string
输出格式
支持的格式:
json- JSON 格式(仅包含文本)text- 纯文本srt- SRT 字幕格式verbose_json- 详细的 JSON 格式(包含时间戳和其他元数据)vtt- WebVTT 字幕格式
temperature number
采样温度,范围 0 到 1
较高的值(如 0.8)会使输出更随机,较低的值(如 0.2)会使其更加确定和一致
Response
text string
转录后的文本内容
task string
任务类型,固定为 transcribe
仅在 verbose_json 格式时返回
language string
检测到的或指定的语言代码
仅在 verbose_json 格式时返回
duration number
音频时长(秒)
仅在 verbose_json 格式时返回
segments array
文本片段数组
仅在 verbose_json 格式时返回
属性
片段ID
start number
片段开始时间(秒)
end number
片段结束时间(秒)
text string
片段文本内容
temperature number
使用的采样温度
avg_logprob number
平均对数概率
compression_ratio number
压缩比
no_speech_prob number
无语音概率