Собрал полностью локального голосового ассистента без облаков и подписок. Выкладываю в open source

в 17:17, , рубрики: llm, open source, python, STT, TTS
основное окно приложения

основное окно приложения

Привет!

Пока весь мир заворачивает платные API в красивые обёртки, мне захотелось сделать что-то полностью автономное, конфиденциальное и бесплатное. Результат — App AI Assistant: локальный компаньон, с которым можно поговорить, и голосовой ассистент («Джарвис» на минималках), работающий на 100% оффлайн на вашем ПК.

Проект полностью открытый, исходный код опубликован под лицензией MIT. Мне интересно было не просто «поиграться», а подружить нейросети в реальном времени.

Что умеет ассистент:

  • Говорить и слушать в реальном времени: ответ начинается порционно, не дожидаясь генерации всей фразы.

  • Умное прерывание (Barge-in): ассистент мгновенно замолкает на полуслове, если вы его перебили.

  • Управлять ПК: через голосовые команды запускает любые ваши Python-скрипты (открыть папку, браузер, запустить софт).

  • Расширяемость скриптов: можно добавлять ссылки и скрипты, которые имеют свое виртуальное окружение (директория должна называться .venv).

  • Помнить контекст: сохраняет краткое резюме диалогов между сессиями.

  • Возможность гибкой настройки ассистента.

Возможность гибкой настройки ассистента

Возможность гибкой настройки ассистента

Смотреть видео-демонстрацию на Яндекс.Диске

❕ Без Яндекс аккаунта видео может быть не доступно, дублирую его в релизе, под названием app_ai_assistant_demo.mp4

Релиз на GitHub

📖 Как это устроено под капотом (Архитектура):

Проект написан на Python 3.12 и Asyncio. Чтобы интерфейс не фризило, а инференс не лагал, я разбил систему на 4 изолированных компонента, общающихся по HTTP и WebSocket:

  1. Оркестратор (GUI) на CustomTkinter — дирижёр всей системы.

  2. Движок мышления (LLM) — локальная Gemma 3 через llama-cpp-python.

  3. Гибридные уши (STT) — связка Vosk (как быстрый детектор речи и прерываний) и Faster-whisper (для точной финальной транскрибации).

  4. Голос (TTS) — оффлайн-синтез Silero с кастомным пайплайном нормализации текста (чтобы робот не ломался на аббревиатурах и числах).

А вот так выглядит процесс инициализации и подъёма всех микросервисов лаунчером при старте:

принцип запуска сервисов

принцип запуска сервисов
Почему не используется Docker?

В какой-то момент я задал себе вопрос: а нужен ли здесь Docker? Для микросервисов это стандарт де-факто, но у меня была четкая цель — сделать развертывание максимально легким для обычного пользователя. Docker Desktop для Windows — это гигабайты дискового пространства, настройка WSL2 и виртуализация в BIOS. Обычный пользователь, который просто хочет поговорить с ассистентом, не должен проходить через этот квест. Поэтому я выбрал путь «нативного» развертывания. У меня есть свой Launcher, который запускает легковесные Python-процессы напрямую. А в идеале все это собирается в один .exe (через PyInstaller), где пользователю достаточно запустить один файл. Docker — это круто для облачных кластеров, но для локального десктопного AI-ассистента он стал бы лишним слоем абстракции и барьером для аудитории.

А здесь показано, как бегают данные и звук в реальном времени, когда вы общаетесь с ассистентом или перебиваете его:

взаимодействие компонентов

взаимодействие компонентов

▶ Как запустить: быстрый способ и сборка из исходников

Я знаю, как тяжело разворачивать локальный ИИ (venv, зависимости, компиляция, скачивание моделей), поэтому написал srv_installer — отдельный мастер установки. Он сам скачает portable-версии Python и Git, создаст окружение, подтянет стабильные хеши репозиториев и соберет .exe прямо на месте.

Установленный Python или Git на машине не обязателен. Установщик рассчитан под пользователя, не умеющего в разработку. Он скачает все необходимые ассеты (проверив sha256), клонирует репозитории, создаст .venv, поставит зависимости и соберет .exe приложения через PyInstaller. 3 клика и всё готово.

