AutoProtocol AI
Локальный веб-сервис: загрузка аудио/видео совещания → транскрипт с таймкодами и спикерами, поручения, краткое содержание и экспорт в DOCX/PDF.
О проекте
Команда: fato
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный веб-сервис: загрузка аудио/видео совещания → транскрипт с таймкодами и спикерами, поручения, краткое содержание и экспорт в DOCX/PDF.
Как устроено
Файл принимается FastAPI, распознаётся локально faster-whisper (автоопределение ru/kk/смешанной речи), опционально диаризуется pyannote speaker-diarization-3.1. Поручения (задача, ответственный, срок, цитата) извлекаются эвристиками по русским и казахским ключевым словам, саммари — начало транскрипта. Результат отдаётся JSON и экспортируется через python-docx и ReportLab; есть демо-режим без модели.
Ключевые решения
- faster-whisper
- pyannote.audio speaker-diarization-3.1
- keyword-based action item extraction
- DOCX/PDF export
Особенности
Полностью локальная обработка под закрытый контур, исходная запись удаляется после обработки; README честно перечисляет ограничения (поручения по правилам, саммари не семантическое).
Стек
Python · FastAPI · python-docx · ReportLab · FFmpeg · Docker · Docker Compose · HTML/JS
Модели
faster-whisper · pyannote speaker-diarization-3.1
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f28414a9-fato.
README
README.mdAutoProtocol AI
Локальный MVP для подготовки черновика протокола по записи совещания. Приложение распознаёт речь, показывает реплики с временными отметками и метками говорящих, выделяет возможные поручения, формирует краткое содержание и скачивает результат в DOCX или PDF.
Что реализовано
- Веб-интерфейс для загрузки аудио и видеофайлов (WAV, MP3, M4A, MP4, MOV, WEBM, OGG, FLAC).
- Локальное распознавание речи моделью faster-whisper. Язык определяет сама модель; доступны русский, казахский и смешанная речь, но качество зависит от аудио и размера модели.
- Локальная диаризация через pyannote.audio при включённой настройке. Если она выключена или модель недоступна, все реплики помечаются как «Говорящий 1».
- Структурированный JSON-ответ API с транскриптом, временными метками, языком, саммари и поручениями.
- Черновое извлечение поручений по русским и казахским ключевым словам. В таблице есть задача, ответственный, срок, исходная реплика и говорящий.
- Скачивание DOCX и PDF с саммари, таблицей поручений и транскриптом.
- Демо-сценарий без модели и аудиозаписи: заранее подготовленный русский/казахский транскрипт и поручения явно помечены как демонстрационные. Он нужен, чтобы показать интерфейс и экспорт, если веса модели ещё не скачаны.
- Запись удаляется с диска после обработки. Результат хранится в памяти процесса до перезапуска сервера.
Быстрый запуск без Docker
Нужен Python 3.10–3.12 и установленный FFmpeg, доступный в PATH. На Windows FFmpeg можно установить отдельно; для контейнера он уже установлен.
py -3.11 -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
Copy-Item .env.example .env
python -m uvicorn app:app --reload
Откройте http://localhost:8000. При первом запуске faster-whisper скачает выбранную модель из Hugging Face. Для первой загрузки нужен интернет; далее кэшированная модель может работать без сети. Начните с WHISPER_MODEL=small для более высокого качества или выберите base/tiny для более лёгкого демо.
Запуск через Docker
Из корня репозитория выполните одну команду (файл .env не обязателен):
docker compose up --build
Затем откройте http://localhost:8000. Контейнер настроен на CPU и устанавливает FFmpeg при сборке. docker-compose.yml задаёт рабочие значения по умолчанию, поэтому первый запуск не блокируется отсутствием .env. Сборка контейнера и загрузка весов требуют сетевого доступа к пакетному реестру/источнику модели. Чтобы сразу показать интерфейс и результат без скачивания весов, нажмите «Показать демонстрационный пример без модели».
Проверка на тестовой записи
- Подготовьте короткую запись на русском или казахском длительностью 30–90 секунд. Для проверки поручений произнесите явные фразы вроде «Айжан, подготовь отчёт до пятницы» или «Ертеңге дейін ұсынысты жіберіңіз».
- Откройте веб-страницу, перетащите файл в область загрузки и нажмите «Подготовить протокол».
- Убедитесь, что появились транскрипт, определённый язык, блок краткого содержания и таблица поручений. Сверьте имя, дату и исходную реплику с аудио.
- Нажмите DOCX и PDF и проверьте, что файлы открываются и содержат саммари, таблицу и транскрипт.
- Быстрая проверка API:
curl http://localhost:8000/api/healthдолжен вернуть{"status":"ok","service":"AutoProtocol AI"}. POST/api/processпринимает файл в multipart-полеfileи возвращает JSON.
Образец аудиозаписи не включён в репозиторий. Лучше тестировать собственную запись с согласия участников. Сгенерированный речевой тест не проверит точность распознавания.
Диаризация
По умолчанию ENABLE_DIARIZATION=false: приложение не скачивает отдельную gated-модель и помечает все распознанные реплики как «Говорящий 1». Демонстрационный пример содержит вручную расставленные метки двух говорящих и прямо помечен в интерфейсе; это не результат диаризации. Чтобы включить реальное разделение говорящих:
- Примите условия доступа к
pyannote/speaker-diarization-3.1на Hugging Face. - Создайте локальный
.env, установитеENABLE_DIARIZATION=trueи задайтеHF_TOKENс правом скачать модель. - Установите дополнительную зависимость командой
python -m pip install -r requirements-diarization.txtи запустите обработку с доступом к сети для первоначальной загрузки. Для закрытого контура заранее скачайте и проверьте веса на разрешённой машине, затем настройте локальный путь вDIARIZATION_MODELи перенесите кэш согласно правилам вашей инфраструктуры.
Пакет pyannote.audio требует PyTorch и может быть тяжёлым для установки, поэтому он отделён от основных зависимостей и Docker MVP. В случае ошибки диаризации транскрипт всё равно будет возвращён с одной меткой говорящего; текст ответа API содержит статус/причину.
Архитектура
frontend/— адаптивная страница загрузки и результата; она обращается к тому же FastAPI-серверу.backend/main.py— UI, health-check, приём файла, ограничение размера и endpoint экспорта.backend/pipeline.py— faster-whisper, необязательная локальная pyannote-диаризация, эвристическое извлечение поручений и сбор результата.backend/reports.py— формирование DOCX через python-docx и PDF через ReportLab.data/uploads/— временная область приёма; оригинальный файл удаляется после обработки.
API результата
POST /api/process возвращает JSON с полями id, filename, language, model, summary, transcript[], tasks[], diarization_status, notes. У реплики есть start, end, text, speaker. У поручения есть task, responsible, deadline, source, speaker, timestamp. Ссылки экспорта: /api/results/{id}/protocol.docx и /api/results/{id}/protocol.pdf.
Ограничения прототипа
- Извлечение поручений и заполнение ответственного/срока основаны на простых правилах, а не на языковой модели. Возможны пропуски и ложные срабатывания; поля «Не определён» и «Не указан» нужно проверять.
- Для загруженной записи саммари сейчас является началом транскрипта (до 700 символов), а не семантическим резюме всей встречи. В демо-режиме показывается фиксированный пример саммари.
- Точность русского, казахского и смешанного распознавания зависит от акустики, акцента, качества записи и выбранной модели. Модель может нормализовать или пропускать код-свитчинг.
- Диаризация отключена по умолчанию; даже включённая модель может путать похожие голоса и не знает реальных имён. Отображаемые номера говорящих не являются идентификацией личности.
- Результаты хранятся в памяти одного процесса и исчезают при рестарте; нет учётных записей, очереди задач, авторизации или постоянного хранилища.
- Для production в закрытом контуре необходимо отдельно подготовить и проверить веса моделей и пакеты, отключить исходящий сетевой доступ, задать локальные пути моделей и добавить авторизацию, аудит, очередь, хранение и политику удаления. Сетевые загрузки моделей нужны только на этапе подготовки/первого запуска.
Конфигурация
Скопируйте .env.example в .env. Ключевые параметры: WHISPER_MODEL, WHISPER_DEVICE, WHISPER_COMPUTE_TYPE, MAX_UPLOAD_MB, ENABLE_DIARIZATION, DIARIZATION_MODEL. Секреты храните только в локальном окружении, не коммитьте .env.
Авторы коммитов
История коммитов
- 2026-09-23 16:28Merge pull request #1 from BAITC-Hacks/codex/autoprotocol-fastapi-mvpfberekta
- 2026-09-23 16:24Add deterministic demo mode and stabilize Docker startupfberekta
- 2026-09-23 16:11Build local AutoProtocol AI FastAPI MVPfberekta
- 2026-09-23 14:44Update requirements to include faster-whisperfberekta
- 2026-09-23 14:35Add Streamlit app for meeting protocol generationfberekta
- 2026-09-23 14:35Add requirements for Streamlit and other packagesfberekta
- 2026-09-23 14:34Revise README for AutoProtocol AI projectfberekta
Структура репозитория (17 файлов)
.dockerignore .env.example .gitignore Dockerfile README.md app.py backend/__init__.py backend/main.py backend/pipeline.py backend/reports.py docker-compose.yml frontend/app.js frontend/index.html frontend/styles.css requirements-diarization.txt requirements.txt tests/test_pipeline.py
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.