Claude Opus 5.5 уже доступна в SeedRouter

Whisper-1 API: первая транскрибация аудио

Отправьте запись в Whisper-1, сохраните ID задачи и скачайте текст или субтитры. Пример на Python с проверкой файлов, временными метками и актуальной ценой.

Читать в Markdown

Первому запросу Whisper-1 API нужны аудиофайл, явно указанный ID модели и формат результата. На SeedRouter вы загружаете запись, сохраняете возвращённый ID задачи, а затем скачиваете расшифровку после её завершения. Начните с короткой записи, слова которой вы уже знаете: так легче заметить пропуски и необычное написание.

Это руководство следует асинхронному контракту SeedRouter. Оно не является синхронным примером OpenAI SDK, пригодным без изменений. На странице модели Whisper-1 есть Playground и актуальная цена; справочник API перечисляет все поля и ещё не завершённые проверки совместимости. [1]

Подготовьте одну запись

Используйте речь, которую вам разрешено обрабатывать. Для начала подойдёт короткий WAV или MP3. Текущий лимит загрузки — 26,214,400 байт; файл должен содержать читаемое аудио с измеримой длительностью. Расширение .mp3 не делает переименованный текстовый файл корректным аудио. Справочник разделяет девять документированных входных форматов и форматы, прошедшие реальные проверки. [1]

Запись ниже — оригинальная синтезированная английская речь, созданная для этого руководства. Её звуковая волна показана на обложке. Цитата на обложке взята из сценария записи и не является заявлением о точности.

Скачать пример длительностью 10,31 секунды. В сценарии сказано: “This is a sample recording for an audio transcription tutorial. Our meeting starts at nine thirty on Monday. Please bring the project notes and review the final checklist before we begin.”

Храните API-ключ в переменной окружения на сервере. Не помещайте его на публичную страницу, в сборку мобильного приложения или общий скриншот. Пример Python ниже использует requests и читает SEEDROUTER_API_KEY из окружения.

Отправьте запрос Whisper-1 API один раз

Для первого запроса выберите json. Тогда вы сможете читать поле text скачанного файла без обработки таймкодов субтитров. Часть multipart file должна содержать реальные байты; URL в качестве её значения не равнозначен загрузке файла. Позвольте клиенту установить тип содержимого и разделитель multipart. [1]

Сохраните код как transcribe.py. Он записывает маркер отправки до POST и сохраняет ID принятой задачи после него. Повторный запуск читает существующую задачу. Если исход POST неизвестен, маркер не позволяет скрипту случайно создать дубликат.

import json
import os
from pathlib import Path

import requests

base = "https://api.seedrouter.ai/v1"
headers = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}
state = Path("whisper-task.json")
audio = Path("recording.wav")

if not state.exists():
    if not 0 < audio.stat().st_size <= 26_214_400:
        raise ValueError("Choose a nonempty recording within the upload limit")
    with state.open("x") as marker:
        json.dump({"status": "submission_unconfirmed"}, marker)
    with audio.open("rb") as recording:
        response = requests.post(
            f"{base}/audio/transcriptions",
            headers=headers,
            files={"file": (audio.name, recording, "audio/wav")},
            data={"model": "whisper-1", "response_format": "json"},
            timeout=180,
            allow_redirects=False,
        )
    response.raise_for_status()
    accepted = response.json()
    task_id = accepted.get("id")
    if not isinstance(task_id, str) or not task_id.startswith("task_"):
        raise RuntimeError("Submission could not be confirmed; check task history")
    state.write_text(json.dumps({"id": task_id}), encoding="utf-8")

saved = json.loads(state.read_text(encoding="utf-8"))
if "id" not in saved:
    raise RuntimeError("Check task history before submitting another recording")

response = requests.get(
    f"{base}/tasks/{saved['id']}", headers=headers, timeout=30,
    allow_redirects=False,
)
response.raise_for_status()
task = response.json()
print(task["status"])
if task["status"] == "completed":
    result = requests.get(task["output"]["url"], timeout=60)
    result.raise_for_status()
    print(result.json()["text"])
elif task["status"] == "failed":
    print(task["error"])

Запустите python transcribe.py. Если выведено processing, подождите несколько секунд и выполните ту же команду снова. Она прочитает сохранённый ID вместо повторной загрузки. Для каждой намеренно новой записи сохраняйте отдельный файл состояния. Один лишь тайм-аут клиента не доказывает неудачу задачи.

Прочитайте готовую расшифровку

Ответ о принятии содержит id, model, status и created_at. После завершения добавляются output.url и output.format. Этот URL указывает на файл результата; это не задача генерации медиа, требующая ещё одного платного запроса. GET скачивает файл. [1]

