AAYMA
RU
Войти

Hattama

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

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

О проекте

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

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

Суть

Полностью локальная система: по аудиозаписи совещания на русском, казахском или смешанном языке делает стенограмму, краткое содержание, список поручений со сроками и DOCX-протокол.

Как устроено

ffmpeg приводит аудио к 16 кГц моно, режет гул и выравнивает громкость. whisper.cpp (ggml-large-v3-turbo, Metal) распознаёт речь, в смешанном режиме в два прохода (ru и kk), и для каждой реплики выбирает вариант по доле казахских слов. Говорящих разделяют по паузам или по отдельным дорожкам с телефонов участников, отметка участников идёт по QR. Ollama qwen3:4b извлекает поручения с цитатой, краткое содержание и название. Устные сроки переводит в даты код (dates.py). Данные хранятся в SQLite, API на FastAPI, протокол экспортируется через python-docx.

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

  • whisper.cpp large-v3-turbo
  • двухпроходное ru/kk распознавание
  • диаризация по паузам/дорожкам
  • извлечение поручений LLM
  • rule-based парсинг дат
  • QR-регистрация

Особенности

Смешанная речь решена двумя проходами Whisper с выбором варианта по каждой реплике, язык определяется по доле казахских слов. Подсказка распознаванию состоит только из имён участников, потому что длинный русский словарь мешал казахскому. Многодорожечная запись склеивает текст, а не звук. Работает офлайн, без облака.

Стек

Python · FastAPI · SQLite · ffmpeg · whisper.cpp · Ollama · python-docx · segno · HTML/JS

Модели

Whisper large-v3-turbo (whisper.cpp) · Qwen3:4b via Ollama


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

README

README.md

Hattama — протокол совещаний с контролем поручений

Система принимает запись совещания и выдаёт готовый протокол и список поручений с ответственными, сроками и статусами. Работает полностью локально: аудио и текст не передаются во внешние сервисы. Решение рассчитано на закрытый контур заказчика.


1. Какую проблему решает

На совещаниях поручения раздают устно. Секретарь записывает их вручную: часть теряется, сроки искажаются («до конца недели» превращается в «до пятницы»), ответственный не всегда зафиксирован. Через неделю никто не может сказать, кому что поручено. Протокол оформляют ещё два-три часа после встречи, а исполнение не контролируется, потому что контролировать нечего: списка нет.

Отдельная сложность в Казахстане: на совещаниях говорят на русском, казахском и смешивают языки внутри одной фразы. Облачные сервисы либо не знают казахского, либо требуют отправлять запись наружу, что для госкомпаний и банков недопустимо.

Что даёт система

КомуЧто получает
СекретарьПротокол собирается сам: участники, краткое содержание, таблица поручений
РуководительПоручения со сроками и статусами, просроченные отмечаются автоматически
ИсполнительСвоё поручение с цитатой из совещания и сроком

2. Что умеет

  1. Распознаёт речь — русский, казахский, смешанная речь. Локально. Модель определяет язык один раз на всю запись, поэтому на совещании, где языки чередуются, казахские фразы уезжают в русский. Мы прогоняем запись двумя проходами, русским и казахским, и по каждой реплике берём тот вариант, в котором действительно есть казахские буквы. Плата за это — время обработки вырастает вдвое.
  2. Разделяет говорящих. Два режима: по паузам в одной записи либо по дорожкам, когда каждый участник пишет со своего телефона. Во втором случае имя говорящего известно точно.
  3. Язык совещания выбирается перед записью: русский, казахский или смешанный. Один язык — один проход распознавания, быстро и точно. Смешанный — два прохода с выбором варианта по каждой реплике, это режим по умолчанию.
  4. Отмечает участников перед началом: QR на экране ведущего, участник сканирует и вводит имя. Имена участников передаются распознаванию и разбору поручений, что снижает число ошибок.
  5. Находит поручения: что сделать, кому, к какому сроку, кто поручил, и цитату из стенограммы, откуда поручение взято.
  6. Переводит устные сроки в даты: «до конца недели» → 25.09.2026. Рядом сохраняется исходная формулировка и правило пересчёта.
  7. Составляет краткое содержание: по каждому докладчику показатель, названная проблема и принятое решение.
  8. Даёт название совещанию по содержанию разговора.
  9. Экспортирует протокол в DOCX: шапка, участники, краткое содержание, таблица поручений, стенограмма приложением.
  10. Ведёт статусы: в работе, просрочено, выполнено. Просрочка считается сама.
  11. Удаляет совещание полностью: из базы стираются стенограмма, поручения и участники, а аудиофайл и дорожки участников удаляются с диска. Запись не хранится дольше, чем нужно.

