О проекте
Команда: Wamigos
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Полностью локальный сервис протоколирования совещаний: загрузка или запись аудио/видео в браузере, распознавание русской, казахской и смешанной речи, разделение по спикерам, извлечение поручений, исполнителей, сроков и проблем, экспорт в PDF и DOCX.
Как устроено
FFmpeg приводит запись к WAV 16 кГц mono → faster-whisper large-v3 даёт сегменты с таймкодами → SpeechBrain ECAPA разделяет спикеров → Speaker Resolver привязывает имена из контекста → Ollama/Qwen строит summary, поручения, сроки и проблемы (есть модули нормализации дедлайнов, привязки evidence и верификации задач). Python FastAPI AI-сервис вызывает Java Spring Boot backend с очередью, статусами и PostgreSQL, Next.js показывает протокол. Всё поднимается одной командой docker compose, есть GPU-override.
Ключевые решения
- faster-whisper large-v3
- SpeechBrain ECAPA diarization
- speaker name resolution
- LLM structured extraction
- deadline normalization
- task verification
- evidence binding
- job queue
Особенности
Ни аудио, ни текст не уходят во внешние AI API, ключи не нужны. Запуск для жюри одной командой docker compose up с CPU по умолчанию и опциональным NVIDIA-override. Извлечение задач идёт в несколько шагов: верификатор, валидатор сырых дедлайнов, привязка к фактам. Есть скрипты оценки на размеченных протоколах.
Стек
Python · FastAPI · Java 21 · Spring Boot · PostgreSQL · Next.js · TypeScript · FFmpeg · Ollama · Docker Compose
Модели
faster-whisper large-v3 · SpeechBrain ECAPA · Qwen via Ollama
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-40793dbe-wamigos.
README
README.mdПРОТОКОЛ · Wamigos
Локальный сервис для протокола встречи: загружает MP3/MP4 или записывает звук в браузере, распознаёт речь, выделяет участников, поручения и проблемы, формирует PDF/DOCX. Аудио и текст не отправляются во внешние AI API.
Основные возможности
- Загрузка готовой аудио- или видеозаписи и запись совещания непосредственно в браузере.
- Распознавание русской, казахской и смешанной речи с временными метками.
- Разделение реплик разных участников и определение имени говорящего, когда оно следует из контекста разговора.
- Автоматическое выделение поручений, исполнителей, постановщиков, сроков и обсуждавшихся проблем.
- Краткое содержание встречи и структурированная расшифровка по спикерам.
- Просмотр истории и статуса обработки записей без регистрации.
- Экспорт готового протокола в PDF и DOCX.
- Полностью локальная AI-обработка: записи, расшифровки и протоколы не передаются во внешние AI API.
Как обрабатывается запись
Аудио/видео или запись из браузера
↓
FFmpeg: WAV, mono, 16 кГц
↓
faster-whisper large-v3: текст, сегменты и временные метки
↓
SpeechBrain ECAPA: разделение реплик по спикерам
↓
Speaker Resolver: привязка найденных имён к спикерам по контексту
↓
Ollama + Qwen: summary, поручения, сроки и проблемы
↓
Spring Boot + PostgreSQL: хранение результата и управление обработкой
↓
Next.js: просмотр протокола и экспорт в PDF/DOCX
Python AI Service выполняет распознавание и анализ одной записи, а Java backend управляет загрузкой, очередью, статусами и хранением результатов. Интерфейс показывает ход обработки и готовый протокол.
Запуск для жюри
- Скачайте репозиторий (на GitHub: Code → Download ZIP) и распакуйте его. Для приватного репозитория нужен доступ к нему.
- Установите и запустите Docker Desktop (Windows/macOS) либо Docker Engine с Compose plugin (Linux). Дождитесь, пока Docker запустится.
- Откройте терминал в распакованной папке, где лежит
compose.yaml(на Windows подойдёт PowerShell), и выполните:
docker compose up --build --wait
Откройте http://localhost:3000. Всё остальное — Java, Python, PostgreSQL, Ollama и модели — Docker запустит сам. Отдельно устанавливать Ollama, Java, Python или создавать .env не нужно. Для первой сборки и загрузки публичных моделей нужен интернет и свободное место на диске (ориентир — 30 ГБ); учётные записи и API-ключи не нужны. Модели сохраняются локально. На CPU первый анализ может идти долго; для проверки возьмите короткую запись (10–20 секунд) с разборчивой речью. GPU не обязателен.
Если есть NVIDIA GPU и доступ к GPU из Docker, вместо команды выше можно запустить ускоренный режим:
docker compose -f compose.yaml -f compose.gpu.yaml up --build --wait
Как проверить
Загрузите запись или запишите её микрофоном → дождитесь статуса «Готово» → проверьте расшифровку, говорящих, поручения и проблемы → скачайте PDF или Word. До конца загрузки не закрывайте вкладку. Лимит: 500 МБ и 60 минут; записи удаляются через 24 часа. Регистрация не требуется.
Если порт занят, создайте .env по образцу: для 3000 поменяйте FRONTEND_PORT и FRONTEND_ORIGIN, для 8081 — BACKEND_PORT и API_PUBLIC_URL, для 8000 — AI_PORT. Затем повторите запуск. Если что-то не стартовало, посмотрите docker compose ps и docker compose logs --tail=100. Остановить сервисы: docker compose down (данные сохраняются).
Скриншоты
Главная: загрузка файла, запись с микрофона и последние встречи.

