mirror of
https://github.com/5shekel/stable-diffusion-telegram-bot.git
synced 2024-05-22 19:33:14 +03:00
Compare commits
No commits in common. "9c965b497e7a2718a1797d33c231d9ef3cccb043" and "9bce6f989ef07ceb6e7ad5f264d938093d0f331c" have entirely different histories.
9c965b497e
...
9bce6f989e
10
README.md
10
README.md
|
@ -7,26 +7,22 @@ this is a txt2img bot running on tami telegram channel
|
||||||
supported invocation:
|
supported invocation:
|
||||||
`/draw <text>` - send prompt text to the bot and it will draw an image
|
`/draw <text>` - send prompt text to the bot and it will draw an image
|
||||||
you can add `negative_prompt` using `ng: <text>`
|
you can add `negative_prompt` using `ng: <text>`
|
||||||
you can add `denoised intermediate steps` using `steps: <text>`
|
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
`/draw a city street`
|
`/draw a city street`
|
||||||
and without people
|
and without people
|
||||||
`/draw a city street ng: people`
|
`/draw a city street ng: people`
|
||||||
with more steps
|
|
||||||
`/draw a city street ng: people steps: 50`
|
|
||||||
|
|
||||||
to change the model use:
|
to change the model use:
|
||||||
`/getmodels` - to get a list of models and then click to set it.
|
`/getmodels` - to get a list of models and then click to set it.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- note1: Anything after ng will be considered as nergative prompt. a.k.a things you do not want to see in your diffusion!
|
note1: Anything after ng will be considered as nergative prompt. a.k.a things you do not want to see in your diffusion!
|
||||||
- note2: on [negative_prompt](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Negative-prompt) (aka ng):
|
note2: on [negative_prompt](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Negative-prompt) (aka ng):
|
||||||
thia is a bit of a black art. i took the recommended defaults for the `Deliberate` model from this fun [alt-model spreadsheet](https://docs.google.com/spreadsheets/d/1Q0bYKRfVOTUHQbUsIISCztpdZXzfo9kOoAy17Qhz3hI/edit#gid=797387129).
|
thia is a bit of a black art. i took the recommended defaults for the `Deliberate` model from this fun [alt-model spreadsheet](https://docs.google.com/spreadsheets/d/1Q0bYKRfVOTUHQbUsIISCztpdZXzfo9kOoAy17Qhz3hI/edit#gid=797387129).
|
||||||
~~and you (currntly) can only ADD to it, not replace.~~
|
~~and you (currntly) can only ADD to it, not replace.~~
|
||||||
- note3: on `steps` - step of 1 will generate only the first "step" of bot hallucinations. the default is 40. higher will take longer and will give "better" image. range is hardcoded 1-70.
|
|
||||||
see ![video](https://user-images.githubusercontent.com/57876960/212490617-f0444799-50e5-485e-bc5d-9c24a9146d38.mp4)
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Install requirements
|
Install requirements
|
||||||
|
|
94
main.py
94
main.py
|
@ -2,7 +2,7 @@ import json
|
||||||
import requests
|
import requests
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import uuid
|
import random
|
||||||
import base64
|
import base64
|
||||||
from PIL import Image, PngImagePlugin
|
from PIL import Image, PngImagePlugin
|
||||||
from pyrogram import Client, filters
|
from pyrogram import Client, filters
|
||||||
|
@ -26,81 +26,55 @@ SD_URL = os.environ.get("SD_URL", None)
|
||||||
print(SD_URL)
|
print(SD_URL)
|
||||||
app = Client("stable", api_id=API_ID, api_hash=API_HASH, bot_token=TOKEN)
|
app = Client("stable", api_id=API_ID, api_hash=API_HASH, bot_token=TOKEN)
|
||||||
|
|
||||||
#default params
|
|
||||||
steps_value_default = 40
|
|
||||||
|
|
||||||
def process_input_string(string):
|
def slice_positive_negative(string):
|
||||||
ng_delimiter = "ng:"
|
delimiter = "ng:"
|
||||||
steps_delimiter = "steps:"
|
if delimiter in string:
|
||||||
|
index = string.index(delimiter)
|
||||||
ng_index = string.find(ng_delimiter)
|
positive = string[:index].rstrip()
|
||||||
steps_index = string.find(steps_delimiter)
|
negative = string[index + len(delimiter) :].lstrip()
|
||||||
|
return positive, negative
|
||||||
if ng_index != -1 and steps_index != -1:
|
|
||||||
if ng_index < steps_index:
|
|
||||||
positive = string[:ng_index].strip()
|
|
||||||
negative = string[ng_index + len(ng_delimiter):steps_index].strip()
|
|
||||||
steps_str = string[steps_index + len(steps_delimiter):].strip().split()[0]
|
|
||||||
else:
|
|
||||||
positive = string[:steps_index].strip()
|
|
||||||
negative = string[steps_index + len(steps_delimiter):ng_index].strip()
|
|
||||||
steps_str = string[ng_index + len(ng_delimiter):].strip().split()[0]
|
|
||||||
elif ng_index != -1:
|
|
||||||
positive = string[:ng_index].strip()
|
|
||||||
negative = string[ng_index + len(ng_delimiter):].strip()
|
|
||||||
steps_str = None
|
|
||||||
elif steps_index != -1:
|
|
||||||
positive = string[:steps_index].strip()
|
|
||||||
negative = None
|
|
||||||
steps_str = string[steps_index + len(steps_delimiter):].strip().split()[0]
|
|
||||||
else:
|
else:
|
||||||
positive = string.strip()
|
return string, "null" # if we are missing the ng bad thing happen....
|
||||||
negative = None
|
#POSSIBLE NG [[[[[[[[[[lowres, low resolution, bad resolution, bad, poor quality, bad quality, blurry, bad art, incomplete, logo, signature, text, jpeg artifacts, compression artifacts,child, childish]]]]]]]]]]
|
||||||
steps_str = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
steps_value = int(steps_str)
|
|
||||||
#limit steps to range
|
|
||||||
if not 1 <= steps_value <= 70:
|
|
||||||
steps_value = steps_value_default
|
|
||||||
except (ValueError, TypeError):
|
|
||||||
steps_value = None
|
|
||||||
|
|
||||||
|
|
||||||
return positive, negative, steps_value
|
|
||||||
|
|
||||||
@app.on_message(filters.command(["draw"]))
|
@app.on_message(filters.command(["draw"]))
|
||||||
def draw(client, message):
|
def draw(client, message):
|
||||||
msgs = message.text.split(" ", 1)
|
msgs = message.text.split(" ", 1)
|
||||||
if len(msgs) == 1:
|
if len(msgs) == 1:
|
||||||
message.reply_text(
|
message.reply_text(
|
||||||
"Format :\n/draw < text to image >\nng: < negative (optional) >\nsteps: < steps value (1-70, optional) >"
|
"Format :\n/draw < text to image >\nng: < negative (optional) >"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
positive, negative, steps_value = process_input_string(msgs[1])
|
msg = slice_positive_negative(msgs[1])
|
||||||
|
print(msg)
|
||||||
payload = {
|
payload = {
|
||||||
"prompt": positive,
|
"prompt": msg[0],
|
||||||
|
"negative_prompt": msg[1],
|
||||||
}
|
}
|
||||||
if negative is not None:
|
|
||||||
payload["negative_prompt"] = negative
|
|
||||||
if steps_value is not None:
|
|
||||||
payload["steps"] = steps_value
|
|
||||||
|
|
||||||
print(payload)
|
print(payload)
|
||||||
|
|
||||||
# The rest of the draw function remains unchanged
|
|
||||||
|
|
||||||
|
|
||||||
K = message.reply_text("Please Wait 10-15 Second")
|
K = message.reply_text("Please Wait 10-15 Second")
|
||||||
r = requests.post(url=f"{SD_URL}/sdapi/v1/txt2img", json=payload).json()
|
r = requests.post(url=f"{SD_URL}/sdapi/v1/txt2img", json=payload).json()
|
||||||
|
|
||||||
def genr():
|
def genr():
|
||||||
unique_id = str(uuid.uuid4())[:7]
|
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
return f"{message.from_user.first_name}-{unique_id}"
|
chars1 = "1234564890"
|
||||||
|
gen1 = random.choice(chars)
|
||||||
|
gen2 = random.choice(chars)
|
||||||
|
gen3 = random.choice(chars1)
|
||||||
|
gen4 = random.choice(chars)
|
||||||
|
gen5 = random.choice(chars)
|
||||||
|
gen6 = random.choice(chars)
|
||||||
|
gen7 = random.choice(chars1)
|
||||||
|
gen8 = random.choice(chars)
|
||||||
|
gen9 = random.choice(chars)
|
||||||
|
gen10 = random.choice(chars1)
|
||||||
|
return f"{message.from_user.id}-MOE{gen1}{gen2}{gen3}{gen4}{gen5}{gen6}{gen7}{gen8}{gen9}{gen10}"
|
||||||
|
|
||||||
word = genr()
|
word = genr()
|
||||||
|
|
||||||
for i in r["images"]:
|
for i in r["images"]:
|
||||||
image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))
|
image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))
|
||||||
|
|
||||||
|
@ -112,15 +86,9 @@ def draw(client, message):
|
||||||
image.save(f"{word}.png", pnginfo=pnginfo)
|
image.save(f"{word}.png", pnginfo=pnginfo)
|
||||||
|
|
||||||
message.reply_photo(
|
message.reply_photo(
|
||||||
photo=f"{word}.png",
|
photo=f"{word}.png",
|
||||||
caption=(
|
caption=f"Prompt - **{msg[0]}**\nNegative Prompt - **{msg[1]}**\n**[{message.from_user.first_name}-Kun](tg://user?id={message.from_user.id})**",
|
||||||
f"Prompt - **{positive}**\n"
|
)
|
||||||
f"Negative Prompt - **{negative if negative is not None else 'None'}**\n"
|
|
||||||
f"Steps - **{steps_value if steps_value != steps_value_default else 'Default'}**\n"
|
|
||||||
f"**[{message.from_user.first_name}-Kun](tg://user?id={message.from_user.id})**"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
# os.remove(f"{word}.png")
|
# os.remove(f"{word}.png")
|
||||||
K.delete()
|
K.delete()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user