guanghulab/video-ai-system/tools/char003_v3_r4.py
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

96 lines
4.8 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-003 V3-R4 · 候选03方向深入 · 苍耳确认 · 姿态收敛·表情内敛"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
MODEL = "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D163-VA-05-001-V3/CHAR-003-SuBai/R4"
OUT.mkdir(parents=True, exist_ok=True)
# R4 修正基于候选03方向
# 1. 去掉"单手轻抬"——手势太现代
# 2. "笑容灿烂"→"嘴角微抿淡然从容"
# 3. 半侧面姿态保留,改为更自然的站立
# 4. 强调骨相清晰、写实质感
P = """中国古代仙侠年轻宗主,单人全身立绘,纯白背景。
18岁男性亚洲面孔五官清俊英挺骨相清晰下颌线锐利剑眉星目眼神深邃内敛嘴角微抿神情淡然从容。
年轻但不轻浮,有不怒自威的宗主气度,仙风道骨,沉稳而不僵硬。
黑色长发半束半披,青色发带自然垂落。
白色交领长衫,外罩轻薄青色纱质外袍,腰间深青色丝绦玉带,衣袂自然垂落有布料重量感,面料纹理可见。
半侧身站立,双手自然垂于身侧,身姿挺拔如松,目光平视略远。
真人向3D写实渲染光影厚重自然皮肤有真实毛孔质感不良人万妖图录传硬核写实风格中国古代宗主肖像画面有电影级光影。"""
N = """笑容灿烂,露齿笑,大笑,咧嘴,表情夸张,表情丰富,活泼,元气,偶像感。
网红脸奶油小生偶像剧男主AI写真美颜滤镜磨皮化妆感浓妆。
现代手势挥手指路剪刀手比耶OK手势搭讪动作。
真人写实照片,摄影棚打光,杂志写真,现代服装,西装,短发,染发。
迪士尼皮克斯可爱娃娃脸圆脸大眼睛卖萌日系动漫Q版女性化长发辫子裙子女装。
畸形肢体,五官崩坏,模糊不清,水印,破损衣服,补丁,乞丐感,表情阴郁,愤怒。
过度油腻,头发油光,面部浮肿,双下巴,胡子,皱纹过多,苍老。
卡通渲染塑料感游戏低模低多边形廉价3D光污染特效浮夸光环仙侠页游风。
诸葛风脸,粗麻布衣,贫穷感,寒酸感,落魄。"""
VARIANTS = [
"半侧身微向左,目光平视远方,神情淡然从容,年轻宗主气质沉稳内敛",
"半侧身微向右,微风吹动发带衣袂,目光深远有神,仙风道骨",
"半侧身居中偏左,下颚微收,眼神笃定,骨相清晰,电影级光影",
"半侧身居中偏右,气质清冷高贵,不怒自威,写实质感面部纹理可见"
]
SEEDS = [555, 567, 579, 591]
def gen(prompt, neg, seed):
body = json.dumps({"model": MODEL, "prompt": prompt, "negative_prompt": neg, "size": "1440x2560", "n": 1, "seed": seed})
r = subprocess.run(["curl", "-s", "-m", "120", "--noproxy", "*", "-X", "POST", f"{URL}/images/generations",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True, timeout=130)
try:
return json.loads(r.stdout)["data"][0].get("url")
except:
print(f" API err: {r.stdout[:300]}")
return None
def dl(url, dst):
Path(dst).parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url], capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
ts = time.strftime("%Y%m%d-%H%M%S")
results = []
for i, (seed, var) in enumerate(zip(SEEDS, VARIANTS)):
full = f"{P} {var}"
print(f"[{i+1}/4] seed={seed}", flush=True)
url = gen(full, N, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V3-R4-candidate-{i+1:02d}-1440x2560.png"
if not dl(url, str(dst)):
results.append({"c": i+1, "ok": False, "err": "dl"})
continue
results.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed, "variant": var})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
meta = {"spec": "VA-05-001-V3-R4", "ts": ts, "char": "CHAR-003-SuBai",
"parent": "V3-candidate-03", "苍耳确认": "候选03方向",
"style": "不良人/万妖图录传·硬核写实·内敛宗主",
"ok": ok, "model": MODEL, "engine": "Seedream",
"results": results}
json.dump(meta, open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)