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
    end
    
    import 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 等工具测试:

  1. 导入后需要手动将此参数类型改为 file
  2. 确保请求 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
  无语音概率