Как устроен AI Recorder: локальная транскрибация и анализ встреч на desktop (Mac/Windows)
Практический разбор desktop-архитектуры AI Recorder: от записи встречи до структурного анализа, с локальным контуром хранения и контролируемой эксплуатацией.
TL;DR
AI Recorder решает практическую задачу команд: записывать встречи, получать транскрипт и сразу делать структурный анализ без сложной ручной обработки.
Ключевая идея реализации: запись и хранение — локально на устройстве, а анализ выполняется через выбранный провайдер (OpenAI, Ollama или ваш сервер).
Это снижает операционные риски, ускоряет рабочий цикл и дает контроль над инфраструктурой.
Какую проблему решает система
У большинства команд после встреч повторяются одни и те же проблемы:
1) теряются детали обсуждений;
2) сложно быстро собрать summary и задачи;
3) нет единого процесса от записи до результата;
4) ручная обработка занимает больше времени, чем сама встреча.
AI Recorder закрывает этот разрыв: от кнопки «Запись» до готового текста и аналитического результата в одном desktop-приложении.
Что умеет текущая версия
1) Запись аудио встречи с микрофона и системного звука.
2) Автоматическая финализация записи в MP3 через ffmpeg.
3) Список записей с датой, статусом транскрипта и анализа.
4) Удаление записи вместе с привязанными файлами транскрипта/анализа.
5) Встроенный плеер для прослушивания выбранной записи.
6) Локальная транскрибация через faster-whisper (Python runtime внутри приложения).
7) Анализ транскрипта через OpenAI API, Ollama или кастомный Server endpoint.
8) Приветственный экран здоровья системы: auth, модель, профили анализа и compute readiness.
9) Тесты микрофона и speaker level в настройках.
10) Логирование warn/error/panic и отправка лога на сервер.
11) Автостоп записи через 2 часа, чтобы не получать «вечные» записи.
Архитектура решения
UI (Tauri WebView, src/index.html) ↓ invoke-команды Rust backend (src-tauri/src/*.rs) ├─ Audio capture (mic + speaker) ├─ Postprocess (ffmpeg -> mp3) ├─ File storage (records/output/results/models) ├─ Python transcription runner (faster-whisper) ├─ Analysis providers (OpenAI / Ollama / Server) ├─ Welcome checks (auth/model/profile/compute) └─ Logging + log shipping
Где хранятся данные
Данные лежат вне репозитория, в пользовательской директории:
~/Documents/AI Recorder/records — аудио
~/Documents/AI Recorder/output — транскрипты
~/Documents/AI Recorder/results — результаты анализа
~/Documents/AI Recorder/models — whisper-модели
~/Documents/AI Recorder/config.json — настройки анализа
~/Documents/AI Recorder/log.txt — логи
Такой подход упрощает поддержку: приложение обновляется отдельно, пользовательские данные остаются на месте.
Почему desktop-подход важен
Что дает локальный контур
1) запись не зависит от браузера и его ограничений;
2) локальное хранение файлов по умолчанию;
3) predictable latency для операций UI/запись/воспроизведение;
4) работа с несколькими провайдерами анализа без смены инструмента.
Что важно понимать
Транскрибация выполняется локально, а качество/скорость зависят от модели и железа. Анализ может быть локальным (Ollama) или внешним (OpenAI/Server) — это управляется настройками.
Audio pipeline в проекте
Текущий поток обработки аудио:
1) старт записи;
2) захват микрофона;
3) параллельный захват системного звука (macOS sidecar / Windows loopback);
4) остановка записи;
5) микширование/конвертация в MP3 через ffmpeg;
6) запись финального файла в records.
Если speaker-поток недоступен, система сохраняет запись только с микрофона и логирует предупреждение.
Транскрибация: как сделано
Транскрибация вызывается из Rust-команды, но выполняется Python-скриптом с faster-whisper.
1) поиск доступной модели в models;
2) запуск Python-раннера по приоритету: embedded runtime -> project venv -> системный python;
3) на Windows есть ветка CUDA/CPU fallback;
4) при проблемах с GPU делается переключение на CPU;
5) если модуль не найден — попытка автоустановки зависимостей;
6) результат сохраняется как транскрипт для следующего этапа анализа.
Во фронтенде есть предварительная оценка времени транскрибации на основе длины аудио, платформы, модели и статистики прошлых запусков.
Анализ текста: что происходит
После транскрибации формируется full_prompt = PROMPT + transcript и отправляется в выбранный провайдер.
1) OpenAI (/v1/responses, fallback на chat completions);
2) Ollama (/api/generate);
3) Server (SERVER_URL, логин/пароль из профиля).
Ответ сохраняется в results/
Приветственный экран (startup health checks)
При старте приложение проверяет:
1) серверную авторизацию (SERVER_URL_AUTH) с проверкой mac_address;
2) наличие локальной whisper-модели;
3) профили анализа (OpenAI/Ollama/Server);
4) compute readiness для Mac/Windows/CUDA.
Если серверная авторизация не проходит, пользователь получает сценарий с ограничением продолжения.
Надежность и эксплуатация
1) централизованный лог warn/error/panic;
2) отправка лога на сервер для поддержки;
3) защита от закрытия окна во время записи;
4) автостоп записи через 2 часа;
5) проверка и fallback-маршруты для Python/CUDA.
Desktop vs SaaS в рамках решения
Ограничения текущей версии (честно)
Важно: в текущей кодовой базе нет полноценной diarization (кто говорит) и нет встроенного RAG-поиска по базе встреч.
Что есть сейчас:
1) единый транскрипт встречи;
2) отдельный этап анализа на базе промпта.
Что можно добавить следующими этапами:
1) speaker diarization + сегменты по таймкодам;
2) поиск по встречам (ключевой/семантический);
3) метрики качества (WER, latency dashboard, пер-провайдер статистика);
4) anti-hallucination слой с цитатами и ссылками на фрагменты транскрипта.
Для кого подходит
1) команды, которым нужен контролируемый desktop-контур;
2) внутренние встречи с чувствительным содержанием;
3) процессы, где важны скорость подготовки summary и action items;
4) гибридные сценарии с разными AI-провайдерами.
FAQ
Работает ли офлайн?
Запись, хранение, воспроизведение и локальная транскрибация — да. Анализ зависит от провайдера: Ollama может быть локальным, OpenAI/Server требуют доступ к endpoint.
Нужен ли глобально установленный Python?
В актуальной сборочной схеме используется embedded runtime, чтобы снизить зависимость от системного Python.
Где лежит конфиг окружения?
Приоритетно читается .env из ~/Documents/AI Recorder/.env, плюс fallback-кандидаты.
Что делать при ошибках качества транскрибации?
Проверить модель, качество входного аудио и compute-профиль; при необходимости скорректировать конфигурацию и переснять запись.
Key takeaways
1) Это не «просто диктофон», а связанный desktop pipeline от записи до аналитического результата.
2) Сильная сторона реализации — локальный контур данных, гибкие провайдеры анализа и эксплуатационная устойчивость.
3) Текущая версия уже практична для рабочих встреч и готова к расширению (diarization, поиск, контроль качества).
Нужен разбор под ваш сценарий встреч?
Покажу, как адаптировать контур записи, транскрибации и анализа под ваши требования к приватности, скорости и инфраструктуре.
Связаться в Telegram →