3. Архитектура

аудио (файл, запись в браузере или дорожки участников)
  └─ ffmpeg            приведение к 16 кГц моно, срез гула, выравнивание громкости
  └─ whisper.cpp       распознавание речи на видеоядре Apple Silicon, локально
  └─ разделение        по паузам либо по дорожкам участников
  └─ склейка дорожек   реплики по времени, чужие голоса отсеиваются по громкости
  └─ Ollama qwen3:4b   поручения, краткое содержание, название совещания
  └─ dates.py          устные сроки в даты, обычным кодом
  └─ SQLite            хранение совещаний, участников, поручений, статусов
  └─ FastAPI           API и веб-интерфейс
  └─ python-docx       протокол в DOCX

Два решения, которые стоит отметить:

  • Сроки переводит код, а не модель. Правило должно быть одинаковым каждый раз и объяснимым. Рядом с датой в интерфейсе видно, как она получена.
  • Дорожки не смешиваются в один звук. Смешивание складывает шумы и не делает дальний голос громче. Склеивается текст, имя берётся из владельца дорожки.

Подробнее: docs/multitrack.md.


4. Технологии

СлойЧем
Распознавание речиwhisper.cpp, модель ggml-large-v3-turbo, Metal на Apple Silicon
Языковая модельOllama, qwen3:4b, локально
БэкендPython 3, FastAPI, SQLite
Документыpython-docx
QR для отметки участниковsegno, генерация офлайн
ИнтерфейсHTML и JavaScript без сборки, один файл на страницу

Внешние облачные API не используются. Это требование кейса о закрытом контуре и одновременно главное отличие от Otter и Fireflies. Ключи и учётные записи для проверки не нужны.


5. Установка

Требуется macOS с Apple Silicon, Homebrew, около 6 ГБ свободного места.

# инструменты
brew install ffmpeg ollama whisper-cpp

# локальная языковая модель
ollama serve &
ollama pull qwen3:4b

# модель распознавания речи
mkdir -p ~/Desktop/models
curl -L -o ~/Desktop/models/ggml-large-v3-turbo.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin

# окружение проекта
python3 -m venv .venv
./.venv/bin/pip install fastapi uvicorn python-docx requests python-multipart segno pillow

Первая установка требует интернета для загрузки моделей, около 4 ГБ. Дальше система работает офлайн.


6. Запуск

ollama serve &                                   # если ещё не запущен
./.venv/bin/python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000

Порт 0.0.0.0 нужен, чтобы участники могли отметиться со своих телефонов в той же сети.


7. Как проверить решение

Быстрая проверка, около двух минут

  1. Открыть http://localhost:8000/app
  2. Нажать «Загрузить файл», выбрать samples/meeting_test.wav
  3. Дождаться четырёх шагов обработки и статуса «готово»
  4. Проверить результат:
    • совещание получило название по содержанию;
    • показано краткое содержание;
    • в списке поручений есть ответственный, срок в виде даты, исходная формулировка срока и цитата из стенограммы;
    • вкладка «Стенограмма» показывает реплики с говорящими.
  5. Нажать «Скачать протокол» и открыть полученный DOCX.

Проверка отметки участников и записи с телефонов

  1. В приложении «Новое совещание» — появится QR
  2. Открыть с телефона в той же сети или ввести участников вручную
  3. Участник на своей странице нажимает «Начать запись», в конце дорожка уходит на сервер
  4. Ведущий нажимает «Собрать совещание из дорожек участников»

Проверка работы без интернета

Отключить Wi-Fi и повторить быструю проверку. Система продолжает работать: сетевых вызовов в решении нет.


8. Параметры окружения

Ключи и внешние учётные записи не требуются. Поведение можно менять переменными:

ПеременнаяПо умолчаниюЧто делает
HATTAMA_PROMPTonПередаёт распознаванию имена участников, снижает ошибки в именах. В подсказке только имена собственные: длинный текст на одном языке склоняет модель к этому языку и мешает смешанной речи. off отключает
HATTAMA_AUDIO_CLEANonСрез гула техники и выравнивание громкости, помогает участникам вдали от микрофона. off отключает
HATTAMA_MIXEDonДвухпроходное распознавание для смешанной речи: русский и казахский проходы с выбором варианта по каждой реплике. off оставляет один проход и работает вдвое быстрее
HATTAMA_SECRETвстроенныйСекрет для кода отметки участников

Пути к моделям задаются в backend/transcribe.py (MODEL_TURBO) и backend/extract.py (MODEL, адрес Ollama).


9. Структура репозитория

