Этот телеграм-бот предназначен для автоматического озвучивания видеосообщений («кружков») с жестовым языком. Бот принимает видео, распознает жесты, определяет эмоцию, генерирует соответствующую озвучку (TTS) и накладывает аудио обратно на видео.
HandTalkerAPI/
├── src/
│ ├── main.py # Точка входа: запуск Telegram-бота (Long Polling)
│ ├── bot/
│ │ ├── __init__.py
│ │ └── handlers.py # Обработка команд и входящих видеосообщений
│ ├── services/
│ │ ├── video_processor.py # Главный оркестратор: пайплайн обработки видео
│ │ ├── sign_to_text/ # Распознавание жестового языка (MediaPipe + LSTM)
│ │ │ ├── realtime_tester.py # Логика инференса и анализа видео
│ │ │ └── sign_to_text_service.py # Обертка над моделью
│ │ ├── emotion_service.py # Анализ доминантной эмоции
│ │ ├── tts_service/ # Генерация голоса (Coqui TTS)
│ │ └── audio_overlay_service.py # Наложение аудио на видео (MoviePy + Pydub)
│ ├── utils/
│ │ └── file_utils.py # Утилиты (безопасное удаление файлов на Windows)
├── temp/ # Временная папка для скачивания и обработки видео
├── .env # Конфигурация (BOT_TOKEN)
└── requirements.txt # Зависимости (Python 3.10)
Когда пользователь отправляет «кружок»:
- Bot Handlers: Скачивает
video_noteв папкуtemp/. - Video Processor:
- SignToText: Использует MediaPipe для извлечения ключевых точек (Pose/Hands) и LSTM-модель для распознавания слов.
- Emotion Analysis: Анализирует видео (или возвращает
neutralв качестве заглушки), чтобы модулировать голос. - TTS Service: Превращает распознанный текст в WAV-файл с учетом эмоции (скорость речи).
- Audio Overlay: Смешивает сгенерированное аудио с видеорядом, используя MoviePy. Звук проигрывается один раз, не зацикливаясь.
- Cleanup: Бот отправляет результат пользователю и удаляет временные файлы (с использованием
safe_removeдля избежания конфликтов блокировки на Windows).
- Виртуальное окружение (Python 3.10):
# Вы уже создали его в .venv - Настройка токена:
Создайте файл
.envв корне проекта:BOT_TOKEN=Ваш_Телеграм_Токен - Запуск бота:
.venv\Scripts\python src\main.py
Проект включает в себя механизмы для обхода ошибок WinError 32 (файл занят другим процессом). Перед удалением временных файлов вызывается gc.collect(), а сами MoviePy-объекты закрываются явно. В случае временной блокировки файла утилита safe_remove выполняет несколько попыток удаления.