文档

Whisper-1 音频转录

- 支持 99 种语言的语音识别

  • 支持 99 种语言的语音识别
  • 多种输出格式:json、text、srt、vtt 等
  • 最大文件大小 25 MB

请求示例

bash curl --request POST \ --url https://api.openveer.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'

```python
import requests

url = "https://api.openveer.com/v1/audio/transcriptions"

files = {
"file": open("/path/to/audio.mp3", "rb")
}

data = {
"model": "whisper-1",
"language": "zh",
"response_format": "json"
}

headers = {
"Authorization": "Bearer "
}

response = requests.post(url, files=files, data=data, headers=headers)

print(response.json())
```

```javascript
const url = "https://api.openveer.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 "
};

fetch(url, {
method: "POST",
headers: headers,
body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
```

```go
package main

import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)

func main() {
url := "https://api.openveer.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))

}
```

```java
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://api.openveer.com/v1/audio/transcriptions";

      File audioFile = new File("/path/to/audio.mp3");

      // 使用 Apache HttpClient 或 OkHttp 库来发送 multipart/form-data 请求
  }

}
```

```php
$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 " ]); $response = curl_exec($ch); curl_close($ch); echo $response; ?>

```

```ruby
require 'net/http'
require 'uri'

url = URI("https://api.openveer.com/v1/audio/transcriptions")

File.open('/path/to/audio.mp3', 'rb') do |file|
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer "

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
```

```swift
import Foundation

let url = URL(string: "https://api.openveer.com/v1/audio/transcriptions")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer ", 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()
```

```csharp
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
var url = "https://api.openveer.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);
  }

}
```

```c
#include
#include

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://api.openveer.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;

}
```

```objectivec
#import

int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://api.openveer.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;

}
```

```ocaml
( Requires cohttp and yojson libraries )
open Lwt
open Cohttp
open Cohttp_lwt_unix

let url = "https://api.openveer.com/v1/audio/transcriptions"

( Note: Multipart form data handling in OCaml requires additional libraries )
let () =
print_endline "使用 multipart_form 库来处理文件上传"
```

```dart
import 'dart:io';
import 'package:http/http.dart' as http;

void main() async {
final url = Uri.parse('https://api.openveer.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);

}
```

```r
library(httr)

url <- "https://api.openveer.com/v1/audio/transcriptions"

response <- POST(
url,
add_headers(Authorization = "Bearer "),
body = list(
file = upload_file("/path/to/audio.mp3"),
model = "whisper-1",
language = "zh",
response_format = "json"
),
encode = "multipart"
)

cat(content(response, "text"))
```

响应示例

json { "text": "这是一段测试音频的转录文本内容。" }

json { "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 } ] }

```srt
1
00:00:00,000 --> 00:00:03,500
这是一段测试音频

2
00:00:03,500 --> 00:00:08,500
的转录文本内容。
```

json { "error": { "code": 400, "message": "请求参数无效", "type": "invalid_request_error" } }

json { "error": { "code": 401, "message": "身份验证失败,请检查您的API密钥", "type": "authentication_error" } }

json { "error": { "code": 402, "message": "账户余额不足,请充值后再试", "type": "payment_required" } }

json { "error": { "code": 413, "message": "文件大小超过限制(最大 25MB)", "type": "invalid_request_error" } }

json { "error": { "code": 429, "message": "请求过于频繁,请稍后再试", "type": "rate_limit_error" } }

json { "error": { "code": 500, "message": "服务器内部错误,请稍后重试", "type": "server_error" } }

json { "error": { "code": 502, "message": "网关错误,服务器暂时不可用", "type": "bad_gateway" } }

Authorizations

Authorization string
所有接口均需要使用Bearer Token进行认证 获取 API Key: 访问 [API Key 管理页面](https://openveer.com) 获取您的 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
无语音概率