Расшифровка созвонов через API: протокол встречи без секретаря


API распознавания речи позволяет вынести расшифровку созвона из ручной работы в отдельный шаг вашего скрипта: запись отправляется на обработку, задача выполняется, а результат можно забрать через API. Для рабочего процесса этого достаточно, чтобы связать стенограмму с последующим формированием протокола встречи.

В этой схеме нейросеть используется не только для получения текста. Один сценарий может включать загрузку записи, запуск операции распознавания, ожидание результата, передачу текста в чат для краткого резюме и сохранение готового протокола в архиве. Ключ и текущие параметры API доступны в разделе API.

Что нужно от протокола, а не от стенограммы

Стенограмма отвечает на вопрос «что было сказано», а протокол — «что по итогам встречи нужно сделать». Для рабочих созвонов это разные результаты. В длинной расшифровке могут быть приветствия, уточнения, повторения и обсуждение нескольких вариантов, тогда как в протоколе обычно нужны решения, задачи, ответственные и сроки.

Поэтому я бы разделял процесс на два независимых этапа. Сначала api распознавания речи превращает аудиозапись в текст с сохранением информации о говорящих, затем чат обрабатывает этот текст по заранее заданной структуре.

Например, исходная стенограмма может занимать 40 минут разговора и содержать несколько тысяч слов. В итоговом документе достаточно оставить четыре блока: «Решения», «Задачи», «Ответственные», «Открытые вопросы». Это сокращает материал не за счёт удаления исходной записи, а за счёт создания отдельного рабочего представления.

Практический конвейер выглядит так:

  1. получить запись созвона;
  2. загрузить файл через POST /uploads и получить ссылку;
  3. запустить операцию расшифровки через POST /generate;
  4. получить состояние задачи через GET /tasks/{id} либо дождаться webhook;
  5. передать готовую стенограмму в чат;
  6. сохранить краткий протокол вместе с исходной расшифровкой.

Оплата в таком сценарии идёт за запуск операции, без абонентской платы и минимального платежа. Операция «Расшифровка записи (stt)» стоит 10 ₽ за один запуск.

Расшифровка созвона и протокол встречи
Расшифровка созвона и протокол встречи

Запись созвона: форматы и подготовка

До отправки файла стоит определить, что именно будет входом в процесс. Если встреча записывается целиком, в архиве полезно хранить исходный файл, дату, название встречи и идентификатор задачи распознавания. Тогда готовый протокол не становится единственной копией информации.

Маршрут POST /uploads предназначен для загрузки файла и получения ссылки. После этого ссылка может использоваться в следующем этапе сценария. Точный набор параметров операции следует брать из ответа GET /services, поскольку в справке API не задан универсальный формат тела запроса для всех операций.

Перед интеграцией удобно один раз запросить список доступных операций и цен:

curl https://genius-bot.ru/wp-json/genius/v1/services \
  -H "Authorization: Bearer <ключ>"

Авторизация выполняется через заголовок Authorization: Bearer <ключ>. Ключ выдаётся после входа в разделе API и показывается один раз, поэтому его не стоит помещать непосредственно в исходный код приложения.

В Python базовую проверку соединения можно сделать отдельно от загрузки файлов:

import os
import requests

BASE_URL = "https://genius-bot.ru/wp-json/genius/v1"
API_KEY = os.environ["GENIUS_API_KEY"]

headers = {
    "Authorization": f"Bearer {API_KEY}"
}

response = requests.get(
    f"{BASE_URL}/balance",
    headers=headers,
    timeout=30
)
response.raise_for_status()

print(response.json())

Такой запрос использует документированный маршрут GET /balance и позволяет проверить остаток до запуска обработки. Саму загрузку и запуск лучше строить по схеме параметров, которую API возвращает для нужной операции через /services, а не зашивать предположительный формат JSON.

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

Расшифровка с разделением по говорящим

Обычная стенограмма без разделения участников плохо подходит для протокола. Фраза «сделаем это к пятнице» имеет смысл только тогда, когда из контекста понятно, кто её произнёс и к кому относится действие.

Читать  Баннеры и посты в соцсети: генерация картинок по расписанию

Поэтому при проектировании процесса разделение по говорящим стоит считать отдельным требованием к результату. Операция stt предназначена для расшифровки записи, а конкретные параметры запуска нужно получить из описания операции в GET /services.

