Бот на Python, создающий аниме из фото с помощью нейросети QQ Different Dimension Me [Гайд]
Нейросети

Бот на Python, создающий аниме из фото с помощью нейросети QQ Different Dimension Me [Гайд]

Razilator

В этой статье мы рассмотрим процесс создания Telegram-бота с помощью Python и библиотеки aiogram, с фокусом на использовании нейросети QQ Anime AI.

Этот бот имеет уникальную возможность преобразовывать фотографии в стиле аниме, благодаря интеграции с нейросетью QQ Anime AI.

Первое, что нам необходимо, это получить токен телеграмм бота. Если у Вас он уже есть, переходите к следующему пункту.

Как получить токен телеграм бота (если уже есть, можете пропустить)

Теперь нам необходимо создать бота в телеграмме, делается это через @BotFather, начинаем диалог и вводим команду /newbot, выбираем имя, обязательно чтоб в имени присутствовало слово: Bot, или через подчеркивание _bot

Пример команды
Пример команды

Получаем ключ для доступа к API, на скриншоте он закрашен. Сохраняем в удобное место.

Создание виртуального окружения (если знаете как, можете пропустить)

Теперь нам необходимо создать телеграм бота работающего на основе QQ Anime AI / Different Dimension Me. Создавать бота мы будем с помощью библиотеки aiogram на Python. Поэтому через удобную для вас IDE создаете виртуальное окружение.

В примере воспользуемся IDE PyCharm.

  1. Нажимаем New Project, если вы уже находитесь в проекте, то File -> New Project.
В PyCharm -> New Project
В PyCharm -> New Project
  1. Далее выбираем Pure Python (Python проект) и путь до желаемого проекта. У меня например Ботостроение/AnimeAI. Виртуальное окружение создатся в папке venv, внутри проекта автоматически.
Создаем проект Python, выбираем путь и нажимаем Create
Создаем проект Python, выбираем путь и нажимаем Create
  1. Далее нажимаем Create и ждем создания проекта.
Созданный проект в PyCharm
Созданный проект в PyCharm
  1. Если у вас не создался файл main.py, просто создайте его: На папке проекта ЛКМ мышью -> New -> Python File с названием main.py
На папке проекта ЛКМ мышью -> New -> Python File с названием main.py
На папке проекта ЛКМ мышью -> New -> Python File с названием main.py
  1. В файле main.py мы и будем создавать нашего бота.
Файл main.py
Файл main.py

Создаем telegram бота с QQ Anime AI / Different Dimension Me

Теперь установим необходимые библиотеки через терминал в pyCharm для создания бота: pip install aiogram qqddm aiohttp

Установка необходимых библиотек для создания телеграм бота на aiogram с QQ Anime AI / Different Dimension Me
Установка необходимых библиотек для создания телеграм бота на aiogram с QQ Anime AI / Different Dimension Me

Результат выполнения установки:

Терминал
Collecting aiogram
  Using cached aiogram-2.25.1-py3-none-any.whl (203 kB)
Collecting qqddm
  Using cached qqddm-0.1.1-py3-none-any.whl
Collecting aiohttp
  Using cached aiohttp-3.8.4-cp311-cp311-win_amd64.whl (317 kB)
Collecting Babel<2.10.0,>=2.9.1
  Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB)
Collecting certifi>=2021.10.8
  Using cached certifi-2023.5.7-py3-none-any.whl (156 kB)
Collecting magic-filter>=1.0.9
  Using cached magic_filter-1.0.9-py3-none-any.whl (9.3 kB)
Collecting httpx~=0.23.1
  Using cached httpx-0.23.3-py3-none-any.whl (71 kB)
Collecting pydantic~=1.10.2
  Using cached pydantic-1.10.7-cp311-cp311-win_amd64.whl (2.1 MB)
Collecting attrs>=17.3.0
  Using cached attrs-23.1.0-py3-none-any.whl (61 kB)
Collecting charset-normalizer<4.0,>=2.0
  Using cached charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl (96 kB)
