Сервер и интеграции
Обновлено
Подключение сервера распознавания
Подготовьте сервер с 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.
- Если класс плагина телефонии предоставляет публичный статический метод
getRecordFile($call_id), плагин пытается получить существующий локальный файл. Это способ, описанный для плагина «Билайн» от Easyweb. - Если локальный файл не получен, вызывается
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. Его исключение записывается в журнал, но уже готовая расшифровка из-за этого не отправляется повторно.