Бот для озвучивания сообщений из чата Twitch за баллы канала с использованием OmniVoice
Проект позволяет зрителям обменивать баллы канала на озвучивание своих сообщений. Бот подписывается на событие через EventSub, отслеживает активацию определённой награды канала и синтезирует речь в реальном времени с помощью нейросетевой модели OmniVoice
- Интеграция с Twitch EventSub через награды канала (Channel Points)
- Синтез речи на основе OmniVoice
- Поддержка русского языка
- Использование собственных голосовых датасетов
- Возможность обработки на GPU
- Автоматическое переподключение при обрыве связи
- Python 3.12 (проект разработан и протестирован на этой версии)
- NVIDIA GPU с CUDA (опционально, для ускорения генерации)
git clone kiraping1337/ChatTwitchTTS
cd ChatTwitchTTSpython -m venv .venv
.venv\Scripts\activate # WindowsДля GPU (NVIDIA):
- Проверьте версию CUDA:
nvidia-smiПосмотрите на строку "CUDA Version" в правом верхнем углу вывода.
- Установите PyTorch с поддержкой CUDA. Пример:
CUDA 12.8:
pip install torch==2.8.0+cu128 torchaudio==2.8.0+cu128 --extra-index-url https://download.pytorch.org/whl/cu128pip install omnivoicepip install sounddevice websockets requests В корневой директории проекта создайте файл login.json со следующим содержимым:
{
"token": "ваш oauth токен",
"client_id": "ваш client id",
"broadcaster_id": "id пользователя",
"reward_id": "id награды канала"
}- token — OAuth токен. Получить можно несколькими способами:
- Простой способ: https://twitchtokengenerator.com/ (выберите "Bot Chat Token" и авторизуйтесь)
- Официальный способ: создайте приложение на https://dev.twitch.tv/console/apps и получите токен через OAuth flow
- Важно: token в файле указывается БЕЗ префиксов
oauth:илиBearer
- client_id — ID клиента. Получается аналогично OAuth токену через https://twitchtokengenerator.com/ или через запрос к API
- broadcaster_id — ID пользователя. Получается через запрос к API либо через скрипт test_token.py в данном репозитории. Для получения необходим OAuth token и client id
- reward_id — ID награды канала. Как получить:
- Создайте награду канала в панели стримера (Creator Dashboard → Community → Channel Points → Manage Rewards & Challenges)
- Активируйте эту награду в чате
- Используйте скрипт test_token.py в данном репозитории или запросите ID через Twitch API
Перейдите в папку refs_wavs и поместите туда:
- Отдельные
.wavфайлы с образцами голоса
Перейдите в папку refs_texts и поместите туда:
- Отдельные
.txtфайлы с расшифровкой образца голоса
Укажите путь к файлам в переменной refs в формате:
refs = {"refs_wavs/НАЗВАНИЕ_ФАЙЛА.wav":"refs_texts/НАЗВАНИЕ_РАСШИФРОВКИ.txt"}Требования к аудио:
- Формат: WAV (обязательно)
- Частота дискретизации: любая (автоматически ресэмплируется)
- Каналы: mono или stereo (stereo автоматически конвертируется в mono)
- Качество: чистая речь без фонового шума, эха и посторонних звуков
- Длительность: минимум 6 секунд, рекомендуется 20 секунд для качественного клонирования голоса
- Содержание: эмоционально нейтральная речь даёт лучшие результаты
python main.py- Бот подписывается на событие через EventSub, отслеживает активацию определённой награды канала
- Зрители активируют награду канала (указанную в
reward_id), вводят текст - Сообщение автоматически попадает в очередь и озвучивается
- При каждом запросе случайным образом выбирается один голос из доступных датасетов
- Озвучка воспроизводится через системный аудиовыход
В консоли вы увидите:
Устройство: cuda # или cpu
Загрузка модели
Подключено к Twitch EventSub
Session ID: #айди сессии
Подписка создана
Получено событие
Награда: Озвучить сообщение (ID: #айди активируемой награды )
Пользователь:
Текст: 'текст сообщения'
Ожидаемый ID: #айди ожидаемой награды
Совпадение: True # или False если была активирована другая награда
- Проверьте правильность введенных данных в
login.json - Убедитесь, что токен действителен (они могут истекать). Для проверки используйте скрипт test_token.py
- Проверьте, что в
tokenНЕ указан префиксoauth:илиBearer - Попробуйте сгенерировать новый токен
- Проверьте, что
reward_idсоответствует созданной награде канала - Убедитесь, что награда активна в настройках канала
- Попробуйте активировать награду сами для теста
- Убедитесь, что установлен PyTorch правильной версии
- Проверьте наличие интернета при первом запуске (модель скачивается ~3GB)
- Проверьте свободное место на диске
- Используйте более качественные датасеты (чистая запись, хороший микрофон)
- Увеличьте длительность референсных аудио
- Проверьте правильность текстовой расшифровки
- Экспериментируйте с параметрами
position_temperatureиnum_step
- Это нормально для CPU, рассмотрите использование GPU
- Уменьшите длину сообщений (установите лимит символов в награде)
- Закройте другие программы для освобождения ресурсов
В функции text_to_speech можно настроить:
position_temperature: стабильность vs. естественность (по умолчанию 4.0). Более высокие значения увеличивают случайностьnum_step: Количество итеративных шагов демаскировки. Более высокие значения улучшают качество, но замедляют генерацию (по умолчанию 64)
Строка 22: Поменяйте на speech_queue = queue.Queue(maxsize=РАЗМЕР ОЧЕРЕДИ)