Сам API работает с задачами: после запуска операции приложение получает идентификатор задачи, а состояние и результат можно получать через GET /tasks/{id}. Это позволяет не держать HTTP-соединение открытым на всё время обработки аудио.

Для небольшого внутреннего скрипта подходит обычный цикл опроса. Логика здесь простая: запустить задачу, сохранить её идентификатор, периодически запрашивать состояние и продолжить обработку только после получения результата.

import os
import time
import requests

BASE_URL = "https://genius-bot.ru/wp-json/genius/v1"
HEADERS = {
    "Authorization": f"Bearer {os.environ['GENIUS_API_KEY']}"
}

# После POST /generate сохраните идентификатор созданной задачи.
task_id = "ID_ЗАДАЧИ"

while True:
    r = requests.get(
        f"{BASE_URL}/tasks/{task_id}",
        headers=HEADERS,
        timeout=30
    )
    r.raise_for_status()
    task = r.json()

    print(task)

    # Здесь проверяется фактическое состояние,
    # возвращаемое вашим API для этой задачи.
    if task.get("result") is not None:
        transcript = task["result"]
        break

    time.sleep(3)

В примере намеренно не зафиксированы придуманные значения статусов: API должен быть источником фактической структуры ответа конкретной операции. Если приложение не должно заниматься постоянным опросом, у /generate предусмотрен необязательный параметр callback_url. После готовности задачи на этот адрес приходит POST.

Для автоматической обработки архива webhook удобнее polling: сервис получает уведомление о готовом результате, извлекает расшифровку, запускает следующий этап и записывает результат. При этом стоит учитывать ограничение частоты — не больше 60 запросов в минуту на один ключ.

Поиск по архиву расшифрованных встреч
Поиск по архиву расшифрованных встреч

Короткий протокол из длинной стенограммы

После распознавания у нас есть текст, но это ещё не протокол. Следующий шаг можно выполнять в том же приложении через совместимый с OpenAI формат POST /chat/completions. Для него достаточно использовать тот же формат запросов, что и у OpenAI-клиента, заменив base_url и ключ.

Вместо свободного запроса лучше задавать фиксированную структуру результата. Например, инструкция для чата может требовать вывести только четыре раздела: решения, задачи, ответственные и открытые вопросы. Это уменьшает количество ручной обработки и делает документы разных встреч похожими друг на друга.

Полезно отдельно указать правило для неопределённости: если в стенограмме нет ответственного или срока, модель не должна их придумывать. В протоколе можно оставить «не указан» или перенести пункт в «Открытые вопросы». Это особенно важно для задач, где один неточный вывод может превратиться в неверную запись в системе.

Связка выглядит следующим образом: stt создаёт исходный текст, а чат сокращает его до рабочего документа. Такой подход удобнее, чем пытаться получить сразу красивый протокол из аудио, поскольку промежуточная стенограмма остаётся доступной для проверки.

Для чата действует отдельный тариф: 40 ₽ за 1 млн токенов запроса и 400 ₽ за 1 млн токенов ответа. Поэтому при большом архиве стоит учитывать не только количество расшифровок, но и объём текста, который вы отправляете на второй этап.

Операция Цена Роль в сценарии
Расшифровка записи (stt) 10 ₽ за запуск Получение текста встречи
Чат 40 ₽ / 1 млн входных токенов; 400 ₽ / 1 млн выходных Сокращение стенограммы до протокола
Звук из видео (ytaudio) 0 ₽ за запуск Получение звуковой дорожки из видео, если она нужна в процессе

Здесь важно не смешивать две разные величины. Для stt цена указана за запуск операции, а для чата стоимость зависит от количества токенов запроса и ответа. Поэтому стоимость месяца встреч зависит от количества записей и от объёма текста, передаваемого на этап формирования протокола.

Поиск по архиву встреч

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

При этом поиск лучше строить не только по полному тексту. Отдельное поле с решениями позволяет быстро находить встречи, где обсуждался конкретный вопрос, а список задач — проверять, на каких встречах появилось определённое обязательство.

Читать  Фирменный стиль в генерации картинок: как держать единый вид

Само хранение и поиск по архиву не требуют отдельной операции API из описанного набора маршрутов. Это задача вашего приложения: после получения результата через /tasks/{id} вы сохраняете текст и метаданные в выбранное хранилище, а затем индексируете их для поиска.

Полезный формат записи может выглядеть так:

