О проекте
Команда: MyAdventure
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Прототип
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный AI-секретарь совещаний: аудио превращается в транскрипт с диаризацией, затем извлекаются поручения, сроки, ответственные и цитаты, результат выгружается в DOCX для ручной проверки. Поддерживаются записи RU/KK/mixed до 30 минут.
Как устроено
Next.js UI отправляет файл на прокси /api/meetings, оттуда он уходит в Python job-сервер (202 jobId, очередь). Speech: prepareAudio через PyAV, STT на faster-whisper large-v3-turbo (CPU int8), диаризация pyannote community-1 в отдельном окружении, выравнивание спикеров и определение языка. Protocol: транскрипт делится на чанки с перекрытием, qwen3:4b через Ollama работает как extractor, потом verifier и summary. Имена проверяются по цитируемым репликам, неподтверждённые сроки фильтруются, неизвестное остаётся null с флагом needsReview. Экспорт DOCX на стороне фронта.
Ключевые решения
- faster-whisper large-v3-turbo
- pyannote.audio community-1
- speaker alignment
- language detection
- chunking с перекрытием
- extractor → verifier → summary
- jsonschema-валидация
- Ollama
Особенности
Верификатор поручений отбрасывает неподтверждённые сроки и имена, не встречающиеся в цитатах. Всё работает офлайн (HF_HUB_OFFLINE, OLLAMA_NO_CLOUD). README честно признаёт, что реальный сквозной сценарий RU/KK/mixed не подтверждён, а веса pyannote не подготовлены.
Стек
Next.js · React · TypeScript · Zod · docx · Python · PyAV · pyannote.audio · faster-whisper · Ollama
Модели
qwen3:4b (Ollama) · Whisper large-v3-turbo
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-551c4611-myadventure.
README
README.mdJINALYS AI
1. Описание решения и назначение
Локальный AI-секретарь совещаний: аудио → транскрипт со спикерами → поручения/сроки/ответственные → ключевые цитаты → DOCX. Предназначен для подготовки и ручной проверки протокола секретарём.
Интеграционный код связывает модули участников №1/№2 с существующим интерфейсом №3. На проверочной машине Whisper распознал публичную RU-запись, а Ollama/qwen3:4b прошла проверку протокола на синтетическом RU/KZ/mixed-тексте. Веса pyannote ещё не подготовлены; реальный сквозной RU/KK/mixed/30-минутный сценарий не подтверждён. Кнопка «Демоны ашу» остаётся явно обозначенным примером, не результатом распознавания. Статус интеграции и последние изменения.
2. Архитектура
Включены защитные проверки Protocol AI из коммита 88a51dc: очистка технических идентификаторов вместо имён, проверка имён по цитируемым репликам и фильтрация неподтверждённых сроков/пустых поручений. Неопределённые значения остаются null, задачи с сомнениями требуют ручной проверки. Описание и ограничения.
Browser File + metadata
→ Next.js POST /api/meetings (streaming proxy)
→ Python POST /jobs → 202 jobId
→ очередь: prepareAudio → transcribeAudio → diarizeAudio → alignTranscript
→ protocol: chunks → extractor → verifier → summary
→ MeetingProtocol (+ date из metadata)
Browser GET /api/meetings?jobId=... → status/stage/result → UI → DOCX
Один Python worker, до двух активных/ожидающих заданий. Статусы отражают реальные вызовы. chunk:N/M не является точным процентом. done выдаётся после сохранения всего результата.
Основные файлы: app/page.tsx, app/api/meetings/route.ts, integration/server.py, speech/, protocol/, lib/contracts.ts, lib/export.ts. Полный HTTP-контракт и жизненный цикл.
3. Используемые технологии
Next.js App Router, React, TypeScript, CSS, Zod, lucide-react, docx. Python standard-library HTTP server и очередь. Speech: faster-whisper 1.2.1, PyAV 18.1.0, local pyannote.audio 4.0.7. Protocol: jsonschema 4.26.0, Ollama/qwen3:4b. Npm версии закреплены package-lock.json.
4. Инструкции по установке
PowerShell из корня репозитория:
npm.cmd ci
python -m venv .venv
.venv/Scripts/python -m pip install -r integration/requirements.txt
python -m venv speech/.venv-diarization
speech/.venv-diarization/Scripts/python -m pip install -r speech/requirements-diarization.txt
Скачивание моделей и необходимые условия доступа описаны пошагово в docs/LOCAL_RUN.md, раздел «Этап 2». Whisper требует локальных весов/tokenizer, pyannote — полного разрешённого community-1 bundle, Ollama — qwen3:4b. Веса не коммитятся. Без них реальная обработка возвращает ошибку, не demo fallback.
5. Инструкции по запуску
Запуск в трёх отдельных терминалах из корня:
powershell -File protocol/start-local.ps1— Ollama на 127.0.0.1:11435.- Установить переменные из раздела 7, затем
.venv/Scripts/python -m integration.server— Python на 127.0.0.1:8765. npm.cmd run dev— UI на http://127.0.0.1:3000.
Если 3000 занят, npm.cmd run dev -- --port 3001. Для production frontend: npm.cmd run build, затем npm.cmd start; Python и Ollama остаются отдельными процессами. Полные copy-paste команды и порядок настройки: LOCAL_RUN.md.
6. Необходимые зависимости
Git, Node.js 22.18+, npm, Python 3.11+ (для ML-пакетов рекомендуются 3.11/3.12), Ollama, локальные Whisper/pyannote/Qwen. Windows-команды выше; Linux/macOS: npm вместо npm.cmd, .venv/bin/python вместо Scripts/python.
Speech использует CPU int8; автор Protocol AI проверял qwen3:4b на RTX 4060 Laptop 8 ГБ и примерно 16 ГБ RAM. Это проверенная им конфигурация, не установленный минимум. UI GPU не нужен. Whisper около 1.6 ГБ, Qwen около 2.5 ГБ на диске; pyannote/PyTorch требуют дополнительного места. Для pyannote decoder могут понадобиться совместимые TorchCodec/FFmpeg shared libraries. Подробности: speech/README.md, speech/DIARIZATION.md, Protocol AI.
7. Параметры окружения
Python читает переменные процесса, а не .env автоматически. Задать в терминале Python сервера:
$env:LOCAL_LLM_BASE_URL='http://127.0.0.1:11435'
$env:LOCAL_LLM_MODEL='qwen3:4b'
$env:LOCAL_LLM_TIMEOUT='600'
$env:JINALYS_STT_MODEL_DIR=(Resolve-Path speech/models/large-v3-turbo).Path
$env:JINALYS_DIARIZATION_MODEL_DIR=(Resolve-Path speech/models/community-1).Path
$env:JINALYS_DIARIZATION_PYTHON=(Resolve-Path speech/.venv-diarization/Scripts/python.exe).Path
$env:HF_HUB_OFFLINE='1'
$env:HF_HUB_DISABLE_TELEMETRY='1'
LOCAL_LLM_MODEL обязателен; URL adapter по умолчанию 127.0.0.1:11434, наш сервер Ollama работает на 11435; timeout 600 секунд относится к ОДНОМУ запросу модели. STT/DIARIZATION_MODEL_DIR — папки с настоящими весами. DIARIZATION_PYTHON — отдельный interpreter. Скрипт Ollama устанавливает OLLAMA_HOST=127.0.0.1:11435 и OLLAMA_NO_CLOUD=1. Образцы: .env.example, speech/.env.example, protocol/.env.example.
Next UI не требует env, обращается к собственному /api/meetings; прокси фиксирован на loopback:8765. Не отправлять аудио/тексты внешним cloud AI. Не публиковать job server в сеть: это локальный прототип без auth.
8. Порядок проверки основного сценария
- Установить зависимости/модели и запустить три процесса.
- Ввести название, дату совещания и IANA timezone. Неизвестную дату оставить пустой.
- Загрузить MP3/PCM WAV до 400 МиБ и 30 минут.
- Дождаться обработки, проверить реальные этапы, весь транскрипт, источники поручений, ответственных и сроки.
- Для assignee=null UI показывает неизвестного ответственного; deadlineText сохраняется при неизвестной дате; needsReview требует человека. Confidence — оценка, не обещание точности.
- Проверить многострочное саммари (ключевые исходные цитаты, не свободный пересказ), экспорт полного DOCX.
- Повторить с RU/KK/mixed и 30-минутной записью с поручением в конце; проверить ошибку модели, повреждённый файл и превышение лимитов.
Тестовые записи: speech/tests/fixtures/{ru,kk,mixed,multi-speaker}.wav, атрибуция/ограничения в speech/tests/fixtures/README.md. Для проверки поручений нужен отдельно смоделированный сценарий с заранее известным содержанием. Демо интерфейса работает без моделей, но не подтверждает качество распознавания.
.venv/Scripts/python -m unittest discover -s integration/tests -v
.venv/Scripts/python -m unittest discover -s protocol/tests -v
npm.cmd test
npm.cmd run build
Проверено без весов: 4 интеграционных теста, 25 Protocol AI тестов, 5 frontend/DOCX тестов, build, HTTP 202 → GET failed/MODEL_MISSING через Next.js. Success pipeline тесты используют doubles. Реальные модели и полная установка ML зависимостей пока не проверены на этой машине.
Ограничения и дальнейшая проверка
Сервер повторно проверяет размер, формат, полную декодируемость и 1800 секунд через speech validator. AI: до 120000 символов/5000 реплик, части с перекрытием до двух реплик. Поздние отмены/далёкие уточнения глобально не сверяются; разные формулировки одной задачи могут остаться.
«Күтуді тоқтату» останавливает только браузерное ожидание. Server-side отмены нет. Результаты хранятся в памяти до 6 часов, исчезают при перезапуске; аудио удаляется после обработки, но после аварии возможны остатки в системном temp. Общего watchdog и постоянной очереди нет. Эти ограничения, восстановление ожидания и подробная ручная приёмка: docs/LOCAL_RUN.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:44Merge protocol quality safeguards into integrated meeting pipelineFara870-950
- 2026-09-23 17:40Merge speech FFmpeg setup and document current integration statusFara870-950
- 2026-09-23 17:37fix(protocol): guard assignees and filter vague action itemsAFRICA1525
- 2026-09-23 17:22fix(diarization): load local ffmpeg shared librariesAier
- 2026-09-23 17:20docs(integration): README.mdFara870-950
- 2026-09-23 17:20docs(integration): docs/TEAM_HANDOFF.mdFara870-950
- 2026-09-23 17:20docs(integration): docs/integration.mdFara870-950
- 2026-09-23 17:20docs(integration): docs/LOCAL_RUN.mdFara870-950
Все коммиты (46)
- 2026-09-23 17:20feat(integration): .env.exampleFara870-950
- 2026-09-23 17:20feat(integration): .gitignoreFara870-950
- 2026-09-23 17:20feat(integration): lib/export.tsFara870-950
- 2026-09-23 17:20feat(integration): app/globals.cssFara870-950
- 2026-09-23 17:20feat(integration): app/page.tsxFara870-950
- 2026-09-23 17:20feat(integration): lib/contracts.tsFara870-950
- 2026-09-23 17:20feat(integration): app/api/meetings/route.tsFara870-950
- 2026-09-23 17:20feat(integration): integration/tests/test_server.pyFara870-950
- 2026-09-23 17:20feat(integration): integration/requirements.txtFara870-950
- 2026-09-23 17:19feat(integration): integration/server.pyFara870-950
- 2026-09-23 17:19feat(integration): integration/__init__.pyFara870-950
- 2026-09-23 16:47Merge pull request #5 from BAITC-Hacks/codex/speech-pipelineAibatdev
- 2026-09-23 16:10feat(speech): support 30-minute mp3 meetingsAier
- 2026-09-23 15:48docs: align main README with integrated long-meeting limits and limitationsFara870-950
- 2026-09-23 15:48Merge pull request #4 from BAITC-Hacks/codex/long-meeting-uiFara870-950
- 2026-09-23 15:47docs: preserve main README structure during long meeting integrationFara870-950
- 2026-09-23 15:47Merge pull request #3 from BAITC-Hacks/codex/protocol-aiFara870-950
- 2026-09-23 15:33docs(speech): add reproducible speech handoffAier
- 2026-09-23 15:18fix(speech): stabilize local inference pipelineAier
- 2026-09-23 15:15feat(ui): extend processing timeout and audio size limitsAFRICA1525
- 2026-09-23 15:15feat(protocol): process thirty-minute meetings in bounded chunksAFRICA1525
- 2026-09-23 14:48test(speech): add multilingual speech fixturesAier
- 2026-09-23 14:46Merge pull request #2 from BAITC-Hacks/codex/app-demoFara870-950
- 2026-09-23 14:46docs: document architecture, setup and verification in eight required sectionsFara870-950
- 2026-09-23 14:40feat(ui): add meeting workspace, DOCX export, themes and integration handoffFara870-950
- 2026-09-23 14:38feat(speech): expose meeting transcription pipelineAier
- 2026-09-23 14:31feat(speech): add transcript language detectionAier
- 2026-09-23 14:28feat(speech): align speakers with transcriptAier
- 2026-09-23 14:26Merge pull request #1 from BAITC-Hacks/codex/protocol-aiAFRICA1525
- 2026-09-23 14:17feat(protocol): define meeting contracts and multilingual fixtureAFRICA1525
- 2026-09-23 14:17feat(protocol): implement and validate local meeting AI pipelineAFRICA1525
- 2026-09-23 14:16feat(diarization): add local speaker separationAier
- 2026-09-23 14:06feat(stt): add local multilingual transcriptionAier
- 2026-09-23 13:53feat(audio): add meeting audio preprocessingAier
- 2026-09-23 13:49feat(speech): define speech pipeline contractAier
- 2026-09-20 12:38Update text in README.mdFara870-950
- 2026-09-19 12:51Update README with new team nameAibatdev
- 2026-09-19 12:49Update README.mdAFRICA1525
Структура репозитория (96 файлов)
.env.example .gitignore AGENTS.md CLAUDE.md README.md app/api/meetings/route.ts app/components/appearance.tsx app/globals.css app/layout.tsx app/page.tsx contracts/speech/.gitignore contracts/speech/README.md contracts/speech/eslint.config.mjs contracts/speech/index.ts contracts/speech/package-lock.json contracts/speech/package.json contracts/speech/schema.json contracts/speech/tests/schema.test.mjs contracts/speech/tests/types.ts contracts/speech/tsconfig.json docs/LOCAL_RUN.md docs/PROJECT_STATUS.md docs/PROTOCOL_QUALITY_UPDATE.md docs/TEAM_HANDOFF.md docs/handoff/protocol-ai.md docs/handoff/speech.md docs/integration.md integration/__init__.py integration/requirements.txt integration/server.py integration/tests/test_server.py lib/contracts.ts lib/demo.ts lib/export.ts next-env.d.ts package-lock.json package.json protocol/.env.example protocol/.gitignore protocol/__init__.py protocol/__main__.py protocol/contracts/protocol.schema.json protocol/deadlines.py protocol/fixtures/input.demo.json protocol/llm.py protocol/pipeline.py protocol/quality.py protocol/requirements.txt protocol/smoke.py protocol/start-local.ps1 protocol/tests/test_long_meetings.py protocol/tests/test_protocol.py protocol/tests/test_quality.py protocol/validation.py speech/.env.example speech/.gitignore speech/ALIGNMENT.md speech/DIARIZATION.md speech/PIPELINE.md speech/README.md speech/STABILITY.md speech/STT_VALIDATION.md speech/__init__.py speech/_diarization_worker.py speech/alignment.py speech/audio.py speech/diarization.py speech/fixture_suite.py speech/language.py speech/pipeline.py speech/pyproject.toml speech/requirements-dev.txt speech/requirements-diarization.txt speech/requirements-stt.txt speech/stability_probe.py speech/stt.py speech/tests/fixtures/.gitattributes speech/tests/fixtures/README.md speech/tests/fixtures/invalid.wav speech/tests/fixtures/kk.wav speech/tests/fixtures/mixed.wav speech/tests/fixtures/multi-speaker.wav speech/tests/fixtures/results.json speech/tests/fixtures/ru.wav speech/tests/fixtures/stability-results.json speech/tests/test_alignment.py speech/tests/test_audio.py speech/tests/test_diarization.py speech/tests/test_fixtures.py speech/tests/test_language.py speech/tests/test_pipeline.py speech/tests/test_stability.py speech/tests/test_stt.py speech/tests/test_stt_integration.py tests/contracts.test.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.