загрузка ассетов

загрузка ассетов
сборка компонентов приложения

сборка компонентов приложения
завершение установки

завершение установки

⚠ Ограничения на текущий момент времени:

  • windows only - ассистент проверялся на win10/win11

  • gemma llm - из моделей пока адаптировано только под шаблон gemma

  • наушники - пока что я не успел адаптировать aec вычитатель, поэтому система работает только при условии, что выходной звук не попадает на микрофон.

🧩 Бонус: используйте сервисы отдельно (не только в ассистенте)

Проект разбит на три независимых микросервиса. Вы можете использовать их в любых комбинациях и независимо друг от друга:

  • srv_llm — «мозг» приложения (локальная LLM через llama.cpp).

  • srv_tts — «голос» приложения (синтез речи Silero).

  • srv_stt — «уши» приложения (распознавание речи Vosk + Faster-Whisper).

Каждый сервис — это отдельный HTTP-сервер, который можно запустить одной командой:

app.exe run-server --port {номер_порта}

Это значит, что вы можете писать на любом языке программирования (Python, C#, Java, JavaScript, Go — не важно) и просто обращаться к нужному сервису по HTTP. Хотите добавить голосовое управление в свой проект на C#? Поднимите srv_stt и srv_tts, и отправляйте запросы. Хотите локальную LLM в Java-приложении? Поднимите srv_llm и работайте с ним как с обычным API.

Подробности запуска и API — в README каждого репозитория.

🧰 Бонус для Python-разработчиков: infrastructure2 — как я борюсь с рутиной

Когда проектов становится больше одного, начинается рутина: копирование одних и тех же утилит (логирование, работа с путями, HTTP-клиенты, сборка .exe) из репозитория в репозиторий. Рано или поздно это превращается в «зоопарк» из дубликатов, которые расходятся в разные стороны.

Чтобы этого избежать, я вынес все общие компоненты в отдельный монорепозиторий — infrastructure2. Это не «библиотека ради библиотеки», а централизованное управление инфраструктурой: вместо того чтобы тащить в каждый проект огромный зоопарк зависимостей (requests, typer, pydantic и т.д.), подключается только то, что реально нужно.

Что внутри:

  • MessageBus — шина сообщений и логирование.

  • GitClient — автоматизация отправки обновлений в репозиторий.

  • PathUtils — утилиты для работы с путями (поиск корня проекта и т.д.).

  • Builder — сборка исполняемых файлов (.exe, .bin).

  • HttpClients — HTTP-клиент для запросов и загрузки файлов.

  • cli_utils — CLI-утилиты (typer).

  • settings-manager — менеджер настроек (pydantic, JSON, .env).

  • server — запуск сервера на FastAPI.

  • process-utils — управление процессами.

  • streaming — набор стриминговых клиентов.

  • tk_ui — виджеты для быстрого создания UI.

  • log-utils — обёртки для логирования.

Как подключить (пример для pyproject.toml):

"infrastructure2 @ git+https://github.com/Mike2024New/infrastructure2.git"

Важное примечание: репозиторий пока слабо документирован (это в разработке), но код рабочий и используется в моих проектах. Если вам нужны готовые утилиты для Python-проектов — берите и форкайте. Я буду рад, если это сэкономит кому-то время.

📜Итоги

app_ai_assistant - простой оффлайн компаньон, который может также работать в качестве Jarvis помощника (с расширяемых скриптов). Установка максимально проста и от пользователя не требуется каких либо технических навыков. Подробное видео можно посмотреть здесь

Релиз

Исходный код

Буду рад любой обратной связи.

P.S. Если вы ищете специалиста по автоматизации бизнес-процессов или AI-интегратора — я открыт к предложениям. Мой профиль: Python, API-интеграции, локальные LLM, автоматизация рутины.

Для связи: mix2025mix@yandex.ru (в теме письма укажите «Хабр / AI-ассистент»). Исходный код и контакты также доступны в моём профиле GitHub.

Автор: Mike2024New

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js