
Stable Diffusion (AUTOMATIC1111) ãAPIã§æäœãã ïœWEB UIäžèŠã§ä»»æã®ãµãŒãã¹ãšé£æºïœ
ããã«ã¡ã¯ãRcatã§ãã
ååã®èšäºã§Stable Diffusion(以äžSD)ã®APIãçšããDiscordã®BOTãäœæããŸããã
ãã¡ãã®botãçšããããšã§ãDiscordããæç€ºãåºããŠ24æéã®çæãå¯èœã«ãªããŸããããŸãããã£ããã®æ©èœã䜿çšããã¹ã±ãŒã«ã¢ãããç·šéãªã©ãè¡ããããã«ããŸããã
ãããã®æ©èœã¯å
šãŠAPIã«ãã£ãŠå®çŸãããŠããŸãã
ä»åã¯æ
å ±ãå°ãªãSDã®APIã«ã€ããŠè§£èª¬ããŠãããŸãã
ååã®èšäºã¯ãã¡ããAPIã䜿çšããŠç»åçæãè¡ããã£ãããããã§ããé åžããã¡ãã§è¡ã£ãŠããŸãã
ãã®èšäºã¯äžèšã®èšäºã§SDãå°å ¥æžã¿ã®åæã§ãã
ããããAPIã£ãŠäœ
ãŸãAPIãšã¯äœããšãããšãå€éšã®ããã°ã©ã ããSDãæäœããããã«äœ¿çšããã€ã³ã¿ãŒãã§ãŒã¹ã®äºã§ãã
SDã®APIã¯WEBãµãŒããŒã®URLããããããšã§åŒã³åºããŸãã
SDã®APIã«ã€ããŠ
SDã®APIãçšãããšäœãã§ããããã«ãªãã®ããããã¯WebUIã䜿ããã«ç»åã®çæãã§ããããã«ãªããŸãã
ã€ãŸããä»»æã®ããã°ã©ã ãšé£æºããããšãå¯èœã«ãªãããã§ããã
æåã«APIã®ããã¥ã¡ã³ããã©ãã«ããã説æããŠãããŸãã
éåžžWebUIã䜿ã£ãŠããç¶æ
ã§ãããã«/docsäžã«å®ã¯APIã®ããã¥ã¡ã³ãããããŸããURLã§èšãã°äžèšã®ããã«ãªãã§ããããã
http://localhost:7860/docs
ãã¡ãã®ããŒãžãéããšäœ¿çšã§ãããã¹ãŠã®APIã®URLãäœ¿ãæ¹ãèšèŒãããŠããŸãããã ã¡ãã£ãšçãã®ããåŒæ°ãŸã§ã¯æžããŠãããã§ããããã®åŒæ°ãäœãæå³ããã®ããŸã§æžããŠãªããšããã§ããããïŒ

äŸãã°ä»¥äžãç»åãçæããããã®APIãªã®ã§ãããåé
ç®ãããã£ãšäžŠãã§ããŠãåŒæ°ã«ã¯ããã©ã«ãã®å€ãŸã§å
¥ã£ãŠããŸãããããäœãæå³ããããŸã§ã¯æžããŠããŸãããWebUIã䜿ã£ãŠããã°ãªããšãªãåããéšåã§ããããã§ãããååãéããã€ã¯ã¡ãã£ãšåãããªãã§ããã
ãã®èŸºãã¯æ
å ±ãå°ãªãã£ãã®ã§ãèªåã§è©Šè¡é¯èª€ãã€ã€ç¢ºãããéšåããããŸããä»åã¯ãããã£ãéšåã解説ã§ããã°ãšæã£ãŠãŸãã

