0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Введение</a></li>
1
<ul><li><a>Введение</a></li>
2
<li><a>Технические детали</a><ul><li><a>Telegram Bot и основные библиотеки</a></li>
2
<li><a>Технические детали</a><ul><li><a>Telegram Bot и основные библиотеки</a></li>
3
<li><a>Docker и Stable Diffusion</a></li>
3
<li><a>Docker и Stable Diffusion</a></li>
4
<li><a>API и система генерации</a></li>
4
<li><a>API и система генерации</a></li>
5
</ul></li>
5
</ul></li>
6
<li><a>Опции Телеграм-бота</a><ul><li><a>Выбор модели</a></li>
6
<li><a>Опции Телеграм-бота</a><ul><li><a>Выбор модели</a></li>
7
<li><a>Количество шагов</a></li>
7
<li><a>Количество шагов</a></li>
8
</ul></li>
8
</ul></li>
9
<li><a>Как это работает</a></li>
9
<li><a>Как это работает</a></li>
10
<li><a>Примеры работы бота</a></li>
10
<li><a>Примеры работы бота</a></li>
11
<li><a>Заключение</a></li>
11
<li><a>Заключение</a></li>
12
</ul><p><em>Предлагаем вашему вниманию проектную работу для курса "<a>Архитектура и шаблоны проектирования</a>".</em></p>
12
</ul><p><em>Предлагаем вашему вниманию проектную работу для курса "<a>Архитектура и шаблоны проектирования</a>".</em></p>
13
<h2>Введение</h2>
13
<h2>Введение</h2>
14
<p>Добрый день!Меня зовут Беляев-Козырев Григорий Николаевич и сегодня в данной статье мы рассмотрим процесс создания Телеграм-бота для генерации изображений на основе текстового запроса. Для реализации генерации используется Docker-контейнер с установленной stable diffusion-моделью. Этот бот позволяет пользователям выбирать модель и количество шагов для генерации изображения.</p>
14
<p>Добрый день!Меня зовут Беляев-Козырев Григорий Николаевич и сегодня в данной статье мы рассмотрим процесс создания Телеграм-бота для генерации изображений на основе текстового запроса. Для реализации генерации используется Docker-контейнер с установленной stable diffusion-моделью. Этот бот позволяет пользователям выбирать модель и количество шагов для генерации изображения.</p>
15
<h2>Технические детали</h2>
15
<h2>Технические детали</h2>
16
<h3>Telegram Bot и основные библиотеки</h3>
16
<h3>Telegram Bot и основные библиотеки</h3>
17
<p>В коде используется библиотека<strong>python</strong><strong>-</strong><strong>telegram</strong><strong>-</strong><strong>bot</strong>для создания и управления Телеграм-ботом. Для отправки запросов на генерацию изображений используется библиотека<strong>requests</strong>. Дополнительно используются библиотеки для работы с изображениями (<strong>PIL</strong>) и перевода текста (<strong>googletrans</strong>).</p>
17
<p>В коде используется библиотека<strong>python</strong><strong>-</strong><strong>telegram</strong><strong>-</strong><strong>bot</strong>для создания и управления Телеграм-ботом. Для отправки запросов на генерацию изображений используется библиотека<strong>requests</strong>. Дополнительно используются библиотеки для работы с изображениями (<strong>PIL</strong>) и перевода текста (<strong>googletrans</strong>).</p>
18
<h3>Docker и Stable Diffusion</h3>
18
<h3>Docker и Stable Diffusion</h3>
19
<p>Генерация изображений происходит в контейнере Docker, который развернут локально. Внутри контейнера используется stable diffusion-модель для создания изображений на основе текстового запроса. Stable diffusion - это метод генерации изображений, который использует диффузионные процессы для создания высококачественных и разнообразных визуальных контентов.</p>
19
<p>Генерация изображений происходит в контейнере Docker, который развернут локально. Внутри контейнера используется stable diffusion-модель для создания изображений на основе текстового запроса. Stable diffusion - это метод генерации изображений, который использует диффузионные процессы для создания высококачественных и разнообразных визуальных контентов.</p>
20
<h3>API и система генерации</h3>
20
<h3>API и система генерации</h3>
21
<p>Бот взаимодействует с генеративной службой, предоставленной через API. Пользовательский запрос, содержащий текстовую подсказку и другие параметры, отправляется в виде JSON-запроса на сервер службы. Этот запрос включает в себя информацию о выбранной модели, количестве шагов и других настройках.</p>
21
<p>Бот взаимодействует с генеративной службой, предоставленной через API. Пользовательский запрос, содержащий текстовую подсказку и другие параметры, отправляется в виде JSON-запроса на сервер службы. Этот запрос включает в себя информацию о выбранной модели, количестве шагов и других настройках.</p>
22
<p>Пример:</p>
22
<p>Пример:</p>
23
<p> json_data = { "prompt": "beatiful dog", "seed": 12123231, "used_random_seed": True, "negative_prompt": "", "num_outputs": 1, "num_inference_steps": 50, "guidance_scale": 7.5, "width": 512, "height": 512, "vram_usage_level": "high", "sampler_name": "euler_a", "use_stable_diffusion_model": sd-v1.5, "clip_skip": False, "use_vae_model": "", "stream_progress_updates": True, "stream_image_progress": False, "show_only_filtered_image": True, "block_nsfw": False, "output_format": "jpeg", "output_quality": 75, "output_lossless": False, "metadata_output_format": "none", "original_prompt": "beatiful dog", "active_tags": [], "inactive_tags": [], "use_face_correction": "GFPGANv1.4", "use_upscale": "RealESRGAN_x4plus_anime_6B", "upscale_amount": "4", "session_id": 412551212412 }</p>
23
<p> json_data = { "prompt": "beatiful dog", "seed": 12123231, "used_random_seed": True, "negative_prompt": "", "num_outputs": 1, "num_inference_steps": 50, "guidance_scale": 7.5, "width": 512, "height": 512, "vram_usage_level": "high", "sampler_name": "euler_a", "use_stable_diffusion_model": sd-v1.5, "clip_skip": False, "use_vae_model": "", "stream_progress_updates": True, "stream_image_progress": False, "show_only_filtered_image": True, "block_nsfw": False, "output_format": "jpeg", "output_quality": 75, "output_lossless": False, "metadata_output_format": "none", "original_prompt": "beatiful dog", "active_tags": [], "inactive_tags": [], "use_face_correction": "GFPGANv1.4", "use_upscale": "RealESRGAN_x4plus_anime_6B", "upscale_amount": "4", "session_id": 412551212412 }</p>
24
<p>Сервер обрабатывает запрос, инициирует процесс генерации в контейнере Docker и создаёт уникальный идентификатор задачи (task ID).</p>
24
<p>Сервер обрабатывает запрос, инициирует процесс генерации в контейнере Docker и создаёт уникальный идентификатор задачи (task ID).</p>
25
<p>Затем каждую секунду бот по запросу http://localhost:9000/ping?session_id={telegram_chat_id} получает информацию о текущем состоянии запроса для пользователя с заданным telegram_chat_id.</p>
25
<p>Затем каждую секунду бот по запросу http://localhost:9000/ping?session_id={telegram_chat_id} получает информацию о текущем состоянии запроса для пользователя с заданным telegram_chat_id.</p>
26
<p>Возможно три состояния системы - Busy, Online, Failed.Состояние Online означает, что система окончила генерацию изображения и готова к его отправке.</p>
26
<p>Возможно три состояния системы - Busy, Online, Failed.Состояние Online означает, что система окончила генерацию изображения и готова к его отправке.</p>
27
<p>Далее в запросе присутствуют запросы с информацией о задачах tasks, каждый из которых содержит task ID.</p>
27
<p>Далее в запросе присутствуют запросы с информацией о задачах tasks, каждый из которых содержит task ID.</p>
28
<p>Eсли задача имеет статус buffer - то эта задача считается выполненной и изображение доступно по адресу<strong>http</strong><strong>://</strong><strong>localhost</strong><strong>:9000/</strong><strong>image</strong><strong>/</strong><strong>stream</strong><strong>/{</strong><strong>task</strong><strong>_</strong><strong>id</strong><strong>}</strong>в формате base64.</p>
28
<p>Eсли задача имеет статус buffer - то эта задача считается выполненной и изображение доступно по адресу<strong>http</strong><strong>://</strong><strong>localhost</strong><strong>:9000/</strong><strong>image</strong><strong>/</strong><strong>stream</strong><strong>/{</strong><strong>task</strong><strong>_</strong><strong>id</strong><strong>}</strong>в формате base64.</p>
29
<p>Далее данное изображение следует передать пользователю по его уникальному telegram_chat_id.Пример кода ежесекундной проверки от бота к системе и отправки изображения в случае успеха:</p>
29
<p>Далее данное изображение следует передать пользователю по его уникальному telegram_chat_id.Пример кода ежесекундной проверки от бота к системе и отправки изображения в случае успеха:</p>
30
<p># Function to retrieve the generated imagedef get_generated_image(task_id): image_url = f"http://localhost:9000/image/stream/{task_id}" response = requests.get(image_url)<p> if response.status_code == 200: response_text = response.text</p>
30
<p># Function to retrieve the generated imagedef get_generated_image(task_id): image_url = f"http://localhost:9000/image/stream/{task_id}" response = requests.get(image_url)<p> if response.status_code == 200: response_text = response.text</p>
31
<p> # Trim the string search_str = '{"status":' start_index = response_text.find(search_str) if start_index != -1: trimmed_string = response_text[start_index:] else: trimmed_string = response_text</p>
31
<p> # Trim the string search_str = '{"status":' start_index = response_text.find(search_str) if start_index != -1: trimmed_string = response_text[start_index:] else: trimmed_string = response_text</p>
32
<p> # Parse the trimmed string as JSON try: response_data = json.loads(trimmed_string) except json.JSONDecodeError as e: print(f"Error parsing JSON: {e}") return None</p>
32
<p> # Parse the trimmed string as JSON try: response_data = json.loads(trimmed_string) except json.JSONDecodeError as e: print(f"Error parsing JSON: {e}") return None</p>
33
<p> if response_data["status"] == "succeeded" and response_data.get("output"): image_data = response_data["output"][0].get("data") return image_data return None</p>
33
<p> if response_data["status"] == "succeeded" and response_data.get("output"): image_data = response_data["output"][0].get("data") return image_data return None</p>
34
<p># Function to send the generated image to the userdef send_image_from_base64(bot, chat_id, base64_data): try: # Remove the "data:image/jpeg;base64," prefix if it exists base64_data = base64_data.replace("data:image/jpeg;base64,", "")</p>
34
<p># Function to send the generated image to the userdef send_image_from_base64(bot, chat_id, base64_data): try: # Remove the "data:image/jpeg;base64," prefix if it exists base64_data = base64_data.replace("data:image/jpeg;base64,", "")</p>
35
<p> # Decode base64 data image_data = base64.b64decode(base64_data)</p>
35
<p> # Decode base64 data image_data = base64.b64decode(base64_data)</p>
36
<p> # Create an in-memory BytesIO buffer for the image image_buffer = BytesIO(image_data)</p>
36
<p> # Create an in-memory BytesIO buffer for the image image_buffer = BytesIO(image_data)</p>
37
<p> # Open the image<a>using</a>PIL (Python Imaging Library) image = Image.open(image_buffer)</p>
37
<p> # Open the image<a>using</a>PIL (Python Imaging Library) image = Image.open(image_buffer)</p>
38
<p> # You can save the image to a file if needed: image.save("output" + str(chat_id) + ".jpg")</p>
38
<p> # You can save the image to a file if needed: image.save("output" + str(chat_id) + ".jpg")</p>
39
<p> # Send the image as a photo bot.send_photo(chat_id, photo=open("output" + str(chat_id) + ".jpg", 'rb')) except Exception as e: print(f"Error sending image: {e}")</p>
39
<p> # Send the image as a photo bot.send_photo(chat_id, photo=open("output" + str(chat_id) + ".jpg", 'rb')) except Exception as e: print(f"Error sending image: {e}")</p>
40
<p># Function to check the rendering status periodicallydef check_rendering_status(chat_id, bot): session_id = session_data[chat_id]["session_id"] while True: # Ping the service to get the rendering status ping_url = f"http://localhost:9000/ping?session_id={session_id}" response = requests.get(ping_url) if response.status_code == 200: response_data = response.json() if response_data["status"] == "Online" and response_data.get("tasks"): # Get all task IDs task_ids = response_data["tasks"] for task_id, status in task_ids.items(): # Get the generated image if status == 'buffer': generated_image = get_generated_image(task_id) if generated_image: send_image_from_base64(bot, chat_id, generated_image) return # Rendering is complete, exit the loop time.sleep(1) # Wait for 1 second before checking again</p>
40
<p># Function to check the rendering status periodicallydef check_rendering_status(chat_id, bot): session_id = session_data[chat_id]["session_id"] while True: # Ping the service to get the rendering status ping_url = f"http://localhost:9000/ping?session_id={session_id}" response = requests.get(ping_url) if response.status_code == 200: response_data = response.json() if response_data["status"] == "Online" and response_data.get("tasks"): # Get all task IDs task_ids = response_data["tasks"] for task_id, status in task_ids.items(): # Get the generated image if status == 'buffer': generated_image = get_generated_image(task_id) if generated_image: send_image_from_base64(bot, chat_id, generated_image) return # Rendering is complete, exit the loop time.sleep(1) # Wait for 1 second before checking again</p>
41
</p>
41
</p>
42
<h2>Опции Телеграм-бота</h2>
42
<h2>Опции Телеграм-бота</h2>
43
<p>Выбор опций в боте реализован при помощи кнопки KeyboardButton из python-telegram-bot.</p>
43
<p>Выбор опций в боте реализован при помощи кнопки KeyboardButton из python-telegram-bot.</p>
44
<h3>Выбор модели</h3>
44
<h3>Выбор модели</h3>
45
<p>Бот предоставляет пользователю возможность выбора модели из нескольких предустановленных вариантов. Модели включают в себя, например, "3dAnimationDiffusion_v10", "AnythingV5Ink_ink", "ghibliStyleMix_v10" и другие.</p>
45
<p>Бот предоставляет пользователю возможность выбора модели из нескольких предустановленных вариантов. Модели включают в себя, например, "3dAnimationDiffusion_v10", "AnythingV5Ink_ink", "ghibliStyleMix_v10" и другие.</p>
46
<h3>Количество шагов</h3>
46
<h3>Количество шагов</h3>
47
<p>Пользователь может задать количество шагов (inference steps), определяющих детализацию и сложность создаваемого изображения. Выбор значения влияет на время и ресурсы, затрачиваемые на генерацию.</p>
47
<p>Пользователь может задать количество шагов (inference steps), определяющих детализацию и сложность создаваемого изображения. Выбор значения влияет на время и ресурсы, затрачиваемые на генерацию.</p>
48
<h2>Как это работает</h2>
48
<h2>Как это работает</h2>
49
<ol><li><strong>Старт беседы:</strong>Пользователь начинает беседу с ботом командой "/start". Сессия инициализируется, и устанавливаются параметры по умолчанию для модели и количества шагов.</li>
49
<ol><li><strong>Старт беседы:</strong>Пользователь начинает беседу с ботом командой "/start". Сессия инициализируется, и устанавливаются параметры по умолчанию для модели и количества шагов.</li>
50
<li><strong>Выбор модели и количества шагов:</strong>Пользователь может выбирать модель и количество шагов из главного меню. Бот сохраняет эти параметры в сессии пользователя.</li>
50
<li><strong>Выбор модели и количества шагов:</strong>Пользователь может выбирать модель и количество шагов из главного меню. Бот сохраняет эти параметры в сессии пользователя.</li>
51
<li><strong>Ввод текстовой подсказки:</strong>Пользователь вводит текстовую подсказку для генерации изображения. Текст переводится на английский язык для стабильной работы с моделью.</li>
51
<li><strong>Ввод текстовой подсказки:</strong>Пользователь вводит текстовую подсказку для генерации изображения. Текст переводится на английский язык для стабильной работы с моделью.</li>
52
<li><strong>Запрос на генерацию:</strong>Бот отправляет запрос с параметрами, включая текстовую подсказку, на сервер генерации. Запускается процесс генерации в Docker-контейнере.</li>
52
<li><strong>Запрос на генерацию:</strong>Бот отправляет запрос с параметрами, включая текстовую подсказку, на сервер генерации. Запускается процесс генерации в Docker-контейнере.</li>
53
<li><strong>Проверка статуса:</strong>Запускается отдельный поток, который периодически проверяет статус генерации. Когда изображение готово, оно получается и отправляется пользователю в Телеграм.</li>
53
<li><strong>Проверка статуса:</strong>Запускается отдельный поток, который периодически проверяет статус генерации. Когда изображение готово, оно получается и отправляется пользователю в Телеграм.</li>
54
</ol><h2>Примеры работы бота</h2>
54
</ol><h2>Примеры работы бота</h2>
55
<a></a><h2>Заключение</h2>
55
<a></a><h2>Заключение</h2>
56
<p>Создание Телеграм-бота для генерации изображений на основе текстовых подсказок - это захватывающий процесс, который включает в себя использование технологий Docker, Stable diffusion и интеграции с Телеграм API. Полученный бот предоставляет пользователям удобный способ создания уникальных и креативных изображений.</p>
56
<p>Создание Телеграм-бота для генерации изображений на основе текстовых подсказок - это захватывающий процесс, который включает в себя использование технологий Docker, Stable diffusion и интеграции с Телеграм API. Полученный бот предоставляет пользователям удобный способ создания уникальных и креативных изображений.</p>
57
<p>Контакты для связи:Tel. +7 921 893 5001E-mail: gri-bel@yandex.ruTelegram:<a>https://t.me/KGB_N</a></p>
57
<p>Контакты для связи:Tel. +7 921 893 5001E-mail: gri-bel@yandex.ruTelegram:<a>https://t.me/KGB_N</a></p>
58
<p>P. S. <em>Интересуюет архитектура ПО и шаблоны проектирования? Добро пожаловать на <a>специализированный курс в Otus</a>!</em></p>
58
<p>P. S. <em>Интересуюет архитектура ПО и шаблоны проектирования? Добро пожаловать на <a>специализированный курс в Otus</a>!</em></p>
59
59