上一篇博文里成功部署了webui,并且调配出了满意的文生图效果,那么接下来就是向未来的前端提供一个方法,允许随时通过webui生成图片。这就不得不用到webui的API了。
根据webui官方仓库的Wiki,它已经提供了众多方法可供调用,其中就包括text2img文生图,且直接调用API可以充分设置各项参数,完美满足我们的需求。
带参数启动webui
根据wiki的指引,我在终端输入了带API启动的命令:
webui-user.bat --api
接着打开http://127.0.0.1:7860/docs/,也即官方提供的API列表,然而却并没有找到上图的两个API。几经摸索,我在issue里找到了解法,编辑webui-user.bat文件,修改其中的启动参数行:
set COMMANDLINE_ARGS=--api
在这里加入“--api”这一参数,并正常启动webui-user.bat,这才终于见到了text2imgapi。
借助第三方开源库调用API
官方在API文档里给出了许多可以直接调用的接口,但我选择采用第三方仓库sdwebuiapi来调用,这个库对官方的接口加以封装,使得调用起来更加简单粗暴了。这个库可以直接通过pip方便地安装,而Git仓库里也给出了使用的示例,用起来还是很轻松的。
工具齐全了,那就该敲点代码实际应用了。下面的代码提供了一个简单的方法,预先写死生图的参数(因为没有改变的需求),传入从GLM处提取到的角色表情描述文本,将这几段文本提示词插入prompt当中,接着调用API进行生图,最后把图片存储到本地并返回文件位置,以供前端后续使用。
import webuiapi
def draw_expression(charactor_expression):
# 本地部署的默认api
api = webuiapi.WebUIApi(host = '127.0.0.1',
port = 7860,
sampler = 'Euler a',
steps = 20)
# 调用api提供的txt2img接口,在通用prompt中插入从GLM处获取的表情描述
prompt = "(masterpiece, best quality:1), 1girl, solo, arisu, halo,"
for e in charactor_expression:
prompt += e + ','
prompt += "white background <lora:BlueSD:1>, <lora:tendouAliceV1:1>"
result1 = api.txt2img(prompt = prompt,
negative_prompt = "noisy, blurry, grainy,text, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, (realistic, lip, nose, tooth, rouge, lipstick, eyeshadow:1.0), low contrast",
seed = -1,
styles = ["animate"],
cfg_scale = 8
)
# result1.image.show()
# 存储输出的图片,并返回文件名
if len(charactor_expression) == 0:
save_file_name = './outputs/output_no_expression'
else:
save_file_name = './outputs/output'
for i in charactor_expression:
save_file_name += '_' + i.replace(" ", "_")
save_file_name += '.png'
result1.image.save(save_file_name)
return save_file_name
test_expression = ['Greet happily', 'Rub your hands']
img_file_Location = draw_expression(charactor_expression = test_expression)
print('output image saved to ' + img_file_Location)
万事俱备,启动webui,运行代码,可见在项目文件夹的指定位置果然得到了所需的图片。