ãšããããAPIã§ç»åãçæããŠã¿ã
ãã¹ãã³ãŒã
ãããªãäœ¿ãæ¹ã®èª¬æããç§ã®äœã£ãæçµåœ¢ãåºããŠãåããã¥ãããšæãã®ã§ããŸãæåã«ãšããããç»åã®çæãããŠã¿ãŸãã
åºæ¬çã«URLãå©ããã°ããã®ã§ã©ããªèšèªã§ãæ§ããŸããããä»åã¯PythonãçšããŸãã
ãªããSDã¯åãããœã³ã³ã§æ¢ã«ç«ã¡äžãã£ãŠããåæã§ãã
import requests,base64,io
def Main():
Imgsetting = {
"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
"steps": 20,
"sampler_index":"DPM++ 2M Karras",
"width": 256,
"height": 384,
"cfg_scale": 7,
"seed": -1,
}
resp = requests.post(url=f'http://localhost:7860/sdapi/v1/txt2img', json=Imgsetting)
json = resp.json()
imgdata = json["images"][0]
with open("test1.png","wb") as f:
buf = base64.b64decode(imgdata)
f.write(buf)
return
if __name__ == '__main__':
Main()ãã¡ããå®è¡ãããšãä»åã¯äžèšã®ãããªç»åãçæãããŸããã

ãã¹ãã³ãŒãã®è§£èª¬
ãŸãã¯äžçªæåã®èšå®ã®éšåãã解説ããŸã

ãã¡ãã¯WebUIã§èšãã°äžèšã®ç»é¢ã®èšå®å 容ãAPIã«èŒããŠå©ãããã®èšå®ãšãªããŸãã

å šãŠã®èšå®ã¯æ°ãå€ãããšãŠããããªãã§ããå¶åŸ¡ããŠããããªãã®ã§äž»èŠãªéšåã ãèšå®ããŠãããŸãã
prompt
ç¥ã£ãŠã®éããããã³ãããå ¥åããŸããå ¥åå 容ã¯WebUIã®æãšåãã§ããnegative_prompt
ãã¡ããåãããã¬ãã£ãããã³ãããå ¥åããŸããsteps
UIã ãšã¹ã©ã€ããŒã«ãªã£ãŠãããµã³ããªã³ã°ã¹ãããã®ããšã§ãã
䜿çšãããµã³ãã©ã«å¿ããŠæé©ãªæ°å€ãèšå®ããŠãã ãããsampler_index
ã©ã®ãµã³ãã©ãŒã䜿çšãããååã§æå®ããŸãã
"DPM++ 2M Karras"ã"DDIM"ãªã©ãé¢åãªã®ãäžæäžå¥ééããã«å ¥ããªãããããªããšããã§ããããïŒ
ãã ãããµã³ãã©ãŒã®ååãååŸããããã®APIãããã®ã§ãããããã³ãããããšã§äœãå ¥åããã°ãããã¯ããããšæããŸããwidth/height
ç»åã®ãµã€ãºãæå®ããŸããcfg_scale
cfgã¹ã±ãŒã«ãèšå®ããŸããããŸãå€ããªããšæãã®ã§ããã©ã«ãã§ããããšæããŸãããäžå¿å ¥ããŠãããŸããseed
-1ã§ã©ã³ãã ãç¹å®ã®ã·ãŒãã§è©°ããŠããå Žåã¯ã·ãŒãå€ãå ¥å
以äžããã¥ã¡ã³ãæç²ãæšªã«æžãããŠããæ°å€ãæååãããã©ã«ãã®å€ã®ããã§ãã
å°ãªããšã"string"ã«ãªã£ãŠãããšããã¯èšå®ããªããšãŸããæ°ãããŸãã
ã¹ãããã50ãšãã¡ãã£ãšå€ãã§ããã
{
"enable_hr": false,
"denoising_strength": 0,
"firstphase_width": 0,
"firstphase_height": 0,
"hr_scale": 2,
"hr_upscaler": "string",
"hr_second_pass_steps": 0,
"hr_resize_x": 0,
"hr_resize_y": 0,
"prompt": "",
"styles": [
"string"
],
"seed": -1,
"subseed": -1,
"subseed_strength": 0,
"seed_resize_from_h": -1,
"seed_resize_from_w": -1,
"sampler_name": "string",
"batch_size": 1,
"n_iter": 1,
"steps": 50,
"cfg_scale": 7,
"width": 512,
"height": 512,
"restore_faces": false,
"tiling": false,
"negative_prompt": "string",
"eta": 0,
"s_churn": 0,
"s_tmax": 0,
"s_tmin": 0,
"s_noise": 1,
"override_settings": {},
"override_settings_restore_afterwards": true,
"script_args": [],
"sampler_index": "Euler",
"script_name": "string"
}次ã«èšå®ãçšæããããAPIãå©ããŠç»åãååŸããŸãã
以äžããã®éšåã®åŠçã«ãªããŸãã

