О проекте
Команда: Be LIke AI
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Сервис превращает аудиозапись совещания в черновик протокола: транскрипт с таймкодами и говорящими, саммари, решения, риски и поручения с исполнителями, сроками и цитатами, с редактированием и экспортом в PDF/DOCX.
Как устроено
FastAPI с последовательным фоновым обработчиком: FFmpeg → faster-whisper-large-v3 (ASR) → pyannote speaker-diarization-community-1 → выравнивание слов с голосами → Qwen3-8B предлагает имена говорящих, саммари и поручения. Дополнительные ограниченные проходы проверяют полноту извлечения, дубликаты и поля; программный grounding сверяет цитаты с транскриптом. Правки и история в SQLite, экспорт через ReportLab и python-docx; все модели локально на GPU A100.
Ключевые решения
- faster-whisper large-v3
- pyannote diarization
- grounding цитат
- coverage audit
- дедупликация поручений
- обработка неоднозначных сроков
Особенности
Много внимания к достоверности: каждое поручение привязано к точной цитате, неоднозначные сроки не превращаются в выдуманные даты, имена говорящих из смешанного голосового кластера отклоняются. Все модели self-hosted, без внешних API.
Стек
Python · FastAPI · Pydantic · SQLite · FFmpeg · PyTorch · Transformers · React · TypeScript · Vite · ReportLab · python-docx · NVIDIA Brev
Модели
faster-whisper-large-v3 · pyannote speaker-diarization-community-1 · Qwen3-8B
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-cd51b8b1-be-like-ai.
README
README.mdMeetora — AI-ассистент для протоколирования совещаний
Проект команды Be Like AI для хакатона HackAlem AI.
Meetora превращает аудиозапись совещания в проект протокола: расшифровку с таймкодами и говорящими, краткое содержание и список поручений с исполнителями, сроками и ссылками на исходные реплики.
О проекте
После совещания необходимо восстановить договорённости, определить ответственных и подготовить протокол. При ручной обработке часть поручений может потеряться, а проверка формулировок требует повторного прослушивания записи.
Meetora помогает руководителям, секретарям и проектным командам сократить эту работу. Система создаёт черновик, а пользователь проверяет спорные места по аудио, вносит исправления и экспортирует документ.
Результат автоматической обработки требует проверки человеком. Ссылки на реплики позволяют сверить выводы системы с записью.
Что реализовано
Обработка аудио
- Загрузка файлов MP3 и WAV.
- Указание названия, часового пояса и необязательной даты совещания.
- Подтверждение уведомления участников о записи.
- Фоновая обработка с отображением текущего этапа.
- Распознавание речи и формирование сегментов с таймкодами.
- Разделение записи на голоса — диаризация.
- Отметки фрагментов, требующих проверки.
Формирование протокола и поручений
- Краткое содержание, решения, риски и открытые вопросы.
- Извлечение действия, исполнителя, срока и условий выполнения.
- Сохранение цитаты и ссылок на реплики для каждого поручения.
- Повторная проверка транскрипта на пропущенные поручения.
- Проверка возможных дубликатов и полей итоговых карточек.
- Проверка структуры ответа модели и существования источников.
- Сохранение промежуточного результата во время извлечения.
- Предположение имён говорящих по обращениям и самопредставлениям.
- Сохранение неоднозначных сроков без выдумывания календарной даты.
Проверка и работа с результатом
- Просмотр расшифровки и прослушивание исходного аудио.
- Исправление имён говорящих.
- Редактирование поручений, исполнителей и календарных сроков.
- Статусы поручений: открыто, в работе, выполнено.
- Отметка проверки поручения и вычисление просрочки.
- Сохранение изменений и истории правок в SQLite.
- Экспорт готового результата в PDF и DOCX.
- Доступ к приложению по общему коду команды.
Предполагаемое имя говорящего остаётся гипотезой до подтверждения пользователем. Определение имени по контексту не является биометрической идентификацией человека.
Как работает решение
- Пользователь входит в приложение и загружает запись совещания.
- Backend сохраняет файл и ставит совещание в очередь.
- FFmpeg преобразует аудио в формат для обработки.
- Whisper распознаёт речь, а pyannote выделяет интервалы разных голосов.
- Система сопоставляет слова с голосами и формирует транскрипт с таймкодами.
- Qwen предлагает имена говорящих, создаёт краткое содержание и извлекает поручения.
- Дополнительные проходы проверяют полноту извлечения, возможные повторы и поля поручений. Программные проверки сверяют цитаты с транскриптом.
- Пользователь проверяет результат, исправляет ошибки и подтверждает сведения.
- Система сохраняет правки и формирует PDF или DOCX.
Технологии
| Компонент | Технологии |
|---|---|
| Backend | Python, FastAPI, Uvicorn |
| Проверка данных | Pydantic |
| Хранение | SQLite, файловая система |
| Подготовка аудио | FFmpeg |
| Распознавание речи | Systran/faster-whisper-large-v3, faster-whisper 1.2.1, CTranslate2 4.6.0 |
| Диаризация | pyannote/speaker-diarization-community-1, pyannote.audio 4.0.3 |
| Извлечение поручений | Qwen/Qwen3-8B, Transformers 4.57.1 |
| Вычисления моделей | PyTorch 2.8.0, torchaudio 2.8.0, TorchCodec 0.7.0, NVIDIA CUDA |
| Экспорт документов | ReportLab, python-docx |
| Frontend | React 19, TypeScript, Vite 7, lucide-react |
| Проверки backend | pytest, HTTPX, pypdf |
| Проверки frontend | Vitest, Playwright |
| Получение моделей | Hugging Face Hub |
| Демонстрационная инфраструктура | NVIDIA Brev, GPU NVIDIA A100 40 GB |
Основные версии библиотек обработки закреплены в requirements-inference.txt.
Исходники интерфейса находятся в ветке codex/frontend. В текущей ветке backend предусмотрена раздача собранного интерфейса из frontend/dist.
Внешние API распознавания речи и генерации текста не используются: модели выполняются на сервере приложения.
Архитектура
flowchart TD
UI["Веб-интерфейс React"] --> API["FastAPI: загрузка, доступ, правки, экспорт"]
API --> STORE["SQLite и аудиофайлы"]
API --> WORKER["Последовательный фоновый обработчик"]
WORKER --> AUDIO["FFmpeg → Whisper → pyannote"]
AUDIO --> TEXT["Транскрипт с голосами и таймкодами"]
TEXT --> LLM["Qwen: содержание, имена, поручения"]
LLM --> CHECK["Проверка цитат, полноты и полей"]
CHECK --> STORE
STORE --> API
API --> EXPORT["PDF / DOCX"]
Один фоновый обработчик последовательно выполняет задачи. Скрипт запуска использует один процесс Uvicorn, чтобы не создавать несколько независимых очередей и копий моделей на GPU.
Структура репозитория
backend/
app.py HTTP API, авторизация, загрузка и правки
worker.py Очередь и этапы обработки
processing.py Работа моделей и извлечение результата
inference.py Подготовка ссылок и управление генерацией
grounding.py Проверка цитат и источников поручений
extraction_audit.py Проверки полноты и объединения поручений
schemas.py Модели данных
deadlines.py Обработка сроков и просрочки
storage.py SQLite и история изменений
exports.py Создание PDF и DOCX
scripts/ Установка, модели, запуск и диагностика
tests/ Автоматические проверки backend
docs/ Контракт API и технические инструкции
requirements.txt Зависимости приложения
requirements-inference.txt
Зависимости моделей
requirements-dev.txt Зависимости тестирования
.env.example Пример переменных окружения
Дополнительно при установке создаются:
models/ Локальные веса моделей
data/ База данных, записи и результаты проверок
frontend/dist/ Собранный веб-интерфейс
Установка и запуск
1. Подготовить сервер и получить код
Инструкция ниже предназначена для Bash в Ubuntu на GPU-сервере. В документации проекта зафиксирована проверка моделей на NVIDIA A100-SXM4-40GB. Для окружения используется Python 3.12; для сборки интерфейса требуется Node.js 22.20+ и npm.
Драйвер NVIDIA должен быть установлен, а команда nvidia-smi — видеть GPU.
git clone https://github.com/BAITC-Hacks/hack-cd51b8b1-be-like-ai.git
cd hack-cd51b8b1-be-like-ai
Если репозиторий закрытый, потребуется доступ к нему.
2. Установить зависимости
Из корня репозитория:
HACKALEM_ROOT="$PWD" bash scripts/setup_brev.sh
source scripts/activate_env.sh
python -m pip install -r requirements.txt
python -m pip check
Скрипт устанавливает системные зависимости, создаёт .venv, устанавливает PyTorch с CUDA и библиотеки моделей, затем проверяет доступность GPU.
В каждом новом терминале перед работой с моделями выполняйте:
source scripts/activate_env.sh
3. Скачать модели
На Hugging Face необходимо получить доступ к модели pyannote/speaker-diarization-community-1, принять её условия и создать токен с правом чтения.
Войти интерактивно:
hf auth login
Затем скачать веса:
python scripts/download_models.py
Скрипт создаёт каталоги:
models/asr;models/diarization;models/llm.
Для каждого набора весов сохраняется файл hackalem-model.json с идентификатором репозитория и SHA скачанной версии.
Повторная загрузка отдельной модели:
python scripts/download_models.py --only diarization
Также доступны значения asr и llm. Интернет необходим на этапе установки и скачивания весов.
4. Проверить модели
До запуска API:
python scripts/check_models.py
Ожидаемый итог успешной проверки:
MODEL CHECK OK
Этот сценарий проверяет инициализацию ASR и диаризации на тишине, а извлечение поручения — на синтетическом тексте. Он не измеряет качество распознавания реальной речи.
Для отдельной проверки собственного аудио:
python scripts/check_models.py --audio /полный/путь/test.wav
Не запускайте дополнительную копию моделей одновременно с работающим конвейером на том же GPU.
5. Собрать интерфейс
Для свежего клона текущей ветки получить каталог интерфейса из ветки второго участника:
git archive origin/codex/frontend frontend | tar -x
Собрать интерфейс для настоящего API:
cd frontend
npm ci
VITE_API_BASE_URL=/api VITE_USE_MOCKS=false npm run build
cd ..
Результат должен находиться в frontend/dist, включая frontend/dist/index.html.
Backend подключает этот каталог при старте. Если сборка добавлена после запуска сервера, backend необходимо перезапустить.
6. Задать доступ и запустить приложение
Для локальной проверки через HTTP:
read -rsp 'Код доступа к приложению: ' HACKALEM_ACCESS_TOKEN
printf '\n'
export HACKALEM_ACCESS_TOKEN
export HACKALEM_SECURE_COOKIE=0
bash scripts/run_backend.sh
Открыть локальное приложение и ввести заданный код.
Для размещения за HTTPS, в том числе через Brev Secure Links, перед запуском установить:
export HACKALEM_SECURE_COOKIE=1
Код приложения и токен Hugging Face — разные секреты. Они не должны попадать в Git или переменные сборки frontend.
Для сохранения процесса после отключения терминала можно запускать приложение внутри tmux.
7. Проверить API
В другом терминале:
curl http://127.0.0.1:8000/api/health
При наличии всех весов ответ имеет вид:
{
"status": "ok",
"models": {
"asr": true,
"diarization": true,
"extraction": true
}
}
Этот endpoint проверяет наличие локальных файлов моделей, а не качество их ответов.
После входа схема API доступна по адресу /docs. Если интерфейс не собран, корневая страница сообщает о готовности backend.
Настройки окружения
Приложение не загружает .env автоматически. Переменные из .env.example необходимо передать через shell или менеджер процесса.
| Переменная | Назначение |
|---|---|
HACKALEM_ACCESS_TOKEN | Общий код доступа к приложению |
HACKALEM_SECURE_COOKIE | 1 для HTTPS, 0 для локального HTTP |
HACKALEM_DEVICE | Устройство вычислений; по умолчанию cuda |
HACKALEM_DATA_DIR | Каталог данных |
HACKALEM_MODEL_DIR | Каталог весов |
HACKALEM_LLM_TIMEOUT_SECONDS | Общий бюджет времени извлечения и проверок |
HACKALEM_ASR_LANGUAGE | Необязательная подсказка языка, например ru |
HACKALEM_ASR_HOTWORDS | Необязательная подсказка терминов для ASR |
HACKALEM_NUM_SPEAKERS | Заранее известное число говорящих |
HACKALEM_CORS_ORIGINS | Разрешённые адреса интерфейса при разработке |
Как проверить решение
Сценарий для жюри
-
Подготовить короткую MP3/WAV-запись с двумя реальными голосами и явным поручением. Например:
— Алия Сериковна, подготовьте отчёт по закупкам до 25 сентября 2026 года.
— Хорошо, подготовлю. -
Войти в приложение, загрузить файл и подтвердить уведомление участников. Дату совещания указывать только если она известна.
-
Дождаться завершения обработки. До этого транскрипт и промежуточные поручения могут отображаться как черновик.
-
Сверить результат с записью:
- действие — подготовить отчёт по закупкам;
- исполнитель — Алия Сериковна;
- срок — 25 сентября 2026 года;
- цитата и таймкод относятся к соответствующей реплике;
- ответ исполнителя не превратился в отдельное дублирующее поручение.
-
Проверить разделение голосов. Если система предложила имя, подтвердить его только после прослушивания.
-
Изменить описание или статус поручения, обновить страницу и убедиться, что изменение сохранено.
-
Скачать PDF и DOCX. Проверить, что документы содержат сохранённые правки и читаемый русский текст.
Это сценарий проверки, а не обещание безошибочного результата на любой записи.
Проверка через API
Загрузка файла из терминала, где задан HACKALEM_ACCESS_TOKEN:
curl http://127.0.0.1:8000/api/meetings \
-H "Authorization: Bearer $HACKALEM_ACCESS_TOKEN" \
-F 'title=Проверка жюри' \
-F 'timezone=Asia/Almaty' \
-F 'participants_notified=true' \
-F 'file=@/полный/путь/test.wav'
Ответ содержит meeting_id. Основные endpoints:
| Метод и путь | Назначение |
|---|---|
GET /api/health | Проверка наличия моделей |
POST /api/session | Вход по коду |
GET /api/meetings | Список совещаний |
POST /api/meetings | Загрузка записи |
GET /api/meetings/{id} | Состояние обработки и результат |
GET /api/meetings/{id}/audio | Исходная запись |
PATCH /api/meetings/{id}/tasks/{task_id} | Изменение поручения |
PATCH /api/meetings/{id}/speakers/{speaker_id} | Изменение имени говорящего |
GET /api/meetings/{id}/export?format=pdf | Скачать PDF |
GET /api/meetings/{id}/export?format=docx | Скачать DOCX |
Редактирование и экспорт доступны после перехода совещания в статус ready.
Автоматические проверки
Backend можно проверять без GPU и скачивания моделей. В отдельном окружении Python:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-dev.txt
python -m pytest -q
Тесты покрывают API, хранение, доступ, правки, экспорт, сроки и правила проверки результатов. Тестовый обработчик FakeEngine используется в тестах; production не переключается на него при ошибке модели.
Проверки интерфейса из каталога frontend:
npm test
npm run build
Для браузерных тестов:
npx playwright install chromium
npm run test:e2e
Прохождение программных тестов не подтверждает точность моделей на реальных совещаниях.
Данные и интеграции
Входные данные
- Аудиозапись пользователя в MP3 или WAV.
- Название совещания.
- Часовой пояс.
- Необязательная дата и время совещания.
- Подтверждение уведомления участников о записи.
Исходные записи организаторов и эталонные протоколы не включены в репозиторий. Эталонный протокол не используется как вход для генерации результата.
Хранение
- Аудиофайлы сохраняются в каталоге данных.
- Совещания, результаты и история правок хранятся в SQLite.
- Веса моделей находятся в
models/. - Каталоги данных, моделей и локальные секреты исключены из Git.
Внешние сервисы
- Hugging Face Hub — получение весов при установке.
- NVIDIA Brev — облачная VM с GPU и защищённые ссылки для демонстрации.
- HTTP API приложения — взаимодействие frontend и backend.
ASR, диаризация и генерация выполняются локальными моделями на выбранном сервере. При размещении в Brev этим сервером является облачная VM.
Скрипт запуска включает HF_HUB_OFFLINE=1 и отключает телеметрию Hugging Face и pyannote. Эти настройки не заменяют сетевую изоляцию.
Ограничения текущей версии
- Максимальный размер записи — 100 MiB, максимальная длительность — 60 минут.
- Входной контекст LLM ограничен 20 000 токенов. Допустимая длительность аудио не гарантирует, что любой транскрипт поместится в контекст.
- Совещания обрабатываются последовательно. Распределённой очереди и масштабирования на несколько обработчиков нет.
- Распознавание может ошибаться в именах, числах, названиях и профессиональных терминах.
- Диаризация может объединить разных людей или разделить голос одного человека на несколько говорящих.
- Предположения об именах требуют подтверждения. Базы голосовых отпечатков нет.
- Неоднозначные и событийные сроки могут остаться без календарной даты.
- Проверка цитаты подтверждает её наличие в транскрипте, но не гарантирует правильную интерпретацию поручения.
- Нет редактирования самого транскрипта через API.
- Нет подключения ботов к Teams, Zoom или Google Meet, записи с микрофона и обработки прямого эфира.
- Нет автоматических рассылок, напоминаний, интеграции с СЭД и внешними таск-трекерами.
- Используется общий код доступа: отдельных пользовательских ролей и изоляции организаций нет.
- Не реализованы политика удаления данных через интерфейс и шифрование диска средствами приложения.
- Доступность демонстрации зависит от работающей GPU-VM.
Методика проверки качества описана в docs/QUALITY_VALIDATION.md, контракт API — в docs/API_CONTRACT.md.
Развёрнутая версия
Адрес зафиксирован в документации репозитория. Ссылка защищена доступом Brev; после него приложение может запросить отдельный код команды. Для демонстрации жюри владельцу сервера необходимо предоставить соответствующий доступ.
Авторы коммитов
История коммитов
- 2026-09-23 17:55Update README.mdWhiteYouBro
- 2026-09-23 17:55final commitWhiteYouBro
- 2026-09-23 17:32Retain validated evidence quotes during task revisionsWhiteYouBro
- 2026-09-23 17:29Allow bounded merge explanations and budget final field verificationWhiteYouBro
- 2026-09-23 17:26Verify task pairs and individual fields in bounded focused passesWhiteYouBro
- 2026-09-23 17:18Require an acceptance reply for adjacent-task consolidationWhiteYouBro
- 2026-09-23 17:16Constrain task consolidation to plausible duplicate pairsWhiteYouBro
- 2026-09-23 17:13fix(frontend): improve draft and evidence quality reviewZhakupbek0v
Все коммиты (31)
- 2026-09-23 17:11Consolidate dialogue duplicates while retaining every independent taskWhiteYouBro
- 2026-09-23 17:04Reject speaker names inferred from a mixed voice clusterWhiteYouBro
- 2026-09-23 17:00Scope coverage edits to visible sources and reconcile dialogue actionsWhiteYouBro
- 2026-09-23 16:52style(frontend): fix spacing in mobile welcome textZhakupbek0v
- 2026-09-23 16:46fix: tolerate alignment spaces before sentence punctuationWhiteYouBro
- 2026-09-23 16:38fix: reuse exact evidence repair during coverage auditsWhiteYouBro
- 2026-09-23 16:33fix: accept audited context while requiring complete primary coverageWhiteYouBro
- 2026-09-23 16:25fix: repair invalid task quotes without regenerating the full protocolWhiteYouBro
- 2026-09-23 16:18fix: audit every transcript window and ground tasks in exact quotesWhiteYouBro
- 2026-09-23 15:52style(frontend): improve meeting title readabilityZhakupbek0v
- 2026-09-23 15:32fix: bound extraction and identify speakers before protocol generationWhiteYouBro
- 2026-09-23 15:19Update FRONTEND_INTEGRATION.mdWhiteYouBro
- 2026-09-23 15:05Merge remote-tracking branch 'origin/main' into codex/frontendZhakupbek0v
- 2026-09-23 15:02docs: hand off Brev server frontend integrationWhiteYouBro
- 2026-09-23 14:53fix(frontend): preserve task changes and recover authenticated partial resultsZhakupbek0v
- 2026-09-23 14:48docs: record successful A100 model smoke checkWhiteYouBro
- 2026-09-23 14:43fix: update pyannote for Lightning checkpoint compatibilityWhiteYouBro
- 2026-09-23 14:40Merge remote-tracking branch 'origin/main' into codex/frontendZhakupbek0v
- 2026-09-23 14:38docs: review frontend integration and assign follow-up tasksWhiteYouBro
- 2026-09-23 14:28second commitWhiteYouBro
- 2026-09-23 14:21chore(branding): rename product to Meetora by Be Like AIZhakupbek0v
- 2026-09-23 14:10feat(frontend): add meeting protocol review workspaceZhakupbek0v
- 2026-09-23 14:04First commitWhiteYouBro
Структура репозитория (41 файлов)
.env.example .gitattributes .gitignore README.md backend/__init__.py backend/app.py backend/config.py backend/deadlines.py backend/exports.py backend/extraction_audit.py backend/grounding.py backend/inference.py backend/processing.py backend/schemas.py backend/storage.py backend/worker.py docs/ANALYSIS.md docs/API_CONTRACT.md docs/BREV_SETUP.md docs/DEMO_CHECKLIST.md docs/EXTRACTION_TROUBLESHOOTING.md docs/FRONTEND_INTEGRATION.md docs/FRONTEND_QUALITY_TASKS.md docs/FRONTEND_REVIEW.md docs/GPU_VALIDATION.md docs/QUALITY_VALIDATION.md docs/TEAMMATE_TASK.md requirements-dev.txt requirements-inference.txt requirements.txt scripts/activate_env.sh scripts/check_models.py scripts/download_models.py scripts/evaluate_quality.py scripts/retry_extraction.py scripts/run_backend.sh scripts/server_maintenance.py scripts/setup_brev.sh tests/test_backend.py tests/test_inference.py tests/test_quality.py
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.