tts-voice-creator-clone-and.../scripts/generate_character_image_samples.py
mARTin-B78 f7264a8c07 chore: release 1.21.0 - Consistent ComfyUI Character Renders and Audiobook Export
- Deterministic hash-based character portraits and reference sheets
- Implemented strict early Renaissance aesthetic controls and role-specific headwear rules
- Added audiobook batch export scripts and progress tooling
- Verified book profiles with a new 'confirmed' state tracking mechanism
- Updated Pillow dependency for robust image handling
- Configured .gitignore for audiobook and audio cache exports
2026-08-23 09:12:57 +02:00

53 lines
2.5 KiB
Python

#!/usr/bin/env python3
"""Generate ten concept-sheet shared-identity character image pairs after export."""
from __future__ import annotations
import requests
BASE = "http://127.0.0.1:7890"
TARGETS = [
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Darrag"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Eolan"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Baronin Ira von Seewiesen"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Gamba"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Alrik von Blautann"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Andra"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Cindira"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Admiral Sanin"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Arthag"),
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Anshelm"),
]
def main() -> None:
all_chars = requests.get(f"{BASE}/api/characters", timeout=30).json()["characters"]
for book, name in TARGETS:
item = next(c for c in all_chars if c.get("book") == book and c.get("name") == name)
record = requests.get(f"{BASE}/api/characters/{item['id']}", timeout=30).json()
sheet = record.get("sheet") or {}
print(f"[{name}] generating concept profile + reference sheet", flush=True)
response = requests.post(
f"{BASE}/api/character-generate-consistent-images",
json={
"profile_prompt": sheet.get("image_prompt", ""),
"reference_prompt": sheet.get("concept_art_prompt", ""),
"visual_style": "concept",
"identity_image": record.get("image", ""),
},
# The local Qwen graph renders the portrait and 3:2 sheet in
# sequence; allow the app's 25-minute server-side deadline.
timeout=1800,
)
response.raise_for_status()
result = response.json()
record["image"] = result["profile"]
record["sheet"] = {**sheet, "concept_art_image": result["reference"]}
saved = requests.put(f"{BASE}/api/characters/{item['id']}", json=record, timeout=60)
saved.raise_for_status()
print(f"[{name}] saved", flush=True)
print("TEN CHARACTER IMAGE SAMPLES COMPLETE", flush=True)
if __name__ == "__main__":
main()