ä»åã¯ããã³ããããç»åãçæããã®ã§å©ãAPIã¯"/sdapi/v1/txt2img"ã«ãªããŸãã
ããã¥ã¡ã³ãã§ããæžããŠããéãããã¡ãã®APIã¯josnã§èšå®ããã£ã€ããç¶æ
ã§postããããšã§å©ãããšãã§ããŸãã
å¿çã¯ããã¥ã¡ã³ããããäžèšã®ãããªåœ¢åŒã®ããã§ãã
{
"images": [
"string"
],
"parameters": {},
"info": "string"
}ã€ã¡ãŒãžã®éšåãstringã«ãªã£ãŠããŸãããåºæ¬çã«ãŠã§ãã§ç»åãéä¿¡ããå Žåã¯ãbase64ãšããæååã«ãšã³ã³ãŒãããŠããéåä¿¡ããã®ã§ãã®ããšã§ãã

æåŸã«ãã®éšåã§ç»åãä¿åããŠããŸããå
¥æããjsonã®äžã®"images"ãç»åã®ããŒã¿ãªã®ã§ãããååŸåŸãbase64ããã³ãŒãããŠãã€ããªã«ããŠãããããä¿åããŠããŸããbase64ã®èŸºããããããªãå Žåã¯ã¡ãã£ãšèª¿ã¹ãŠã¿ãŠãã ããã
ããã§APIã«ããç»åã®çæã®åºæ¬ã¯å®äºã§ãã
ç¹ã«ç¹å¥ãªã©ã€ãã©ãªã¯å¿
èŠãªãã®ã§ãSDãåãããœã³ã³ã§ç«ã¡äžãã£ãŠããç¶æ
ã§ããã°ã³ããã§åäœããã¯ãã§ãã
å¥ã®ããœã³ã³ã§åãããŠããå Žåã¯ãæ¥ç¶å
ãããŒã«ã«ãã¹ãã§ã¯ãªã察象ã®IPã¢ãã¬ã¹ã«ããŠãã ããã
æéããããå Žåã¿ã€ã ã¢ãŠãããã®ã§ãã¿ã€ã ã¢ãŠããé·ãã«ããŠãã ããã
ç»åã®ã¢ããã¹ã±ãŒã«ãè¡ã
ãã®èŸºã®æ
å ±ãå
šãåºãŠããªããŠå°ã£ãã®ã§èªåã§æ€èšŒããŸããã
ä»åè¡ãã¢ããã¹ã±ãŒã«ã¯WebUIã§èšããšä»¥äžã®éšåã«ãªããŸãã

