AAYMA
RU
Войти

AI Протоколист

Локальное приложение, которое записывает системный звук встречи Teams (или берёт загруженный файл), показывает живой транскрипт, выделяет поручения…

Рабочий MVP
Команда «rA9» 12💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: rA9
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP

Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)

Суть

Локальное приложение, которое записывает системный звук встречи Teams (или берёт загруженный файл), показывает живой транскрипт, выделяет поручения и формирует саммари и DOCX.

Как устроено

PyAudioWPatch/WASAPI loopback захватывает звук устройства вывода Windows и режет на 5-секундные WAV-фрагменты, которые распознаются faster-whisper base на CPU/int8 и стримятся в UI. После остановки полная запись проходит диаризацию pyannote Community-1, поручения извлекаются правилами для русского и казахского, саммари — отбором значимых фраз, экспорт в transcript.txt и DOCX через python-docx. Оператор вручную сопоставляет спикеров с именами, после чего пересчитываются ответственные.

Ключевые решения

  • faster-whisper
  • pyannote Community-1 diarization
  • WASAPI loopback capture
  • chunked streaming transcription
  • rule-based action extraction
  • extractive summary

Особенности

Захват реальной встречи Teams: бот-аккаунт «AI Протоколист» входит гостем, звук берётся через WASAPI loopback, транскрипт появляется во время звонка; облачных API нет — соответствует требованию закрытого контура.

Стек

Python · FastAPI · PyAudioWPatch · python-docx · HTML/CSS/JS

Модели

faster-whisper base · pyannote Community-1


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f2ece5dd-ra9.

README

README.md

AI Протоколист — команда rA9

Проект для хакатона HackAlem AI по кейсу «Система автопротоколирования совещаний с фиксацией поручений».

Приложение должно записывать звук совещания, распознавать реплики участников и формировать протокол с поручениями, ответственными и сроками. Цель — сократить ручную работу секретаря и уменьшить риск потери договорённостей.

Текущий статус

Реализованы локальный интерфейс на HTML/CSS/JavaScript, backend записи на Python/FastAPI и отображение живого транскрипта. Запись системного звука Windows через WASAPI проверена командой в тестовой встрече Teams. faster-whisper base/CPU распознаёт новые WAV-фрагменты. После окончания записи формируются поручения, краткие итоги и DOCX. Можно также загрузить готовое аудио для локальной обработки.

Добавлено подключение локальной диаризации pyannote Community-1 по полной записи. Для неё нужно отдельно принять условия модели и скачать веса: инструкция установки и проверки. Пока веса не настроены, результат честно показывает неизвестных говорящих. Реальная диаризация, качество казахского/смешанного аудио и полный сценарий браузера ещё требуют проверки на ноутбуке; наличие кода не означает прохождения этих проверок.

В интерфейсе доступны:

  • Ввод названия встречи, открытие ссылки Teams в гостевом окне Edge/Chrome и выбор устройства воспроизведения Windows. Ввод имени, вход и ожидание допуска выполняет оператор; открытое окно не означает успешное подключение.
  • Начало и остановка реальной записи, индикатор уровня звука, сохранение WAV и пятисекундных WAV-фрагментов для будущего распознавания.
  • Список локальных записей, прослушивание и скачивание полной записи после остановки.
  • Сценарий Zoom использует тот же захват звука, но требует ручного входа и пока отдельно не проверен.
  • Воспроизведение вымышленного примера: шесть реплик, три говорящих и три заранее заданных поручения.
  • Редактирование имён участников с обновлением транскрипта и ответственных; отметка проверки поручений.
  • Экспорт демонстрационного транскрипта в TXT и структурированных результатов в JSON. Файлы явно помечены как демонстрационные.
  • Выбор локального аудиофайла, отображение имени, размера и длительности, встроенное прослушивание. Поддерживаемые расширения: MP3, WAV, M4A, OGG, OPUS, FLAC, WebM; предел размера — 200 МБ. Возможность прослушивания зависит от кодеков браузера.
  • Адаптивная компоновка для широкого и узкого экрана.