Collecting multidict<7.0,>=4.5
  Using cached multidict-6.0.4-cp311-cp311-win_amd64.whl (28 kB)
Collecting async-timeout<5.0,>=4.0.0a3
  Using cached async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Collecting yarl<2.0,>=1.0
  Using cached yarl-1.9.2-cp311-cp311-win_amd64.whl (60 kB)
Collecting frozenlist>=1.1.1
  Using cached frozenlist-1.3.3-cp311-cp311-win_amd64.whl (32 kB)
Collecting aiosignal>=1.1.2
  Using cached aiosignal-1.3.1-py3-none-any.whl (7.6 kB)
Collecting pytz>=2015.7
  Using cached pytz-2023.3-py2.py3-none-any.whl (502 kB)
Collecting httpcore<0.17.0,>=0.15.0
  Using cached httpcore-0.16.3-py3-none-any.whl (69 kB)
Collecting rfc3986[idna2008]<2,>=1.3
  Using cached rfc3986-1.5.0-py2.py3-none-any.whl (31 kB)
Collecting sniffio
  Using cached sniffio-1.3.0-py3-none-any.whl (10 kB)
Collecting typing-extensions>=4.2.0
  Using cached typing_extensions-4.5.0-py3-none-any.whl (27 kB)
Collecting idna>=2.0
  Using cached idna-3.4-py3-none-any.whl (61 kB)
Collecting h11<0.15,>=0.13
  Using cached h11-0.14.0-py3-none-any.whl (58 kB)
Collecting anyio<5.0,>=3.0
  Using cached anyio-3.6.2-py3-none-any.whl (80 kB)
Installing collected packages: rfc3986, pytz, typing-extensions, sniffio, multidict, magic-filter, idna, h11, frozenlist, charset-normalizer, certifi, Babel, attrs, async-timeout, yarl, pydantic, anyio, aiosignal, httpcore, aiohttp, httpx, aiogram, qqddm
Successfully installed Babel-2.9.1 aiogram-2.25.1 aiohttp-3.8.4 aiosignal-1.3.1 anyio-3.6.2 async-timeout-4.0.2 attrs-23.1.0 certifi-2023.5.7 charset-normalizer-3.1.0 frozenlist-1.3.3 h11-0.14.0 httpcore-0.16.3 httpx-0.23.3 idna-3.4 magic-filter-1.0.9 multidict-6.0.4 pydantic-1.10.7 pytz-2023.3 qqddm-0.1.1 rfc3986-1.5.0 sniffio-1.3.0 typing-extensions-4.5.0 yarl-1.9.2