ãã©ã¡ãŒã¿ãŒã®èšå®
ãã®èšå®ãè¡ãããã«ãã©ã¡ãŒã¿ãŒã远å ã§æå®ããŸãã
æåã«çæããç»åãæ¡å€§ããããããã·ãŒãå€ãæåã®ç»åããæã£ãŠããŠããŸã
Imgsetting = {
"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
"steps": 20,
"sampler_index":"DPM++ 2M Karras",
"width": 256,
"height": 384,
"cfg_scale": 7,
"seed": 412220144,
"save_images":False,
"enable_hr":True,
"hr_scale": 2,
"hr_upscaler": "R-ESRGAN 4x+ Anime6B",
"denoising_strength":0.5
}ãã€ã³ããšããŠã¯"enable_hr"ãšãããã©ã¡ãŒã¿ãŒãTrueã«ãªã£ãŠãããšããã§ãããã®ãã©ã¡ãŒã¿ã远å ããäžã§Trueã«ããŠãããšã¢ããã¹ã±ãŒã©ãŒãèµ·åããããã«ãªããŸãããã®ä»ã®ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®éãã§ãã
hr_scale
ç»åæ¡å€§ã®åçãæå®ããŸã
ã·ã¹ãã ã®ã¹ããã¯ã«å¿ããŠæé©ãªå€ãéžãã§ãã ãããhr_upscaler
ã¢ããã¹ã±ãŒã©ãŒã®ååãæå®ããŸãã
ãã¡ãããµã³ãã©ã®ãšããšåãããååã1å1å¥ééããã«å ¥åããå¿ èŠããããŸããdenoising_strength
ãã€ãºé€å»åŒ·åºŠã§ãã
䜿ã£ãŠã¿ãŠããã£ãããšã§ãããwebuiã®ãã€ãºé€å»åŒ·åºŠãšã¯ã¡ãã£ãšéãã®ãããããŸããã
WebUIã®å Žåããããè¶³ããªããšãŒãããç»åã«ãªãã®ã§ãããAPIããå®è¡ãããšã®ã£ãºãåŒã䌞ã°ããæãåºãããã«ãªããŸãã
ãŸãããã ãã£ãŠã仿¹ããªãã®ã§è¿œåã¯ããªãç©ãšããŠããŸãã
å®è¡çµæ
å®è¡çµæã¯äžèšã®éãã§ããæåã«çæããç»åãæ¡å€§ããããšãã§ããŸããã


æ§ã ãªAPI
é²æç¶æ³ãååŸãã
WebUIã䜿ã£ãŠãããšããã°ã¬ã¹ããŒã§é²æãšç»åã衚瀺ãããŸãããïŒãããAPIã«åãã£ãŠããŸãã
ããã¥ã¡ã³ãã確èªãããšãããã°ã¬ã¹ã®APIã¯ä»¥äžã®ããã«ãªã£ãŠããŸãããã©ã¡ãŒã¿ãŒãšããŠã¹ããããããããã§ããããã¡ãã®åäœã¯ç¢ºèªã§ããŠããŸãã

å®è¡çµæããã¡ã
äžããé çªã«ããŒã»ã³ããŒãžãæ®ãæéããã®ä»ã¹ããŒã¿ã¹ã§ãã
äžçªäžã«ããã«ã¬ã³ãã€ã¡ãŒãžã¯WebUIã§ãåºãŠããçæéäžã®ç»åã®ããšã ãšæããŸãããã³ãŒããŸã§ã¯ããŠãªãã®ã§åãããŸãããã
ç§ã®äœæããbotã¯ãã¡ããååŸããŠã¹ããŒã¿ã¹ã¡ãã»ãŒãžã«è¡šç€ºããŸãã

ãµã³ãã©ãŒãååŸãã
ãµã³ãã©ãŒã®èšå®ã¯äžåäžå¥ééããŠã¯ãããŸããã
ãšãªããšéžæè¢ããããšå©ãããã§ããããããæäŸããã®ããã¡ãã§ãã

å®è¡çµæããã¡ã
ãµã³ãã©ã«ãã£ãŠã¯è€éãªãã©ã¡ãŒã¿ãŒãæã£ãŠãããããªã®ã§ãè¥å¹²æ§é ãè€éã§ãããäžããé çªã«ãªã¹ããéããŠè¡ã£ãŠnameãååŸããã°è¯ãããã§ãã

