AAYMA
RU
Войти

ПРОТОКОЛ · Wamigos

Полностью локальный сервис протоколирования совещаний: загрузка или запись аудио/видео в браузере, распознавание русской, казахской и смешанной…

Доведённый продукт
Команда «Wamigos» 20💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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 управляет загрузкой, очередью, статусами и хранением результатов. Интерфейс показывает ход обработки и готовый протокол.

Запуск для жюри

  1. Скачайте репозиторий (на GitHub: Code → Download ZIP) и распакуйте его. Для приватного репозитория нужен доступ к нему.
  2. Установите и запустите Docker Desktop (Windows/macOS) либо Docker Engine с Compose plugin (Linux). Дождитесь, пока Docker запустится.
  3. Откройте терминал в распакованной папке, где лежит 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 · изменения.

Звёзды
⭐ 0
Форки
0
Язык
Java
Последний push
в прошлом месяце
Коммиты
31
Авторы
6
Файлы
203
Ветки
7

Авторы коммитов

Sirio 10Siirio 7lolopenza 6Lolopenza 3yakupovdev 3Vyacheslav 2

История коммитов

  • 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
Ветки (7)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.