[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: python.exe -m pip install --upgrade pip

Теперь в файле main.py напишем следующий фрагмент кода:

main.py
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from qqddm import AnimeConverter, InvalidQQDDMApiResponseException, IllegalPictureQQDDMApiResponseException
from aiohttp import ClientSession

telegram_token = 'Ваш токен телеграмм'

bot = Bot(token=telegram_token)
dp = Dispatcher(bot)

anime_converter = AnimeConverter(generate_proxy='https://address:port')


@dp.message_handler(content_types=types.ContentType.PHOTO)
async def send_image(message: types.Message):
    """
    Получение изображения от пользователя
    """
    await message.answer_chat_action('upload_photo')
    # Берем последнее (самое большое) фото
    photo = message.photo[-1]
    photo_id = photo.file_id
    # Получаем информацию о файле из API
    file_info = await bot.get_file(photo_id)
    file_path = file_info.file_path
    # Скачиваем файл
    downloaded_file = await bot.download_file(file_path)
    # Получаем байты изображения
    image_bytes = downloaded_file.read()
    try:
        # Получаем результат
        result = anime_converter.convert(picture=image_bytes)
        images = [str(url) for url in result.pictures_urls]
        async with ClientSession() as session:
            async with session.get(images[0]) as response:
                content = await response.read()
        # Отправляем изображение пользователю
        await message.answer_photo(content, caption='Ваше изображение готово')
    except IllegalPictureQQDDMApiResponseException:
        await message.answer(text='Предоставленное изображение запрещено, попробуйте другое изображение')
    except InvalidQQDDMApiResponseException as ex:
        await message.answer(text=f'API вернул ошибку: {ex}')


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Данный код представляет собой скрипт на языке Python, использующий библиотеку aiogram для создания Telegram-бота. Этот бот принимает фотографии от пользователей, скачивает их, обрабатывает с помощью внешнего сервиса QQDDM для конвертации в аниме-стиль, и отправляет результат обратно пользователю.

Давайте разберем его по шагам:

Импортируются необходимые модули и классы:

  • Bot и Dispatcher из aiogram - классы, отвечающие за создание бота и управление сообщениями и командами.
  • types из aiogram - модуль, содержащий типы данных, используемые в aiogram, такие как Message, ContentType, и т.д.
  • executor из aiogram.utils - модуль, предоставляющий функцию start_polling для запуска бота.
  • AnimeConverter, InvalidQQDDMApiResponseException, IllegalPictureQQDDMApiResponseException из qqddm - классы и исключения, связанные с конвертацией изображений в аниме-стиль.
  • ClientSession из aiohttp - класс для выполнения HTTP-запросов.
  • Задается токен Telegram-бота, который получается при регистрации бота в BotFather.
  • Создается объект Bot с использованием полученного токена.
  • Создается объект Dispatcher, связанный с созданным ранее объектом Bot. Он отвечает за обработку сообщений и команд.
  • Создается объект AnimeConverter, который будет использоваться для конвертации изображений в аниме-стиль.
  • В данном случае, объекту передается параметр generate_proxy, потому что запустив скрипт из России вы будете получать ошибку. Используйте прокси который указывает на адрес и порт прокси-сервера, либо включенный клиентский VPN на вашем компьютере, или разверните бота на VPS из стран ЕС.
  • Определяется функция-обработчик сообщений с типом контента PHOTO. Эта функция будет вызываться каждый раз, когда пользователь отправляет фотографию боту.

Внутри функции-обработчика происходит следующее:

  • Отправляется действие upload_photo, чтобы показать пользователю, что бот загружает фото.
  • Из полученного сообщения извлекается последняя (самая большая) фотография и ее идентификатор.
  • Запрашивается информация о файле с помощью метода get_file объекта bot и получается путь к файлу.
  • Файл скачивается с помощью метода download_file объекта bot.
  • Из скачанного файла получаются байты изображения.
  • Происходит попытка конвертировать изображение в аниме-стиль с помощью метода convert объекта anime_converter.

Если конвертация прошла успешно:

  • Получается список URL-адресов изображений.

  • Создается асинхронный HTTP-сеанс с помощью ClientSession.

  • Отправляется GET-запрос по первому URL-адресу изображения.

  • Получается содержимое ответа в виде байтов.

  • Отправляется пользователю фото с помощью метода answer_photo объекта message.

  • Если получена ошибка IllegalPictureQQDDMApiResponseException, отправляется пользователю сообщение о запрещенном изображении.

  • Если получена ошибка InvalidQQDDMApiResponseException, отправляется пользователю сообщение с описанием ошибки API.

  • В блоке if __name__ == '__main__': запускается бот с помощью функции start_polling, которая принимает объект Dispatcher (dp) и флаг skip_updates=True.

Это основной код, который определяет логику бота для обработки фотографий и их конвертации в аниме-стиль с использованием внешнего сервиса QQ Anime AI / Different Dimension Me.

Проверка работы Telegram-бота QQ Anime AI / Different Dimension Me

Скриншот выполненной конвертации фото в аниме стиль 1
Скриншот выполненной конвертации фото в аниме стиль 1
Скриншот выполненной конвертации фото в аниме стиль 2
Скриншот выполненной конвертации фото в аниме стиль 2

На этом гайд окончен. Ссылка на репозиторий в GitHub.

;