ã¢ããã¹ã±ãŒã©ãŒãååŸãã
ãã¡ãããµã³ãã©ãšåæ§ã§ãã

æ§é ãã»ãŒåããªã®ã§ããµã³ãã©ãŒãšåæ§ã®ããã°ã©ã ã§æœåºãå¯èœããšæãããŸãã

ä¿åãããŠããã¢ãã«ãååŸãã
ãã©ã«ãå ã«æ ŒçŽããŠããã¢ãã«ã®äžèЧãååŸããããšãã§ããŸãã

å®è¡çµæããã¡ã
äœæã£ãŠãããã¬ãã¬ã§ãããããŸãåããªãã®ããããã§ããã©

ã¢ãã«ãèšå®ãã
ã¢ãã«ã®èšå®ãäžçªæå³ã®ãããããšããã«ãããŸãã
èšå®ã¯ãªãã·ã§ã³ã«ãªã£ãŠããããã©ã¡ãŒã¿ãŒ"sd_model_checkpoint"ã§èšå®ãããŸãã

ã¡ãªã¿ã«ããã§æå®ãã¹ãååã¯ã¢ãã«ã§ååŸããæã«åºãŠãã"title"ã®éšåã«ãªããŸããééã£ãŠã"model_name"ã§ã¯ãããŸããã
ã¢ãã«ããã§ã³ãžããŠããç»åãçæããããã«ãœãŒã¹ãæ¹å€ããŸããã
import requests,base64,io
def Main():
ChangeModel()
Imgsetting = {
"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
"steps": 20,
"sampler_index":"DPM++ 2M Karras",
"width": 256,
"height": 384,
"cfg_scale": 7,
"seed": 412220144,
"save_images":False,
"enable_hr":False,
"hr_scale": 2,
"hr_upscaler": "R-ESRGAN 4x+ Anime6B",
"denoising_strength":0.5
}
resp = requests.post(url=f'http://localhost:7860/sdapi/v1/txt2img', json=Imgsetting)
json = resp.json()
imgdata = json["images"][0]
with open("test1.png","wb") as f:
buf = base64.b64decode(imgdata)
f.write(buf)
return
def ChangeModel():
option_payload = {
"sd_model_checkpoint": "HimawariMix-v8.safetensors",
}
resp = requests.post(url=f'http://localhost:7860/sdapi/v1/options', json=option_payload)
å®è¡çµæããã¡ã
å·ŠåŽãæåã«çæããç»åã§å³åŽãã¢ãã«ã倿ŽããŠæžããç»åã§ã
ã¢ãã«ã®å€æŽããã¡ããšé©çšãããŠããããšãããããŸãã

ãŸãšã
ä»åã¯SDã®APIã䜿çšããŠç»åãçæããŠãããŸããã
䟿å©ãªWebUIãããã®ã§ãããŸãAPIã䜿çšãããšãã人ã¯ããªãã®ãããããŸããããèªäœã®ãµãŒãã¹ã飿ºãããããšæã£ããéåžžã«äŸ¿å©ãªãã®ã§ãã®ã§ãæ¯é詊ããŠã¿ãŠãã ããã
ãªããAPIã䜿çšããŠç§ãäœæããDiscordã®botã¯äžèšã®èšäºããé
åžäžã§ãã®ã§ããã²ãã²äœ¿çšããŠã¿ãŠãã ããã
äŸãã°ä»åã話ãããŠããŸããããAPIãå©ãããã®ã¯ã©ã¹ãäœã£ãŠãããéåæã®ãªã¯ãšã¹ãã䜿ã£ãŠAPIãå©ããŠãããããŸãã
èšäºãåºãŠãã°ããã®éã¯Rcatãã¯ãŸã£ãŠãããšæãã®ã§ãã¢ããããŒããæåŸ
ã§ããŸãã
ããã§ã¯ãŸããäŒãããŸããã