Читайте слова, одновременно слушая запись. Проверьте имена, числа и границы предложений перед использованием текста как субтитров или точной цитаты. Расшифровка — черновик сказанного, и временные метки не отменяют необходимость проверки.

Локальные сквозные проверки 19 октября 2026 года завершили все пять форматов транскрибации и перевод с английским входом. Они подтверждают поведение доставки и оплаты для проверенных записей. Они не устанавливают процент точности или качество перевода между языками.

Выберите текст, временные метки или субтитры

Ваш следующий шагВыберитеКак читать скачанный файл
Использовать слова в приложенииjsonJSON; начните с text
Редактировать обычную расшифровкуtextОбычный текст
Импортировать субтитры в редакторsrt или vttТекст субтитров
Привязать отдельные слова или сегментыverbose_jsonJSON с запрошенными временными метками

Для временных меток слов отправьте response_format=verbose_json и повторяемое multipart-поле timestamp_granularities[] со значением word. Если нужны оба варианта, добавьте часть со значением segment. В Python requests используйте список пар (name, value) для повторяемых полей. Каждая метка измеряется в секундах. [2]

Временные метки слов и метки говорящих — разные результаты. Whisper-1 не превращает встречу в расшифровку с обозначением говорящих только потому, что вы запросили сегменты. Он также не передаёт частичный текст потоком: stream для этой модели игнорируется. Для проверенного сценария не задавайте chunking_strategy; явное auto не прошло проверку совместимости реальным запросом. [1]

При необходимости добавьте язык и контекст написания

Необязательное language=en сообщает запросу транскрибации, что вход на английском. Не задавайте его для автоопределения. Если название продукта легко расслышать неверно, поместите правильное написание в prompt на языке аудио. Промпт Whisper даёт контекст, а не ведёт себя как команда чата, надёжно задающая конкретное оформление. [3]

Контекст должен относиться к фрагменту. Whisper учитывает только последние 224 токена своего токенизатора. Отправка длинного документа не даёт записи неограниченный словарь, а подсчёт символов не заменяет надёжно это правило токенов.

Для перевода на английский измените адрес на /audio/translations. У него пять полей запроса: file, model, prompt, response_format и temperature. Перевод создаёт английский текст; выбора целевого языка нет. Если используете промпт, пишите его на английском. [4]

Проверьте стоимость перед расширением процесса

Актуальная таблица ниже использует измеренную длительность аудио. Более длинная расшифровка не увеличивает оплату по длительности той же записи. Длительность каждого файла округляется вверх до целых секунд, затем переводится в единицы учёта аудио. Справочник API содержит точную формулу, а Playground показывает оценку после чтения длительности записи. Неудачные запросы не оплачиваются.

ModelUSD per minuteUSD per million audio metering units
whisper-1$0.036$36

For each recording: units = round(ceil(duration in seconds) × 1000 / 60). Multiply these audio units by the live unit rate. These are duration units, not transcript tokens. Both transcription and English translation use this rule. Failed requests are not charged.

Перед обработкой множества файлов проверьте одну типичную запись и изучите результат. Сохраняйте ID задачи каждой записи, чтобы восстановиться после разрыва соединения, прочитав её текущее состояние. Изучите полный справочник параметров перед добавлением субтитров или менее проверенных сочетаний форматов.

Вопросы при первой интеграции

Можно ли использовать пример OpenAI Python SDK без изменений?

Нет. Входные поля multipart знакомы, но SeedRouter возвращает асинхронный ID задачи. Синхронный клиент, ожидающий text в ответе POST, требует адаптации. Здесь отправка и чтение результата показаны явно.

Почему в моём JSON нет временных меток слов?

Формат json по умолчанию предназначен для текста. Запросите вместе verbose_json и детализацию временных меток word. Одни лишь метки сегментов не создают запись для каждого слова.

Нужно ли отправлять ещё один POST после тайм-аута?

Сначала проверьте сохранённый ID задачи или историю задач. Ответ мог потеряться после принятия. Чтение существующей задачи позволяет не создавать новый запрос для той же записи.

Whisper-1 выводят из эксплуатации?

OpenAI объявила об отключении Whisper в собственном API 26 февраля 2027 года. Это уведомление не устанавливает дату отключения данного сервиса. При создании новой интеграции включайте проверку уведомлений о жизненном цикле в обслуживание. [5]

Источники

[1] Справочник SeedRouter Whisper-1 API и статус проверки, проверено 19 октября 2026 года.

[2] Справочник транскрибации OpenAI.

[3] Руководство OpenAI по промптам Whisper.

[4] Справочник перевода OpenAI.

[5] Уведомление OpenAI об устаревании моделей транскрибации.

Похожие руководства