NeuroVT — это модульная система для создания AI-втубера с поддержкой голосового ввода (STT), синтеза речи (TTS), языковых моделей (LLM) и веб-интерфейса на Flask.
🎙️ Говорите — AI отвечает голосом.
🧩 Модульная архитектура — легко добавлять новые функции.
🌐 Всё управление через браузер.
- 🎤 STT (Speech-to-Text) — распознавание речи через
faster-whisper:- Основной микрофон — для ведущего (хост)
- Виртуальный микрофон — для гостей/чата (с префиксом в LLM)
- Горячие клавиши для каждого микрофона (настраиваются)
- 🔊 TTS (Text-to-Speech) — синтез речи через Silero:
- Вывод на динамики и/или виртуальный микрофон (VB-Cable и др.)
- Очередь сообщений, история, статус воспроизведения
- 🧠 LLM (Large Language Model) — подключение к OpenRouter API:
- Управление сессиями (создание, удаление, переименование)
- Ограничение контекста по токенам (автообрезка истории)
- Подсчёт токенов через
tiktoken - Гостевой префикс — автоматически добавляется к сообщениям с виртуального микрофона
- Fallback-ответы при отсутствии API-ключа
- Сброс всех настроек к дефолтным
- 💬 Чат с AI — удобный интерфейс с историей, индикатором печати и уведомлениями
- ⚙️ Веб-интерфейс — настройки, статус, история, управление модулями
- 🖥️ CLI-менеджер — установка, обновление, запуск (Windows/Linux)
- 📁 HTML-шаблоны модулей — каждый модуль может иметь свои шаблоны
git clone https://github.com/FreshLend/NeuroVT.git
cd NeuroVTWindows
Дважды кликните run.bat
Linux:
chmod +x run.sh
./run.shДля использования разделения на "хозяин" + "гость":
- Установите VB-Cable Virtual Audio Cable (или аналог)
- В настройках STT укажите:
- Основной микрофон — ваш реальный микрофон
- Виртуальный микрофон —
CABLE Input (VB-Audio Virtual Cable)
- В настройках LLM задайте Префикс гостя (например
"[YunaAi]: ")
Теперь всё, что распознаётся с виртуального микрофона, будет отправляться в LLM с этим префиксом.
NeuroVT/
├── main.py # Точка входа (Flask + модули)
├── run.bat / run.sh # CLI-менеджер
├── requirements.txt # Основные зависимости
├── config.py # Отключение модулей (DISABLED_MODULES)
├── core/
│ ├── event_bus.py # Шина событий между модулями
│ └── module_loader.py # Загрузчик модулей
├── modules/
│ ├── base_module.py # Базовый класс для модулей
│ ├── tts_module/ # TTS (Silero)
│ │ ├── settings.json # Сохраняемые настройки
│ │ └── templates/ # HTML-шаблоны
│ ├── stt_module/ # STT (Faster-Whisper)
│ │ ├── settings.json
│ │ └── templates/
│ └── llm_module/ # LLM (OpenRouter)
│ ├── settings.json
│ ├── chats.json # История всех сессий
│ └── templates/
└── templates/ # Общие шаблоны
├── base.html
├── index.html
└── settings.html
- Модель:
faster-whisper(small, int8) - Два независимых микрофона:
- Основной — горячая клавиша
Ctrl+Shift+M(по умолчанию) - Виртуальный — горячая клавиша
Ctrl+Shift+V(по умолчанию)
- Основной — горячая клавиша
- Выбор языка распознавания (авто/русский/английский и др.)
- Отправляет текст в LLM через событие
llm_voice_input(источник указывается:microphoneилиvirtual_microphone)
- Модель: Silero (v3_1_ru)
- Голоса: Айдар, Бая, Ксения, Ксения (альт), Евгений
- Качество: 24 кГц / 48 кГц
- Режимы вывода:
- Только динамики
- Только виртуальный микрофон
- Динамики + виртуальный микрофон
- Выбор конкретного устройства вывода для каждого режима
- Поддержка моделей через OpenRouter API
- Сессии чатов:
- Создание / удаление / переименование сессий
- Автоматическое сохранение истории в
chats.json - Переключение между сессиями
- Управление контекстом:
- Ограничение по токенам (
context_token_limit) - Автообрезка истории при превышении лимита
- Подсчёт токенов через
tiktoken
- Ограничение по токенам (
- Гостевой режим:
- Настраиваемый префикс для сообщений с виртуального микрофона
- Автоматическое добавление к тексту перед отправкой в LLM
- Fallback-ответы при отсутствии API-ключа или ошибках сети
В файле config.py можно отключить ненужные модули:
DISABLED_MODULES = ["STT_Module", "TTS_Module"] # Удаление ненужного модуляЕсли вы не используете run.bat / run.sh:
# Создать виртуальное окружение
python -m venv venv
# Активировать
source venv/bin/activate # Linux
venv\Scripts\activate # Windows
# Установить основные зависимости
pip install -r requirements.txtМодули автоматически устанавливают свои зависимости при первом запуске через CLI-менеджер.
- Зарегистрируйтесь на openrouter.ai
- Создайте API-ключ
- В веб-интерфейсе перейдите в Настройки → LLM
- Вставьте ключ в поле OpenRouter API Key и нажмите Сохранить все настройки
- Настройте:
- Лимит контекста (токенов) — чем выше, тем лучше память
- Префикс гостя — будет добавляться к виртуальному микрофону
- Fallback ответы — на случай ошибки API
Без ключа будут использоваться fallback-ответы (офлайн-режим).
- Запустите
run.batили./run.sh - Выберите Full installation (1)
- Откройте браузер →
http://localhost:5000 - В Настройки → LLM введите API-ключ OpenRouter
- Вернитесь на главную → вкладка Чат с AI
- Нажмите Ctrl+Shift+M, чтобы включить основной микрофон
- Скажите что-нибудь — AI ответит голосом!
- Установите виртуальный аудиокабель (VB-Cable)
- В Настройки → STT:
- Основной микрофон = ваш реальный микрофон
- Виртуальный микрофон =
CABLE Input
- В Настройки → LLM:
- Префикс гостя =
"[OvsyaAi]: "
- Префикс гостя =
- Направьте аудиопоток из Discord или любого приложения в виртуальный кабель
- Нажмите Ctrl+Shift+V для активации виртуального микрофона
| Событие | Отправитель | Данные |
|---|---|---|
tts_speak |
LLM / любой модуль | {"text": "...", "source": "..."} |
stt_text_ready |
STT | {"text": "...", "is_final": true, "language": "...", "source": "microphone/virtual_microphone"} |
llm_voice_input |
STT | {"text": "...", "source": "microphone/virtual_microphone", "timestamp": "..."} |
def on_load(self):
self.event_bus.subscribe("tts_speak", self.handle_tts)
def handle_tts(self, data):
text = data.get("text", "")
print(f"Озвучить: {text}")- Создайте папку в
modules/, напримерmodules/my_module/ - Создайте папку
templates/внутри неё - Создайте
my_module.py:
from modules.base_module import BaseModule
from flask import jsonify
class MyModule(BaseModule):
name = "my_module"
display_name = "Мой модуль"
def register_routes(self):
@self.app.route('/api/my_module/hello')
def my_hello():
return jsonify({"message": "Hello from my module!"})
def register_main_tab(self):
return ("Моя вкладка", self.get_template_content("main_tab.html"))
def register_settings_ui(self):
return self.get_template_content("settings.html")
def on_load(self):
print(f"[{self.display_name}] Загружен!")
self.event_bus.subscribe("some_event", self.handle_event)
def handle_event(self, data):
print(f"Получено событие: {data}")- Добавьте
requirements.txt(если нужны зависимости) - Создайте HTML-шаблоны в
modules/my_module/templates/:main_tab.html— содержимое вкладки на главной страницеsettings.html— содержимое вкладки настроек
- Перезапустите NeuroVT
- Проверьте
config.py— не отключён ли он вDISABLED_MODULES - Убедитесь, что в папке модуля есть файл
*_module.py
- Проверьте в настройках STT выбранное устройство
- Убедитесь, что микрофон не занят другим приложением
- Попробуйте перезапустить модуль кнопкой "Перезапустить"
- Проверьте режим вывода (динамики / виртуальный микрофон / оба)
- Убедитесь, что выбранное устройство вывода существует
- Попробуйте кнопку "Тест озвучки"
- Проверьте API-ключ в настройках LLM
- Нажмите Сохранить все настройки после вставки ключа
- Без ключа работают только fallback-ответы
Проект распространяется под лицензией MIT. Подробнее см. в файле LICENSE.