Регистрация

Транскрибация

Расшифровка аудио в текст моделью ElevenLabs Scribe v2 — больше 90 языков, включая русский, пунктуация, таймкоды слов и разметка собеседников. Тот же ключ, тот же base URL, запрос — как у OpenAI.

Запрос: POST /audio/transcriptions

Файл передаётся формой multipart/form-data, как в API OpenAI, поэтому работают и curl, и OpenAI SDK. Ответ приходит целиком, стриминга нет. Сейчас доступна одна модель — elevenlabs/scribe-v2.

Параметр Тип Обяз. Описание
file file да Аудиофайл до 25 МБ — mp3, wav, m4a, ogg, opus, webm, flac или aac. Формат определяется по расширению имени файла.
model string да Идентификатор модели — elevenlabs/scribe-v2.
language string нет Язык записи в ISO-639-1 — ru, en и т. д. Без параметра модель определит язык сама.
response_format string нет json — только текст, значение по умолчанию. verbose_json — ещё язык, длительность, сегменты и слова с таймкодами.
diarize boolean нет Разметка собеседников — у каждого слова появляются speaker и speaker_label. Работает только с verbose_json.

Подсказки терминов (keyterms) Scribe v2 не поддерживает и отвечает 400. Ссылку на файл вместо самого файла передать нельзя — только загрузка.

Примеры

Самый короткий вариант — только текст записи.

bash · curl
curl https://api.tokendock.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer $TOKENDOCK_API_KEY" \
  -F file=@call.mp3 \
  -F model=elevenlabs/scribe-v2

Для записей разговоров нужна разметка собеседников: diarize=true вместе с response_format=verbose_json. Без verbose_json запрос с diarize отклоняется с 400.

bash · curl, с собеседниками
curl https://api.tokendock.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer $TOKENDOCK_API_KEY" \
  -F file=@call.mp3 \
  -F model=elevenlabs/scribe-v2 \
  -F language=ru \
  -F response_format=verbose_json \
  -F diarize=true

В OpenAI SDK метод называется audio.transcriptions.create. Параметра diarize в SDK нет, он передаётся через extra_body.

python
import os
from itertools import groupby
from openai import OpenAI

client = OpenAI(
    base_url="https://api.tokendock.cloud/v1",
    api_key=os.environ["TOKENDOCK_API_KEY"],
)

with open("call.mp3", "rb") as audio:
    result = client.audio.transcriptions.create(
        model="elevenlabs/scribe-v2",
        file=audio,
        language="ru",
        response_format="verbose_json",
        extra_body={"diarize": True},
    )

# Реплики: подряд идущие слова одного собеседника
for speaker, words in groupby(result.words, key=lambda word: word.speaker_label):
    print(f"{speaker}: {' '.join(word.word for word in words)}")

# speaker_0: Здравствуйте. Это служба поддержки Token Dock. Чем могу помочь?
# speaker_1: Добрый день. Хочу узнать, сколько стоит расшифровка записи разговора.

Ответ

С response_format=json — текст и длительность записи в usage.seconds.

json · ответ
{
  "text": "Здравствуйте. Это служба поддержки Token Dock. Чем могу помочь? Добрый день. Хочу узнать, сколько стоит расшифровка записи разговора.",
  "usage": {
    "seconds": 8.7306875,
    "cost": 0.0002667710069443959
  }
}

С verbose_json и diarize — слова и текст в примере усечены.

json · verbose_json
{
  "text": "Здравствуйте. Это служба поддержки Token Dock. …",
  "usage": { "seconds": 8.7306875, "cost": 0.0002667710069443959 },
  "task": "transcribe",
  "language": "rus",
  "language_confidence": 1,
  "duration": 8.7306875,
  "segments": [
    { "id": 0, "start": 0, "end": 8.7306875, "text": "Здравствуйте. Это служба поддержки Token Dock. …" }
  ],
  "words": [
    { "word": "Здравствуйте.", "start": 0.1, "end": 0.72, "speaker": 0, "speaker_label": "speaker_0", "confidence": 0.998 },
    { "word": "Это", "start": 0.9, "end": 1.06, "speaker": 0, "speaker_label": "speaker_0", "confidence": 0.999 },
    "…"
  ]
}
  • words[].speaker_label — номер собеседника вида speaker_0, speaker_1 в порядке появления в записи. Имён модель не знает.
  • start и end — таймкоды слова в секундах от начала записи.
  • usage.cost — служебное поле провайдера в долларах. Списание с баланса TokenDock считается по длительности, см. ниже.

Тарификация

Транскрибация считается по длительности записи — её возвращает провайдер, неполная секунда округляется вверх. Минута записи — 1 000 токенов, сейчас это около 13,51 ₽ за час. Параметры language, diarize и формат ответа на цену не влияют.

  • Звонок на 9 секунд — 150 токенов, около 0,034 ₽.
  • Восьмичасовая смена оператора колл-центра — около 108,05 ₽.
  • В консоли и журнале запросов цена модели указана за 1M токенов — это 1 000 минут записи, а prompt_tokens в журнале — длительность в тех же единицах.
  • Перед запросом на балансе резервируется сумма по длительности из заголовка файла. Если заголовок не читается, запрос отклоняется — сохраните запись в одном из форматов из таблицы выше.
  • Отклонённый запрос — 400, 413, 429 — не тарифицируется.
Как считается стоимость

Практика

Длинные записи

  • Один файл — до 25 МБ, это около 25 минут mp3 на 128 кбит/с. Записи длиннее режьте на части по паузам, а не по ровным минутам — так фраза не разрывается посередине.
  • Для расшифровки речи хватает моно 16 кГц. Стерео-WAV из записывающей системы стоит пересжать в моно-mp3 или ogg — файл станет в 10–20 раз меньше.
  • Номера собеседников независимы в каждом файле: speaker_0 в соседних частях одной записи может оказаться разными людьми.

Расшифровку удобно сразу отдать чат-модели тем же ключом — выделить договорённости, оценить звонок по чек-листу или найти возражения клиента. Как это сделать — в разделе Chat Completions.