backend/
  main.py         API, база, сценарий обработки, отметка участников, QR
  transcribe.py   подготовка звука, распознавание, говорящие, склейка дорожек
  extract.py      поручения, краткое содержание, название совещания
  dates.py        перевод устных сроков в даты
  export.py       протокол в DOCX
frontend/
  landing.html    лендинг
  index.html      приложение
  join.html       страница отметки участника
  img/            изображения
samples/          демо-запись, стенограммы, текст для проверки речи
docs/             развитие продукта: кабинеты, многодорожечная запись, устройство

10. Ограничения, о которых честно

  • В режиме одной записи говорящие разделяются по паузам: на перебивках возможны ошибки. Режим с дорожками участников решает это полностью.
  • Качество распознавания казахской речи ниже русской: модель turbo ужата ради скорости. Полная large-v3 точнее, требует 3 ГБ места и вдвое больше времени.
  • Запись в samples/ синтезирована для тестирования, живых записей совещаний в репозитории нет по соображениям приватности.
  • Устройство записи, показанное на лендинге, это концепт: в решение хакатона оно не входит.

11. Проверено

23.09.2026. Репозиторий склонирован в пустую папку, зависимости установлены по инструкции выше, сервер запущен, пройден полный сценарий: загрузка записи, распознавание, название совещания, краткое содержание, три поручения с ответственными, сроки переведены в даты, протокол DOCX скачан.

Проверка выполнена на чистой копии, без файлов и настроек из рабочей папки.

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

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

Muhammedjan 17

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

  • 2026-09-23 17:43Выбор языка совещания перед записью: русский, казахский или смешанныйMuhammedjan
  • 2026-09-23 17:40Экран обработки: устойчивый опрос, счётчик времени и подробные шаги вместо одного зависшегоMuhammedjan
  • 2026-09-23 17:30Определение языка реплики по доле казахских слов, а не букв: русские фразы больше не подменяются казахским вариантомMuhammedjan
  • 2026-09-23 17:25Смешанная речь: два прохода распознавания, русский и казахский, с выбором варианта по каждой репликеMuhammedjan
  • 2026-09-23 17:23Удаление совещания: стенограмма, поручения, участники и аудиофайлы стираются с дискаMuhammedjan
  • 2026-09-23 17:22README: полное описание для проверяющих — проблема, возможности, архитектура, технологии, установка, запуск, шаги проверки, ограниченияMuhammedjan
  • 2026-09-23 17:20Блок «Следующее поколение»: рендеры устройства с пометкой «Концепт» и честным текстом о срокахMuhammedjan
  • 2026-09-23 17:04Подсказка модели только из имён: длинный русский словарь мешал распознаванию казахской речи; переключатели подсказки и обработки звукаMuhammedjan
Все коммиты (17)
  • 2026-09-23 16:56Персонаж на лендинге: первый экран, блоки о работе, ролях и казахской речиMuhammedjan
  • 2026-09-23 16:42Краткое содержание совещания: по каждому докладчику показатель, проблема и решение; выводится в приложении и в протоколеMuhammedjan
  • 2026-09-23 16:24Запись с нескольких телефонов: дорожка на участника, склейка по времени, отсев чужих голосов по громкости; обработка звука для дальних говорящих; лендинг с полным описаниемMuhammedjan
  • 2026-09-23 16:11Название совещания по содержанию разговора, устойчивый разбор ответа моделиMuhammedjan
  • 2026-09-23 15:55Логотип Hattama на лендинге и в приложенииMuhammedjan
  • 2026-09-23 15:51README: отметка о проверке запуска на чистом клонеMuhammedjan
  • 2026-09-23 15:48Лендинг, приложение в виде мобильного интерфейса, отметка участников по QR с защитойMuhammedjan
  • 2026-09-23 15:10Рабочая цепочка: распознавание речи, извлечение поручений, сроки в даты, протокол DOCX, веб-интерфейс и APIMuhammedjan
  • 2026-09-23 14:16Структура проекта: agent, backend, frontend; контракт API и формат данныхMuhammedjan
Структура репозитория (28 файлов)
.gitignore
README.md
agent/README.md
backend/README.md
backend/dates.py
backend/export.py
backend/extract.py
backend/main.py
backend/transcribe.py
docs/device.md
docs/multitrack.md
docs/vision.md
frontend/README.md
frontend/img/device-back.jpg
frontend/img/device-room.jpg
frontend/img/device-side.jpg
frontend/img/device-top.jpg
frontend/img/hero-phone.png
frontend/img/mascot-doc.png
frontend/img/mascot-give.png
frontend/img/mascot.png
frontend/index.html
frontend/join.html
frontend/landing.html
samples/meeting1_transcript.txt
samples/meeting_test.wav
samples/script.txt
samples/test_kz.txt

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

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

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