guanghulab/video-ai-system/tools/char004_gen_r5.py
冰朔 6e06ebe6f2
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
D157 · CHAR-004 R5剧本锚定版 · .code-map新增VA-60/VA-05-X映射 · 闸门0规则封装
2026-07-01 15:21:13 +08:00

55 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""CHAR-004 R5 · 剧本锚定版 · 18岁淳朴粗麻白衣 · 纯文生图"""
import sys,os,json,time,subprocess
from pathlib import Path
sys.path.insert(0,os.path.dirname(__file__))
from secrets_loader import secret,endpoint
AK=secret("SC-001");URL=endpoint("EPT-001");M="doubao-seedream-4-0-250828"
ROOT=Path(__file__).resolve().parents[1];J=Path("/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/图片/zai-fu-fei-xiu-xian/ep01")
CD=ROOT/"assets/candidates/D157-VA-05-001-R5"/"CHAR-004-ZhugeFeng"
P="""3D动漫卡通渲染国风玄幻动态漫质感单人男性全身立绘纯白背景。
角色为18岁少年身形挺拔偏瘦小麦色肤色面部轮廓利落剑眉星目眼神澄澈有韧劲气质淳朴端正。
黑色短发,半束高马尾,用普通深棕色木簪固定,额前有少量碎发,发型整洁。
身穿素色粗麻交领上衣,袖口收窄,内搭浅色中衣,布料平整干净,无破损、无补丁、无污渍。腰间系深棕色粗麻绳腰带,系法简洁。
下装为同色系粗麻长裤,裤脚收进黑色短靴里,靴面整洁。
腰间挂一个深灰色布囊,形制简单,完整无破损。
人物比例协调,线条清晰,光影柔和,整体为干净整洁的修仙少年形象。"""
N="""乞丐,流民,流浪汉,破旧衣服,破洞,补丁,污渍,泥点,脏鞋,破烂袖口,毛边,褪色,磨损,衣衫褴褛,寒酸感,佝偻,颓废,萎靡,肮脏凌乱。
与苏白长相相似,同款五官,同款脸型,真人写实,照片,畸形肢体,五官崩坏,模糊,水印,多余装饰,玉佩,首饰,华丽服饰。"""
V=["正面直视镜头,表情端正沉稳","微微侧身站姿,目光澄澈看向前方","略微仰视,下颌抬起,眼神向上有期待","3/4侧脸侧视左前方少年英气淳朴"]
S=[42,137,256,399]
def g(prompt,neg,seed):
url=f"{URL}/images/generations"
r=subprocess.run(["curl","-s","-m","120","--noproxy","*","-X","POST",url,
"-H",f"Authorization: Bearer {AK}","-H","Content-Type: application/json",
"-d",json.dumps({"model":M,"prompt":prompt,"negative_prompt":neg,"size":"1440x2560","n":1,"seed":seed})],
capture_output=True,text=True,timeout=130)
try:d=json.loads(r.stdout);return d["data"][0].get("url")
except:return None
def d(url,dst):
Path(dst).parent.mkdir(parents=True,exist_ok=True)
subprocess.run(["curl","-s","-m","60","-L","--noproxy","*","-o",dst,url],capture_output=True,timeout=65)
return os.path.exists(dst) and os.path.getsize(dst)>1024
def main():
print("CHAR-004 R5 · 剧本锚定 · 18岁淳朴粗麻白衣")
if not AK: sys.exit("✗ no key")
ts=time.strftime("%Y%m%d-%H%M%S");rd=J/"D157-R5"/ts;rd.mkdir(parents=True,exist_ok=True)
CD.mkdir(parents=True,exist_ok=True);rs=[]
for i,(seed,var) in enumerate(zip(S,V)):
full=f"{P} {var}";print(f"[{i+1}/4] seed={seed}",flush=True)
url=g(full,N,seed)
if not url:rs.append({"c":i+1,"ok":False,"err":"api"});continue
raw=rd/f"CHAR-004-R5-{i+1:02d}-1440x2560.jpg"
if not d(url,raw):rs.append({"c":i+1,"ok":False,"err":"dl"});continue
sc=CD/f"CHAR-004-R5-candidate-{i+1:02d}-1080x1920.jpg"
subprocess.run(["sips","-z","1920","1080",str(raw),"--out",str(sc)],capture_output=True)
rs.append({"c":i+1,"ok":True,"raw":str(raw),"scaled":str(sc),"seed":seed});time.sleep(2)
ok=sum(1 for r in rs if r["ok"]);print(f"完成:{ok}/4")
with open(CD/"generation-meta.json","w") as f:json.dump({"spec":"VA-05-001-R5","ts":ts,"ok":ok,"results":rs},f,ensure_ascii=False,indent=2)
return 0 if ok>=4 else 1
if __name__=="__main__":sys.exit(main())