Технические решения
Шесть решений, без которых конвейер не поехал бы
Самое долгое в таком проекте не нейросеть, а всё вокруг неё: доступы, сеть, расписание и защита от тихих сбоев.
01
Записи через OAuth, а не вебхук
Вебхук отдаёт журнал, но не файлы
Ссылка на запись в Битрикс24 ведёт на служебный скрипт, которому нужна сессия пользователя. С кодом вебхука он отдаёт страницу входа. Подняли локальное приложение в портале: с OAuth-токеном та же ссылка отдаёт mp3.
02
Мёртвые адреса портала
Скрипт молча висел по пять минут
У портала 13 IP-адресов, часть не отвечает. Стандартный HTTP-клиент Python ждал первый мёртвый адрес весь таймаут. Запросы перевели на curl с таймаутом соединения 5 секунд, он сразу уходит к следующему адресу. 53 записи скачались за пару минут.
03
Проверка, что пришёл звук
Протухший токен не выглядит ошибкой
Если токен истёк, сервер отвечает кодом 200 и HTML страницы входа. Качалка проверяет Content-Type и не сохраняет такой ответ под видом записи.
04
Whisper на процессоре
Без видеокарты и облака
Модель small в int8 на четырёх ядрах: первые 111 минут аудио расшифрованы за 45 минут. Medium на этот сервер не поместилась. Качество ниже, чем у больших моделей, но для разбора сути хватает.
05
Расписание без наложений
flock и короткое окно
Прогон каждые 15 минут смотрит только последние два дня. Десятиминутный разговор расшифровывается около 6,5 минуты: если прогон не успел, flock пропускает следующий запуск, а ночной прогон добирает всё, что отстало.
06
Атомарная публикация
Дашборд не видит полуготовый файл
В общем файле данных подменяется только блок звонков: запись во временный файл и os.replace. Если блок не изменился, хостинг не трогаем. Часовой сборщик дашборда работает параллельно и не конфликтует.