При выборе настоящего файла вымышленные результаты очищаются. Кнопка распознавания передаёт файл локальному backend, который сохраняет его в sessions/ и выполняет обработку. Аудио и текст во внешние облачные API не отправляются.

Реплики доступны по /api/sessions/{id}/transcript, исходный текст — по /api/sessions/{id}/transcript.txt, итог — по /api/sessions/{id}/result, DOCX — по /api/sessions/{id}/protocol.docx. В итогах оператор сопоставляет голоса с именами; связь пересчитывается в поручениях. Саммари использует отбор значимых фраз и задач, анализатор основан на правилах и может ошибаться. Полные итоги и разделение голосов доступны после завершения обработки, а не во время звонка. WAV, транскрипты и результаты сохраняются в sessions/. Закрытие вкладки не останавливает запись: нажмите «Остановить и сохранить» перед выходом.

Следующие разделы описывают целевой MVP. По ТЗ обработка аудио/текста во внешних облачных API запрещена. Интернет используется только при установке зависимостей и скачивании весов; перед автономным демо обе модели нужно загрузить заранее.

Планируемый сценарий

  1. Оператор вручную входит во встречу отдельным аккаунтом «AI Протоколист» на компьютере с Windows. Микрофон этого аккаунта выключен, участники уведомлены о записи и обработке речи.
  2. В локальном интерфейсе оператор выбирает устройство воспроизведения и начинает запись системного звука.
  3. Приложение обрабатывает поступающий звук фрагментами и постепенно показывает транскрипт с таймкодами и обозначениями говорящих.
  4. Из транскрипта извлекаются поручения и обновляются предварительные итоги.
  5. После завершения записи приложение обрабатывает оставшееся аудио и формирует два итоговых файла.

Основная платформа демонстрации — Microsoft Teams. Совместимость с Zoom планируется проверить отдельно. Захват звука должен работать через устройство вывода Windows; автоматическое подключение бота по ссылке встречи в MVP не входит.

Планируемые функции MVP

  • Запуск и остановка записи, выбор источника и индикатор поступления звука.
  • Распознавание русского, казахского и смешанной русско-казахской речи.
  • Разделение говорящих: «Спикер 1», «Спикер 2» и далее, с возможностью вручную сопоставить обозначения с именами.
  • Транскрипт с таймкодами, пополняемый во время встречи.
  • Извлечение поручений: содержание задачи, ответственный, срок и подтверждающая цитата из транскрипта.
  • Отметка «не указан», если исполнитель или срок не названы; неоднозначные поручения требуют проверки оператором.
  • Предварительное саммари во время встречи и итоговое саммари после её завершения.
  • Сохранение промежуточных результатов в локальную папку совещания.
  • Экспорт исходного результата распознавания в transcript.txt и итогового протокола в summary.docx.

summary.docx должен содержать краткие итоги и таблицу поручений. Транскрипт сохраняется без редакторского пересказа, но может содержать ошибки распознавания.

Архитектура и технологии

Планируемая цепочка обработки:

Звук Teams / Zoom → захват Windows → распознавание и диаризация
→ транскрипт → извлечение поручений и саммари → TXT / DOCX
  • Python — обработка аудио, взаимодействие с моделями и экспорт документов.
  • Локальный веб-интерфейс — управление записью и просмотр результатов.
  • FastAPI и PyAudioWPatch / WASAPI loopback — реализованные API и захват звука Windows. Контракт распознавания и получения реплик UI описан в backend/TRANSCRIPTION_CONTRACT.md.
  • Диаризация — локальный pyannote Community-1; извлечение поручений — правила русского и казахского языка; краткие итоги — локальный отбор фраз; DOCX — python-docx. Облачного провайдера нет.
  • Локальное распознавание — faster-whisper 1.2.1, модель base, CPU/int8. Первый запуск скачивает модель в models/; следующие фрагменты используют уже загруженную модель. Настройки WHISPER_MODEL и WHISPER_DEVICE задаются переменными окружения перед запуском сервера.
  • Локальные JSON-файлы — хранение структурированных результатов. База данных и регистрация пользователей для MVP не нужны.