{
  "date": "2026-09-21",
  "title": "Еженедельный созвон команды",
  "task_id": "12345",
  "transcript": "...",
  "protocol": {
    "decisions": ["..."],
    "tasks": ["..."],
    "open_questions": ["..."]
  }
}

Такой JSON — это структура хранения на стороне приложения, а не формат ответа API. Её преимущество в том, что стенограмма и краткий результат остаются связанными одним объектом.

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

Отдельно стоит хранить ссылку на исходную запись. Тогда спорный пункт протокола можно проверить по аудио, а не пытаться восстановить контекст только по сокращённому тексту.

Разделение реплик по участникам созвона
Разделение реплик по участникам созвона

Сколько стоит месяц созвонов

Рассчитаем простой сценарий: 20 встреч за месяц, по одной записи на встречу. Только этап расшифровки обойдётся в 20 × 10 ₽ = 200 ₽, если на каждую встречу приходится один запуск операции stt.

Дальше добавляется обработка стенограмм через чат. Её стоимость нельзя корректно назвать одной фиксированной суммой без объёма текста: тариф составляет 40 ₽ за 1 млн токенов входа и 400 ₽ за 1 млн токенов выхода.

Например, если ваш сценарий передаёт в чат суммарно 2 млн входных токенов и получает 100 тысяч токенов ответа, расчёт будет таким: 2 × 40 ₽ = 80 ₽ за вход и 0,1 × 400 ₽ = 40 ₽ за выход. Вместе с 200 ₽ за двадцать запусков stt получается 320 ₽ за указанные объёмы обработки.

Это именно пример расчёта, а не фиксированная стоимость месяца: фактический расход зависит от количества встреч, числа запусков stt и объёма токенов на этапе протоколирования.

При планировании бюджета удобно считать отдельно две части:

  • количество записей × 10 ₽ за запуск stt;
  • объём входных токенов × 40 ₽ за 1 млн плюс объём выходных токенов × 400 ₽ за 1 млн.

Абонентской платы и минимального платежа нет. При выпуске первого ключа на баланс начисляется 50 ₽ для пробы, поэтому первоначальную проверку небольшого сценария можно провести до расчёта регулярной нагрузки.

Если приложение обрабатывает большой архив автоматически, дополнительно учитывайте лимит 60 запросов в минуту на ключ. При последовательной обработке встреч это обычно означает, что основной вопрос связан не с количеством запросов к API, а с правильной организацией ожидания задач и webhook. В любом случае лимит нужно учитывать в очереди обработки.

В результате рабочий сценарий получается достаточно прямым: запись попадает в загрузку, stt создаёт расшифровку, задача возвращает результат, чат превращает длинный текст в протокол, а приложение сохраняет оба документа в архиве. При следующей встрече этот же конвейер запускается снова, а поиск работает уже по накопленной базе.

Частые вопросы

Можно ли получить результат расшифровки без постоянного опроса API?

Да. Для запуска операции предусмотрен необязательный параметр callback_url. Когда задача готова, на указанный адрес приходит POST. Альтернативный вариант — периодически запрашивать GET /tasks/{id}.

Сколько стоит одна расшифровка?

Операция «Расшифровка записи (stt)» стоит 10 ₽ за один запуск. Это цена операции, а не тариф за минуту аудио.

Можно ли после расшифровки автоматически сделать короткий протокол?

Да, архитектура сценария позволяет разделить эти этапы. Расшифровка выполняется через stt, после чего полученный текст можно передать в POST /chat/completions и задать ему структуру итогового документа.

Как узнать параметры запуска операции?

Маршрут GET /services возвращает список операций и цен. Для конкретной интеграции параметры запуска следует брать из описания операции, а не предполагать общий формат тела для всех методов.

Читать  Видео испортил мессенджер: почему это происходит и что вернуть можно

Нужно ли хранить только протокол встречи?

Для рабочего архива практичнее сохранять и краткий протокол, и полную стенограмму, а при необходимости — ссылку на исходную запись. Тогда спорный пункт можно проверить по исходному материалу.

Где взять ключ для API?

После входа ключ выдаётся в личном разделе API. Он показывается один раз, поэтому в приложении его лучше хранить как секрет и передавать через заголовок Authorization: Bearer <ключ>.

API для разработчиковОзвучка, музыка, видео и картинки одним ключом. Пробный баланс при выпуске.
Получить ключ