К содержимому
Интеграции

Сервер и интеграции

Обновлено

Подключение сервера распознавания

Подготовьте сервер с OpenAI-совместимым API, доступный с сервера сайта. В локальном описании продукта приведены примеры faster-whisper-server и speaches; совместимость конкретной установки нужно проверить по контракту ниже.

В настройках «Сервер Whisper» укажите базовый «Адрес сервера», «Ключ API», если сервер требует авторизации, и поддерживаемую «Модель». Нажмите «Проверить», выберите модель и нажмите «Сохранить». Адрес может оканчиваться на /v1: плагин не дублирует этот суффикс.

В readme.html также указан вариант подключения OpenAI: «Адрес сервера» — https://api.openai.com, «Модель» — whisper-1, «Ключ API» — ключ провайдера. Для любого сервера проверьте фактическое распознавание одного звонка: получение списка моделей ещё не подтверждает обработку аудио.

Какие запросы выполняются

Операция Запрос Ожидаемый результат
Кнопка «Проверить» GET /v1/models JSON с массивом data, в элементах которого есть id модели
Распознавание POST /v1/audio/transcriptions, multipart-форма JSON с полем text; дополнительные поля — segments, language, duration

Плагин отправляет аудиофайл в поле file, идентификатор model, response_format=verbose_json и temperature=0. Непустые «Язык» и «Подсказка» передаются как language и prompt. При непустом ключе используется заголовок Authorization: Bearer ….

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

Пример структуры ответа сервера:

{
  "text": "Здравствуйте. Когда будет доставка?",
  "segments": [
    {"start": 0, "end": 2, "text": "Здравствуйте."},
    {"start": 2, "end": 5, "text": "Когда будет доставка?"}
  ],
  "language": "ru",
  "duration": 5
}

Для показа меток времени нужны сегменты с start и text. Без сегментов плагин показывает общий текст. Ответ без text считается ошибкой. Пустой текст может получить статус готовности, но диалог с такой расшифровкой не откроется.

Получение аудиозаписи

Источник определяется по плагину телефонии, связанному со звонком. Он должен быть включён в CRM.

  1. Если класс плагина телефонии предоставляет публичный статический метод getRecordFile($call_id), плагин пытается получить существующий локальный файл. Это способ, описанный для плагина «Билайн» от Easyweb.
  2. Если локальный файл не получен, вызывается getRecordUrl($plugin_call_id, $plugin_record_id) подключённой телефонии. Запись скачивается на сервер сайта во временный файл и отправляется на распознавание.

Скачанный временный файл удаляется после попытки обработки, в том числе при ошибке распознавания. Исходный локальный файл телефонии обработчик не удаляет. Готовый текст хранится в базе CRM; удаление исходного аудио само по себе не удаляет текст.

Отсутствующий источник, пустая ссылка или HTTP 404 при скачивании переводят задачу в состояние «Нет записи». Другие ошибки скачивания могут вызвать повторную попытку.

Событие для разработчика

После сохранения готового результата плагин вызывает событие приложения CRM ewcrmwhisper_transcript_done с параметрами:

Параметр Содержимое
call_id Целочисленный ID звонка CRM
transcript_id Целочисленный ID записи расшифровки
text Полный текст распознавания

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

'ewcrmwhisper_transcript_done' => 'transcriptDoneHandler',

Обработчик получает указанные параметры обычным механизмом событий Webasyst. Его исключение записывается в журнал, но уже готовая расшифровка из-за этого не отправляется повторно.