上一篇博文里实现了调用API来生成爱丽丝的图片,但这还不够,为了满足项目需求,还需要让程序能够自由调用多个角色的LoRA,所以这次,新角色三月七堂堂登场。
优化项目文件结构
在上一篇博文中,由于尚在测试,只是完成了一个简单的py文件,而最终对接时需要提供方法到客户端,因此我把调用api相关的功能全都封装到了子文件夹 ./api 下。
这时候在 call.py 中就可以方便地调用api了,为了接下来允许自由选择人物生图,我提前给生图方法加上了角色名的参数,从这里传参就能立马得到测试结果。
import api
characters = ["Arisu", "March7th_sticker", "March7th"]
test_expression = ['Happily', 'Rub your hands']
img_file_Location = api.SD_draw_expression(character_name = characters[0],character_expression = test_expression)
print('output image saved to ' + img_file_Location)
Prompt的准备
由于不同的角色会有不同的Prompt,我决定采用Json文件来存储每个角色对应的Prompt,在生图过程中,把角色名和json文件进行比对,就可以获取到目标Prompt。
在civitai上查找三月七的LoRA,找到了普通版和Q版两个风格,不过这些LoRA当然天生和BA的画风不太协调,所以到时候写Prompt我会把BA风格的LoRA一并用上。
接下来我分别把他们写进了json,只要完善好新的生图方法就可以自由地调试:
{
"Arisu":[
{"prompt1": "(masterpiece, best quality:1), 1girl, solo, arisu, halo,"},
{"prompt2": "white background <lora:BlueSD:1>, <lora:tendouAliceV1:1>"}
],
"March7th_sticker":[
{"prompt1": "(masterpiece, best quality:1), 1girl, solo, pink_hair, chibi, pink_eyes, blue_eyes, multicolored_eyes, earrings,"},
{"prompt2": "white background <lora:BlueSD:0.8>, <lora:March_7th_Emote:1>"}
],
"March7th":[
{"prompt1": "(masterpiece, best quality:1), 1girl, solo, march7th, short hair, multicolored_eyes, pink hair, bangs, blue_eyes, long locks, ribbon earrings, shirt, skirt, choker, jacket,"},
{"prompt2": "white background <lora:BlueSD:1>, <lora:march7th:0.8>"}
]
}
至于为什么每个角色有两段Prompt,前半段是角色的描述,后半段是画面背景和LoRA,而中间则是用于插入角色的表情和动作,主要是为了规范。
读取Json
用Python读取Json的方法很简单,这里不赘述,直接上代码:
import json
import os
def get_character_data(character_name):
# 从Json文件中找到对应角色,从而设置prompt
path = os.path.dirname(__file__)
with open(os.path.join(path, 'character_prompts.json'), 'r', encoding='utf8') as character_file:
character_data = json.load(character_file)
prompts = []
prompts.append(character_data[character_name][0]['prompt1'])
prompts.append(character_data[character_name][1]['prompt2'])
return prompts
这个方法可以从同级目录下读取刚才的Json文件,并且根据传入的角色名获得该角色对应的两段Prompt,最后以数组形式返回给主方法,而主方法则只需要略微修改就能成功生图。
这一次的工作就以生成的图片告终了。
那么,两种风格的三月七,你更喜欢哪一种呢?欢迎投票选出你的想法[doge]