diff --git a/app/utils/creatomate.py b/app/utils/creatomate.py index 6315b79..e9574f4 100644 --- a/app/utils/creatomate.py +++ b/app/utils/creatomate.py @@ -244,6 +244,20 @@ VERTICAL_INDUSTRY_TEMPLATE_MAP: dict[str, str] = { # 매핑에 없는 업종(salon, clinic 등)의 폴백 템플릿 DEFAULT_VERTICAL_TEMPLATE = DVST0001 +# 템플릿 슬롯명의 모션 동의어 → MotionRecommended 표준값 정규화 맵. +# 동의어를 enum에 추가하면 LLM 태그 후보가 갈라져 매칭 정확도가 떨어지므로, +# enum은 표준 어휘만 유지하고 슬롯명 파싱 경계에서 흡수한다. +MOTION_TOKEN_NORMALIZATION: dict[str, MotionRecommended] = { + "zoom_in": MotionRecommended.slow_zoom_in, + "zoom_out": MotionRecommended.slow_zoom_out, + "pan_left": MotionRecommended.slow_pan, + "pan_right": MotionRecommended.slow_pan, + "tilt_up": MotionRecommended.slow_pan, + "tilt_down": MotionRecommended.slow_pan, + "push_diag": MotionRecommended.dolly, + "montage": MotionRecommended.static, +} + SCENE_TRACK = 1 AUDIO_TRACK = 2 SUBTITLE_TRACK = 3 @@ -677,7 +691,8 @@ class CreatomateService: space_type = SpaceType(tag_list[0]) subject = Subject(tag_list[1]) camera = Camera(tag_list[2]) - motion = MotionRecommended(tag_list[3]) + # 모션 동의어(zoom_in, pan_left 등)는 표준 enum 값으로 정규화 후 변환 + motion = MOTION_TOKEN_NORMALIZATION.get(tag_list[3]) or MotionRecommended(tag_list[3]) narrative = NarrativePhase(tag_list[4]) tag_dict = { "space_type": space_type, diff --git a/app/utils/prompts/schemas/image.py b/app/utils/prompts/schemas/image.py index 3a177b1..eddaff8 100644 --- a/app/utils/prompts/schemas/image.py +++ b/app/utils/prompts/schemas/image.py @@ -42,6 +42,24 @@ class SpaceType(StrEnum): detail_lighting = auto() detail_decor = auto() detail_tableware = auto() + # 레스토랑(DVRT0001) 템플릿 어휘 + dining_hall = auto() + table_setting = auto() + private_room = auto() + detail_cooking = auto() + detail_plating = auto() + detail_menu = auto() + detail_dish_main = auto() + detail_dish_side = auto() + brand_summary = auto() + # 카페(DVCF0001) 템플릿 어휘 + hall = auto() + counter_bar = auto() + seating_window = auto() + seating_lounge = auto() + signage = auto() + detail_dessert = auto() + detail_signature_drink = auto() class Subject(StrEnum): """이미지 내 주요 피사체 유형. 화면에 무엇이 담겨 있는지를 분류하는 태그.""" @@ -55,6 +73,14 @@ class Subject(StrEnum): signage = auto() amenity_item = auto() person = auto() + # 레스토랑(DVRT0001) 템플릿 어휘 + cooking_action = auto() + menu_board = auto() + triptych = auto() + # 카페(DVCF0001) 템플릿 어휘 + beverage = auto() + brewing_action = auto() + dessert = auto() class Camera(StrEnum): """이미지의 촬영 기법·구도·조명 특성. 영상 편집 시 컷의 시각적 스타일을 구분하는 태그."""