Адрес сервиса и названия моделей будут задаваться в конфигурации. Секретные API-ключи не должны попадать в Git, README, демонстрационные материалы или журналы приложения.

Ограничения и открытые вопросы

  • Live-обработка означает последовательную обработку поступающего звука с задержкой. Фактическая задержка и способность работать без накопления очереди пока не измерены.
  • Качество казахской и смешанной речи, разделение голосов и устойчивость обозначений спикеров между фрагментами требуют проверки на тестовых записях.
  • Диаризация отделяет голоса друг от друга, но сама по себе не устанавливает имена и должности людей.
  • Системный захват может включать посторонние звуки выбранного устройства. Для демо следует отключить уведомления и другие источники воспроизведения.
  • Звук локального микрофона не гарантируется системным захватом. Для основного сценария используется отдельный аккаунт слушателя, получающий речь остальных участников через встречу.
  • В исходном документе кейса предусмотрен закрытый контур. Использование внешнего API рассматривается на основании сообщённого командой разрешения организаторов; применимость разрешения к GPT Sandbox нужно уточнить до отправки туда записей.

В MVP не входят определение руководителя по тону, автоматический вход во встречи, напоминания о сроках, рассылка поручений, интеграция с СЭД, история с поиском и промышленное развёртывание.

Тестовые материалы

В папке Assets/ находятся:

  • Совещание №1.mp3 и Совещание №2.mp3 — тестовые аудиозаписи.
  • Протокол_совещания№1.docx и Протокол_совещания№2.docx — предоставленные командой документы для сверки результатов.

Эталонные документы используются для оценки качества, а не для подстановки заранее подготовленных ответов. Реальные записи должны быть анонимизированы перед публичной демонстрацией.

Запуск

Нужны Windows, Python 3.11+ x64 и устройство вывода звука. Проверено на Python 3.14.6. API-ключи для записи не требуются. Для гостевого Teams нужны Edge или Chrome; организатор должен разрешить вход гостям.

Первый запуск из терминала в корне репозитория:

.\setup.cmd
.\start-ui.cmd

Откройте http://127.0.0.1:8765. Сервер доступен только на этом компьютере и обслуживает папку ui, а не весь репозиторий. Для остановки нажмите Ctrl+C в терминале. Если порт занят, завершите предыдущий экземпляр сервера либо используйте другой порт:

.venv\Scripts\python.exe -m backend --port 8766

Для записи вставьте ссылку Teams и нажмите «Открыть Teams гостем». В открывшемся окне выберите вход через браузер, укажите имя «AI Протоколист», выключите микрофон и камеру, дождитесь допуска. В приложении выберите то же устройство вывода, которое использует Teams, подтвердите готовность источника и уведомление участников, затем нажмите «Начать запись». После встречи нажмите «Остановить и сохранить» и скачайте WAV из списка записей. Для проверки системного захвата можно воспроизвести тестовую запись через локальный плеер.

Захватываются все звуки выбранных динамиков/наушников. Локальный микрофон не включён в запись. Для записи своего выступления используйте отдельный компьютер гостя. Приложение не узнаёт о завершении встречи автоматически: остановка записи выполняется оператором.

Для просмотра вымышленного примера раскройте соответствующий раздел и нажмите «Запустить пример». Для проверки настоящего аудиофайла нажмите «Загрузить аудиофайл», выберите запись и запустите распознавание. Дождитесь итогов, сохраните имена говорящих и скачайте DOCX. Для старых сессий без result.json загрузите сохранённый WAV повторно.

Не запускайте старый python -m http.server: он не обслуживает backend API. Открытие ui/index.html напрямую также не запускает запись. OpenAPI и описание методов доступны по /docs работающего backend.