Запись в очереди.

Распознавание речи и подготовка протокола.

Готовый протокол: итоги встречи, расшифровка и экспорт PDF/Word.

Поручения с исполнителями и сроками, а также озвученные проблемы.

Что внутри
Next.js → Java 21 / Spring Boot → PostgreSQL и Python / FastAPI → локальные faster-whisper, SpeechBrain ECAPA и Ollama / Qwen. Обработка идёт в контейнерах на компьютере проверяющего; готовый публичный сервер для проверки не требуется.
Подробнее: frontend · backend · AI service · изменения.
Авторы коммитов
История коммитов
- 2026-09-23 17:54Document product capabilities and AI pipelinelolopenza
- 2026-09-23 17:50Add application screenshots to READMESiirio
- 2026-09-23 17:42Force HTTP 1.1 for AI transportlolopenza
- 2026-09-23 17:40Force HTTP 1.1 for AI transportlolopenza
- 2026-09-23 17:27Make local jury setup work without NVIDIA GPUSirio
- 2026-09-23 17:26Clarify port overrides for jury setupSirio
- 2026-09-23 17:26Document portable jury startupSirio
- 2026-09-23 17:25Simplify jury setup to one Docker commandSirio
Все коммиты (31)
- 2026-09-23 17:25Add optional NVIDIA GPU Compose overrideSirio
- 2026-09-23 17:25Match example environment to portable CPU startupSirio
- 2026-09-23 17:25Allow full stack CPU startup by defaultSirio
- 2026-09-23 17:13Merge pull request #8 from BAITC-Hacks/codex/full-stack-ai-integrationLolopenza
- 2026-09-23 17:11Integrate tokenless local AI stacklolopenza
- 2026-09-23 16:41Merge pull request #7 from BAITC-Hacks/backend/python-ai-http-integrationVyacheslav
- 2026-09-23 16:38Integrate backend with Python AI serviceyakupovdev
- 2026-09-23 16:37Merge pull request #6 from BAITC-Hacks/codex/ai-service-local-extractionLolopenza
- 2026-09-23 16:36Build local meeting intelligence and speech pipelinelolopenza
- 2026-09-23 16:05Merge pull request #5 from BAITC-Hacks/codex/jury-quickstartSirio
- 2026-09-23 16:04Add one-command launch and jury READMESiirio
- 2026-09-23 15:51Merge pull request #4 from BAITC-Hacks/codex/frontend-protokolSirio
- 2026-09-23 15:47Remove frontend mock data and use Java APISiirio
- 2026-09-23 15:39Polish meeting UI and align backend errorsSiirio
- 2026-09-23 15:35Merge pull request #3 from BAITC-Hacks/codex/frontend-protokolSirio
- 2026-09-23 15:34Add frontend API and recording foundationSiirio
- 2026-09-23 15:34Build meeting upload and protocol screensSiirio
- 2026-09-23 15:29Merge pull request #2 from BAITC-Hacks/backend/meeting-processing-apiVyacheslav
- 2026-09-23 15:26Implement meeting processing backendyakupovdev
- 2026-09-23 15:21Merge pull request #1 from BAITC-Hacks/codex/ai-service-local-extractionLolopenza
- 2026-09-23 15:20Add local LLM transcript analysis servicelolopenza
- 2026-09-23 13:56add gitignoreyakupovdev
- 2026-09-23 13:46Add project development rulesSiirio
Структура репозитория (203 файлов)
.env.example .gitignore AGENTS.md BACKEND.md CHANGELOG.md FRONTEND.md GIT.md PROJECT_STRUCTURE.md README.md ai-service/.dockerignore ai-service/.env.example ai-service/Dockerfile ai-service/README.md ai-service/app/__init__.py ai-service/app/api.py ai-service/app/audio_pipeline.py ai-service/app/config.py ai-service/app/intelligence/deadline_normalizer.py ai-service/app/intelligence/deadline_raw_validator.py ai-service/app/intelligence/evidence_binder.py ai-service/app/intelligence/extracted_task.py ai-service/app/intelligence/fact_evidence.py ai-service/app/intelligence/meeting_facts.py ai-service/app/intelligence/meeting_facts_extractor.py ai-service/app/intelligence/problem_candidate.py ai-service/app/intelligence/segment_tagger.py ai-service/app/intelligence/speaker_attribution.py ai-service/app/intelligence/speaker_resolver.py ai-service/app/intelligence/summary.py ai-service/app/intelligence/summary_selection.py ai-service/app/intelligence/task_verdict.py ai-service/app/intelligence/task_verification.py ai-service/app/intelligence/task_verifier.py ai-service/app/main.py ai-service/app/pipeline.py ai-service/app/prompts/meeting_facts.txt ai-service/app/prompts/summary.txt ai-service/app/prompts/task_verifier.txt ai-service/app/providers/llm_base.py ai-service/app/providers/local_llm_provider.py ai-service/app/providers/structured_llm.py ai-service/app/schemas.py ai-service/app/service_error.py ai-service/app/speech/__init__.py ai-service/app/speech/audio_preprocessor.py ai-service/app/speech/diarization.py ai-service/app/speech/models.py ai-service/app/speech/pipeline.py ai-service/app/speech/transcript_builder.py ai-service/app/speech/whisper_asr.py ai-service/evaluation/data/protocol1.json ai-service/evaluation/data/protocol2.json ai-service/evaluation/run_edge_cases.py ai-service/evaluation/run_protocols.py ai-service/requirements.txt ai-service/tests/test_contracts.py ai-service/tests/test_deadlines.py ai-service/tests/test_intelligence.py backend/.dockerignore backend/Dockerfile backend/README.md backend/THIRD_PARTY_NOTICES.md backend/docker-compose.yml backend/pom.xml backend/src/main/java/kz/hackalem/wamigos/BackendApplication.java backend/src/main/java/kz/hackalem/wamigos/analysis/adapter/HttpMeetingAnalysisAdapter.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/AnalysisProblem.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/AnalysisSegment.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/AnalysisSpeaker.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/AnalysisTask.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/MeetingAnalysisOutput.java backend/src/main/java/kz/hackalem/wamigos/analysis/dto/MeetingAnalysisRequest.java backend/src/main/java/kz/hackalem/wamigos/analysis/health/AiServiceHealthIndicator.java backend/src/main/java/kz/hackalem/wamigos/analysis/mapper/AiAnalysisResponseMapper.java backend/src/main/java/kz/hackalem/wamigos/analysis/mapper/AiHttpErrorMapper.java backend/src/main/java/kz/hackalem/wamigos/analysis/mapper/MeetingAnalysisResultMapper.java backend/src/main/java/kz/hackalem/wamigos/analysis/port/MeetingAnalysisException.java backend/src/main/java/kz/hackalem/wamigos/analysis/port/MeetingAnalysisPort.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiAnalysisResponse.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiErrorResponse.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiProblemResponse.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiSegmentResponse.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiSpeakerResponse.java backend/src/main/java/kz/hackalem/wamigos/analysis/transport/AiTaskResponse.java backend/src/main/java/kz/hackalem/wamigos/config/AiClientConfiguration.java backend/src/main/java/kz/hackalem/wamigos/config/AiProperties.java backend/src/main/java/kz/hackalem/wamigos/config/ApplicationConfiguration.java backend/src/main/java/kz/hackalem/wamigos/config/CleanupProperties.java backend/src/main/java/kz/hackalem/wamigos/config/CorsProperties.java backend/src/main/java/kz/hackalem/wamigos/config/ExportProperties.java backend/src/main/java/kz/hackalem/wamigos/config/ProcessingProperties.java backend/src/main/java/kz/hackalem/wamigos/config/QueueProperties.java backend/src/main/java/kz/hackalem/wamigos/config/StorageProperties.java backend/src/main/java/kz/hackalem/wamigos/config/UploadProperties.java backend/src/main/java/kz/hackalem/wamigos/config/WebConfiguration.java backend/src/main/java/kz/hackalem/wamigos/error/ApiErrorResponse.java backend/src/main/java/kz/hackalem/wamigos/error/ApiException.java backend/src/main/java/kz/hackalem/wamigos/error/ConflictException.java backend/src/main/java/kz/hackalem/wamigos/error/ErrorCode.java backend/src/main/java/kz/hackalem/wamigos/error/ExportException.java backend/src/main/java/kz/hackalem/wamigos/error/FieldErrorResponse.java backend/src/main/java/kz/hackalem/wamigos/error/FileTooLargeException.java backend/src/main/java/kz/hackalem/wamigos/error/GlobalExceptionHandler.java backend/src/main/java/kz/hackalem/wamigos/error/NotFoundException.java backend/src/main/java/kz/hackalem/wamigos/error/QueueFullException.java backend/src/main/java/kz/hackalem/wamigos/error/StorageException.java backend/src/main/java/kz/hackalem/wamigos/error/UnsupportedMediaTypeException.java backend/src/main/java/kz/hackalem/wamigos/error/ValidationException.java backend/src/main/java/kz/hackalem/wamigos/export/MeetingExportProcessor.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportFormat.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportModel.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportModelMapper.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportProblem.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportTask.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportTranscriptLine.java backend/src/main/java/kz/hackalem/wamigos/export/model/ExportedDocument.java backend/src/main/java/kz/hackalem/wamigos/export/renderer/DocxExportRenderer.java backend/src/main/java/kz/hackalem/wamigos/export/renderer/ExportRenderer.java backend/src/main/java/kz/hackalem/wamigos/export/renderer/PdfExportRenderer.java backend/src/main/java/kz/hackalem/wamigos/export/renderer/PdfTextWriter.java backend/src/main/java/kz/hackalem/wamigos/meeting/controller/MeetingController.java backend/src/main/java/kz/hackalem/wamigos/meeting/controller/MeetingExportController.java backend/src/main/java/kz/hackalem/wamigos/meeting/domain/MeetingJob.java backend/src/main/java/kz/hackalem/wamigos/meeting/domain/MeetingSource.java backend/src/main/java/kz/hackalem/wamigos/meeting/domain/MeetingStatus.java backend/src/main/java/kz/hackalem/wamigos/meeting/domain/ProcessingStage.java backend/src/main/java/kz/hackalem/wamigos/meeting/domain/SegmentTag.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/CreateMeetingJobRequest.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/CreateMeetingRequest.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/MeetingCreatedResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/MeetingFailureResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/MeetingJobDto.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/MeetingResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/MeetingResultResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/ProblemResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/SegmentResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/SpeakerResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/dto/TaskResponse.java backend/src/main/java/kz/hackalem/wamigos/meeting/mapper/MeetingJobMapper.java backend/src/main/java/kz/hackalem/wamigos/meeting/processor/MeetingProcessor.java backend/src/main/java/kz/hackalem/wamigos/meeting/repository/MeetingJobRepository.java backend/src/main/java/kz/hackalem/wamigos/meeting/service/AccessTokenManager.java backend/src/main/java/kz/hackalem/wamigos/meeting/service/MeetingJobService.java backend/src/main/java/kz/hackalem/wamigos/meeting/service/MeetingJobServiceImpl.java backend/src/main/java/kz/hackalem/wamigos/meeting/validation/MediaTypeDetector.java backend/src/main/java/kz/hackalem/wamigos/meeting/validation/MeetingRequestValidator.java backend/src/main/java/kz/hackalem/wamigos/meeting/validation/MeetingResultValidator.java backend/src/main/java/kz/hackalem/wamigos/storage/adapter/LocalStorageAdapter.java backend/src/main/java/kz/hackalem/wamigos/storage/port/StoragePort.java backend/src/main/java/kz/hackalem/wamigos/worker/MeetingMaintenanceWorker.java backend/src/main/java/kz/hackalem/wamigos/worker/MeetingProcessingWorker.java backend/src/main/resources/application.yml backend/src/main/resources/db/migration/V1__create_meeting_jobs.sql backend/src/main/resources/db/migration/V2__allow_zero_meeting_duration.sql backend/src/test/java/kz/hackalem/wamigos/PostgresIntegrationTest.java backend/src/test/java/kz/hackalem/wamigos/TestMediaFixtures.java backend/src/test/java/kz/hackalem/wamigos/analysis/AiTestResponses.java backend/src/test/java/kz/hackalem/wamigos/analysis/HttpMeetingAnalysisAdapterTest.java backend/src/test/java/kz/hackalem/wamigos/meeting/AiConnectionRefusedIntegrationTest.java backend/src/test/java/kz/hackalem/wamigos/meeting/AiFailureIntegrationTest.java backend/src/test/java/kz/hackalem/wamigos/meeting/MeetingApiIntegrationTest.java backend/src/test/java/kz/hackalem/wamigos/meeting/MeetingProcessorTest.java backend/src/test/java/kz/hackalem/wamigos/meeting/MeetingResultValidatorTest.java backend/src/test/java/kz/hackalem/wamigos/worker/QueueTimeoutCleanupIntegrationTest.java compose.gpu.yaml compose.yaml docs/screenshots/home.jpg docs/screenshots/processing.jpg docs/screenshots/protocol-details.jpg docs/screenshots/protocol.jpg docs/screenshots/queued.jpg docs/superpowers/specs/2026-09-23-frontend-design.md frontend/.dockerignore frontend/.env.example frontend/.gitignore frontend/Dockerfile frontend/README.md frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/src/app/globals.css frontend/src/app/layout.tsx frontend/src/app/meetings/[id]/page.tsx frontend/src/app/meetings/page.tsx frontend/src/app/page.tsx frontend/src/components/dialog.tsx frontend/src/components/icons.tsx frontend/src/components/shell.tsx frontend/src/features/meetings/actions.tsx frontend/src/features/meetings/export-buttons.tsx frontend/src/features/meetings/list.tsx frontend/src/features/meetings/provider.tsx frontend/src/features/meetings/result.tsx frontend/src/features/recording/use-recorder.ts frontend/src/lib/api.ts frontend/src/lib/config.ts frontend/src/lib/errors.ts frontend/src/lib/format.ts frontend/src/lib/storage.ts frontend/src/lib/types.ts frontend/tsconfig.json skills/debug/SKILL.md skills/review-against-task/SKILL.md
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.