NexaraNexara

Субтитры

Как получить готовые к показу субтитры в форматах SRT и WebVTT.

Nexara умеет возвращать готовые файлы субтитров — srt или vtt. Их можно сразу подключить к видео в плеере или редакторе. Достаточно указать нужный формат в параметре response_format; временные метки при этом рассчитываются автоматически, отдельно запрашивать их не нужно.

Создание субтитров

Передайте response_format=srt (или vtt) в запросе на POST /v1/audio/transcriptions. Замените nx-XXXXXXXXXXXXXXXXXXXXXXXX на свой API-ключ, а video.mp4 — на путь к вашему файлу.

curl https://api.nexara.ru/v1/audio/transcriptions \
  -H "Authorization: Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX" \
  -F "file=@video.mp4" \
  -F "model=whisper-1" \
  -F "response_format=srt"
import requests

with open("video.mp4", "rb") as audio_file:
    response = requests.post(
        "https://api.nexara.ru/v1/audio/transcriptions",
        headers={"Authorization": "Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX"},
        files={"file": audio_file},
        data={
            "model": "whisper-1",
            "response_format": "srt",
        },
    )

subtitles = response.json()
with open("video.srt", "w", encoding="utf-8") as f:
    f.write(subtitles)
from openai import OpenAI

client = OpenAI(
    api_key="nx-XXXXXXXXXXXXXXXXXXXXXXXX",
    base_url="https://api.nexara.ru/v1",
)

with open("video.mp4", "rb") as audio_file:
    subtitles = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file,
        response_format="srt",
    )

print(subtitles)

Node.js 18+:

import fs from "fs";

const form = new FormData();
form.append("file", new Blob([fs.readFileSync("video.mp4")]), "video.mp4");
form.append("model", "whisper-1");
form.append("response_format", "srt");

const response = await fetch(
  "https://api.nexara.ru/v1/audio/transcriptions",
  {
    method: "POST",
    headers: { Authorization: "Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX" },
    body: form,
  },
);

const subtitles = await response.json();
fs.writeFileSync("video.srt", subtitles);
package main

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

func main() {
	file, _ := os.Open("video.mp4")
	defer file.Close()

	var buf bytes.Buffer
	writer := multipart.NewWriter(&buf)
	part, _ := writer.CreateFormFile("file", "video.mp4")
	io.Copy(part, file)
	writer.WriteField("model", "whisper-1")
	writer.WriteField("response_format", "srt")
	writer.Close()

	req, _ := http.NewRequest("POST", "https://api.nexara.ru/v1/audio/transcriptions", &buf)
	req.Header.Set("Authorization", "Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX")
	req.Header.Set("Content-Type", writer.FormDataContentType())

	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "uri"
require "json"

uri = URI("https://api.nexara.ru/v1/audio/transcriptions")

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX"
request.set_form(
  [
    ["file", File.open("video.mp4")],
    ["model", "whisper-1"],
    ["response_format", "srt"],
  ],
  "multipart/form-data",
)

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

File.write("video.srt", JSON.parse(response.body))

В ответе приходит готовый файл субтитров:

1
00:00:00,000 --> 00:00:02,100
Привет! Это пример

2
00:00:02,100 --> 00:00:04,300
транскрибации.

Чтобы получить формат WebVTT вместо SRT, замените response_format=srt на response_format=vtt.

Когда запрашиваете субтитры (srt или vtt) через библиотеку requests в Python, читайте ответ через response.json(), а не response.text — как и для остальных форматов ответа. Подробнее — на странице форматы ответа.

Как формируются субтитры

Nexara API формирует субтитры, удобные для чтения на экране:

  • длинные фразы автоматически разбиваются на короткие реплики подходящей длины;
  • время показа каждой реплики подбирается так, чтобы субтитры не мелькали слишком быстро и не задерживались слишком долго;
  • соседние субтитры не накладываются друг на друга.

Поэтому разбивка на реплики в srt/vtt может отличаться от сегментов в verbose_json — это ожидаемо и сделано ради читаемости.

Субтитры с диаризацией

Если добавить task=diarize, в субтитрах перед каждой репликой появится метка говорящего (Speaker 0, Speaker 1) — или роль, если включена разметка ролей.

curl https://api.nexara.ru/v1/audio/transcriptions \
  -H "Authorization: Bearer nx-XXXXXXXXXXXXXXXXXXXXXXXX" \
  -F "file=@meeting.mp4" \
  -F "model=whisper-1" \
  -F "task=diarize" \
  -F "response_format=srt"

Каждая реплика в субтитрах подписана говорящим:

1
00:00:00,000 --> 00:00:02,100
Speaker 0: Здравствуйте! Чем могу помочь?

2
00:00:02,500 --> 00:00:05,000
Speaker 1: Хочу оформить возврат.

Что учитывать

  • Хранение ключа. Не вставляйте API-ключ прямо в код. Храните его в переменной окружения (например, export NEXARA_API_KEY="nx-...") и ссылайтесь на неё. Подробнее — на странице аутентификации.

On this page