23 сентября 2026 года проверена запись тестовой встречи Teams: 114.73 секунды, 48 кГц, stereo PCM16 и 23 фрагмента. Объединённые фрагменты точно совпадают с полной записью; обнаружен ненулевой звуковой сигнал, ошибок завершения нет. Проходят 27 тестов. На первых 20 секундах тестового MP3 проверена настоящая модель: первый фрагмент вместе с загрузкой модели занял 20.7 с, следующие пятисекундные фрагменты — 1.61–1.76 с каждый. Это короткая проверка работоспособности, а не оценка качества всей записи. Проверка live-распознавания в Teams, диаризации и Zoom остаётся отдельной задачей.

План проверки перед демонстрацией

  • Проверить распознавание на обеих тестовых записях и сопоставить поручения с эталонными документами.
  • Отдельно проверить русский, казахский и смешанную речь.
  • Проверить разделение голосов и привязку поручений к исполнителям.
  • Провести live-проверку в Teams и отдельную проверку в Zoom.
  • Измерить задержку и убедиться, что обработка успевает за поступающим звуком.
  • Проверить отсутствие выдуманных исполнителей и сроков.
  • Открыть итоговые TXT и DOCX и проверить полноту и читаемость результатов.
  • Проверить обработку отсутствия звука, ошибок API и завершения записи.
  • Проверить запуск по README, зависимости и отсутствие секретов в репозитории.

Актуализация документации перед сдачей

После завершения разработки заменить планируемые возможности на фактически реализованные и проверенные. Указать точные модели, зависимости, команды запуска, режим обработки данных, результаты проверки Teams и Zoom и известные ограничения. Нереализованные функции явно отметить как дальнейшие планы. До этой проверки не заявлять готовность приложения и полное соответствие кейсу.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
13
Авторы
3
Файлы
41
Ветки
5

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

s_element 7zhan 5asre57 1

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

  • 2026-09-23 17:51feat: PROTON meeting workflow, audio uploads and task summariess_element
  • 2026-09-23 17:50Merge pull request #1 from BAITC-Hacks/feature/sttzhan
  • 2026-09-23 17:47feat: integrate local meeting results, diarization and DOCX exportzhancmd
  • 2026-09-23 17:23merge: integrate new meeting workspace UIs_element
  • 2026-09-23 17:10feat(ui): preserve meeting workspace and prepare task integrationasre57
  • 2026-09-23 17:02feat: connect Jan's local speech recognition to meeting backends_element
  • 2026-09-23 16:57Merge remote-tracking branch 'origin/feature/ai' into feature/realtime-backends_element
  • 2026-09-23 16:47feat: add local speech-to-summary pipelinezhancmd
Все коммиты (13)
  • 2026-09-23 16:25feat: stream diarized transcript events from audio chunkss_element
  • 2026-09-23 16:19feat: capture meeting audio and publish WAV chunkss_element
  • 2026-09-23 16:16feat: support Kazakh and mixed meeting actionszhancmd
  • 2026-09-23 15:36fix: improve transcript action analysiszhancmd
  • 2026-09-23 15:10feat: добавить первый UI и загрузку тестового аудиоs_element
Структура репозитория (41 файлов)
.gitignore
README.md
ai/README.md
ai/__init__.py
ai/analyzer.py
ai/diarization.py
ai/download_diarization.py
ai/meeting.py
ai/pipeline.py
ai/report.py
ai/requirements-diarization.txt
ai/requirements.txt
ai/summary.py
ai/transcriber.py
backend/README.md
backend/TRANSCRIPTION_CONTRACT.md
backend/__init__.py
backend/__main__.py
backend/app.py
backend/recorder.py
backend/teams.py
backend/transcription.py
requirements-dev.txt
requirements.txt
setup.cmd
speech/__init__.py
speech/recognizer.py
start-ui.cmd
tests/fixtures/transcript.json
tests/test_analyzer.py
tests/test_meeting_results.py
tests/test_pipeline.py
tests/test_recording_backend.py
tests/test_speech_adapter.py
tests/test_transcriber.py
tests/test_transcription.py
ui/app.js
ui/index.html
ui/recording.js
ui/results.js
ui/styles.css
Ветки (5)

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

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

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