Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions .env

This file was deleted.

29 changes: 19 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
.vscode

# Pylance
pyrightconfig.json

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.env
.env.local
.env.production
.env.staging
.env.development

*.so
.Python
build/
develop-eggs/
Expand All @@ -30,22 +33,28 @@ wheels/
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
venv/
env/
ENV/
env.bak/
venv.bak/
.venv/
.virtualenvs/
.env/
.venv

*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

syn_out/
checkpoints/
.gradio

# Ignore generated sample .wav files
**/*.wav
chattractive.bd
chattractive.db
models/
!chattractive/vendor/chatterbox/models/
!chattractive/vendor/chatterbox/models/**
97 changes: 55 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
# Chattractive

Интерактивный Telegram‑бот, который отвечает на вопросы об ИТМО, используя локальную базу знаний из папки `data`. Бот поддерживает работу в автоматическом режиме (ответы от Gemini), ручной режим общения с администраторами и генерацию голосовых ответов на основе модели Chatterbox.
Chattractive — Telegram‑бот, который отвечает на вопросы об ИТМО и умеет озвучивать ответы.
Он сочетает локальную базу знаний, обращение к Gemini и мультиязычную озвучку Chatterbox.

## Возможности

- 📚 **RAG-пайплайн**: вопросы пользователя сопоставляются с документами из `data`, а релевантные фрагменты передаются в Gemini.
- 💬 **Диалог с памятью**: история сообщений хранится в SQLite и используется при формировании ответов.
- 👨‍👩‍👧 **Ручной режим**: сообщения пересылаются в группу администраторов, ответы из группы доставляются пользователю (включая голосовые).
- 🔊 **Голосовые сообщения**: бот может озвучивать ответы через модуль `app/audio` (опционально).
- 🧹 **Управление с клавиатуры**: перезапуск диалога, переключение режимов и голосовых ответов в один клик.
- 📚 **Векторный поиск по базе знаний**: документы из `data/` разбиваются на фрагменты,
для них строится TF‑IDF‑эмбеддинг, а ответы подбираются по косинусной близости.
- 💬 **Диалог с памятью**: история сообщений хранится в SQLite и передаётся в Gemini.
- 👨‍👩‍👧 **Ручной режим**: сообщения можно пересылать операторам и получать ответы из группы.
- 🔊 **Голосовые сообщения**: по желанию бот проговаривает ответы через Chatterbox.
- 🧹 **Управление с клавиатуры**: перезапуск диалога, переключение режимов и голоса одной кнопкой.

## Быстрый старт
## Установка и запуск

1. **Создайте виртуальное окружение** и установите зависимости:
1. **Создайте виртуальное окружение и установите зависимости**:

```bash
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
-3.11 -m venv venv
venv/Scripts/Activate
pip install -e .

#Для использование cuda, нужно указать VOICE_DEVICE=cuda в окружении и дополнительно ввести команды:

pip uninstall torch torchaudio
pip install --index-url https://download.pytorch.org/whl/cu124 torch==2.6.0 torchaudio==2.6.0
```

2. **Подготовьте переменные окружения**. Скопируйте `env.example` в `.env` и заполните значения:
2. **Заполните переменные окружения**. Скопируйте `env.example` в `.env` и пропишите значения:

```bash
cp env.example .env
Expand All @@ -31,54 +37,61 @@

- `TELEGRAM_BOT_TOKEN` — токен вашего бота.
- `GOOGLE_API_KEY` — ключ доступа к Gemini.
- `ADMIN_GROUP_ID` — идентификатор Telegram-группы администраторов.
- `ADMIN_GROUP_ID` — идентификатор Telegramгруппы операторов.

Необязательные параметры:

- `DATA_DIRECTORY` — путь к папке с текстами (по умолчанию `data`).
- `DATABASE_PATH` — путь к файлу SQLite (по умолчанию `chattractive.db`).
- `DATABASE_PATH` — путь к SQLite‑файлу (по умолчанию `chattractive.db`).
- `GEMINI_MODEL` — модель Gemini (по умолчанию `gemini-2.0-flash-exp`).
- `AUDIO_MODEL_DIR` - ??????? ? ?????? Chatterbox (?? ????????? ./models).
- `VOICE_DEVICE` - ?????????? ??? ????????? ????? (`cpu`, `cuda` ? ?.?.).
- `VOICE_LANGUAGE` - ???????? ??? ??? ??????? (????????, `ru`, `en`).
- `AUDIO_MODEL_DIR` — каталог с весами Chatterbox (по умолчанию `./models`).
- `VOICE_DEVICE` — устройство для TTS (`cpu`, `cuda`, `mps`).
- `VOICE_LANGUAGE` — язык синтеза (`ru`, `en`, и т.д.).

3. **Подготовьте данные**. Поместите в `data/` текстовые файлы (`.txt`, `.md`, `.rst`) с актуальной информацией.

3. **Заполните папку `data/`** текстовыми файлами (`.txt`, `.md`, `.rst`) с актуальной информацией.

4. **Запустите бота**:
4. **Скачайте веса TTS (опционально)**:

```bash
python load_model.py # downloads Chatterbox multilingual TTS weights if missing
python main.py
python load_model.py
```

By default multilingual weights are cached in ./models; keep AUDIO_MODEL_DIR unset to reuse that folder automatically.
Supported language ids include: ar, da, de, el, en, es, fi, fr, he, hi, it, ja, ko, ms, nl, no, pl, pt, ru, sv, sw, tr, zh.

## Архитектура

- `app/AI/knowledge_base.py` — загрузка и поиск по локальной базе знаний.
- `app/AI/chat_service.py` — формирование промптов и вызовы Gemini.
- `app/db/storage.py` — простой слой работы с SQLite.
- `app/bot/bot.py` — обработка сообщений Telegram и управление режимами.
- `app/audio/voice_service.py` — обертка над Chatterbox TTS.
- `main.py` — точка входа, сборка всех компонентов.

## Голосовые ответы
Команда сохранит мультиязычную модель Chatterbox в каталог `models/`. Можно задать собственный путь через `AUDIO_MODEL_DIR`.

Модуль `VoiceSynthesizer` использует Chatterbox. Для работы скачайте веса модели и укажите путь в `AUDIO_MODEL_DIR`. Если модель не загружена, бот будет отвечать только текстом.
5. **Запустите бота**:

## Ручной режим
```bash
python main.py
```

При активации ручного режима сообщения пользователя пересылаются в группу администраторов (`ADMIN_GROUP_ID`). Ответы из этой группы, отправленные в режиме «ответить», автоматически доставляются пользователю. Поддерживаются текст, голосовые и любые вложения.
После запуска бот автоматически проиндексирует базу знаний, подключится к Gemini и начнёт принимать сообщения.

## Сброс истории
## Структура проекта

Нажмите «🔄 Перезапуск», чтобы очистить историю чата. Записи удаляются из базы данных, и диалог начинается заново.
```
chattractive/
├── ai/ # работа с Gemini и локальной БЗ
├── audio/ # обёртка над Chatterbox и голосовым сервисом
├── bot/ # Telegram-логика и сценарии общения
├── db/ # слой хранения истории и служебных настроек
└── vendor/chatterbox/ # вендорные модели TTS (Resemble AI)
```

---
- `chattractive/ai/knowledge_base.py` — загрузка документов и векторный поиск.
- `chattractive/ai/chat_service.py` — формирование промптов и диалог с Gemini.
- `chattractive/db/storage.py` — работа с SQLite и состоянием бота.
- `chattractive/bot/bot.py` — обработка сообщений Telegram и маршрутизация режимов.
- `chattractive/audio/voice_service.py` — озвучивание с нормализацией текста.
- `main.py` — точка входа и сборка всех компонентов.

Проект предназначен как отправная точка для внутренних ассистентов на базе Gemini. Расширяйте и дополняйте функциональность под свои сценарии.
## Голосовые ответы

`VoiceSynthesizer` динамически подгружает модель Chatterbox и использует Gemini только для нормализации текста.
В логах сохраняются лишь укороченные превью ответов, поэтому чувствительный текст не попадает в INFO‑логи.
Чтобы задать собственный голос, поместите эталон в файл и укажите путь в переменной `VOICE_PATH`.

## Ручной режим

При включении ручного режима сообщения пользователя пересылаются в группу `ADMIN_GROUP_ID`.
Ответ из группы, отправленный в режиме «ответить», автоматически доставляется пользователю
(поддерживаются текст, голос и вложения). История синхронизируется с базой для последующих обращений.
118 changes: 0 additions & 118 deletions app/AI/chat_service.py

This file was deleted.

11 changes: 0 additions & 11 deletions app/audio/__init__.py

This file was deleted.

3 changes: 3 additions & 0 deletions chattractive/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""Chattractive — Telegram assistant powered by Gemini and Chatterbox."""

__all__ = ["bot", "ai", "audio", "db", "vendor"]
File renamed without changes.
Loading