playreel/backend/services/styling/poster_text.py

38 lines
1.3 KiB
Python

"""스타일링 ① — 포스터에 인쇄된 글자를 읽는다
이미지 생성 모델은 한글을 다시 그리며 자모를 바꾼다(맥주축제 → 백주축제).
프롬프트로는 못 막으므로 읽기를 먼저 하고 그 문자열을 생성 프롬프트에 못 박는다.
"""
from PIL import Image
from answers.poster_text_answer import PosterTextAnswer
from settings import settings
from utils.common_llm import StructuredLLM
from utils.image import to_data_uri
from utils.prompt import load_prompt
# 자모가 보일 만큼은 키워서 넣는다
MIN_LONG_EDGE = 1400
MAX_SIZE = (1536, 1536)
POSTER_TEXT_PROMPT = load_prompt("poster_text")
poster_text_llm = StructuredLLM("gpt-4o", settings.chatgpt_api_key)
def readable_copy(poster: Image.Image) -> Image.Image:
source = poster.convert("RGB")
if max(source.size) < MIN_LONG_EDGE:
scale = MIN_LONG_EDGE / max(source.size)
source = source.resize((round(source.width * scale), round(source.height * scale)),
Image.LANCZOS)
source.thumbnail(MAX_SIZE, Image.LANCZOS)
return source
async def read_poster_text(poster: Image.Image) -> PosterTextAnswer:
image = readable_copy(poster)
return await poster_text_llm.ask_with_images(
PosterTextAnswer, POSTER_TEXT_PROMPT, [("포스터", to_data_uri(image))],
temperature=0.1)