HTML Diff
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