조각을 화면에 얹는 방식이라 스크롤이 한 번도 일어나지 않았다. 심규선 상세페이지 실측 — 19조각 중 1920px를 넘는 것이 0개라 scroll_scene의 span이 항상 0이었다. 화면의 13~44%만 조각이고 나머지는 블러 포스터로 남았으며, 같은 정지컷이 6초 넘게 이어졌다. 정본(tech_spec §5)에 있던 extend_to_height가 이식에서 빠진 것이 원인이다. 그것이 없으니 조각이 짧을 때 블러 배경에 상단 정렬로 얹는 수밖에 없었다. - to_surface: 롱이미지를 폭 1080으로. trim_blank를 태우지 않는다 — 위를 깎으면 섹션 y좌표가 전부 어긋난다 - extend_to_height + blank_band: 글자 없는 배경 띠를 거울 타일링, 이음매 페더 40px. 프레임보다 짧아도 풀프레임을 채운다 - scroll_scene: 배경 합성 없이 surface.crop() — 블러가 섞일 여지를 없앤다 - build_scene_plan: 섹션은 훑기 시작점, 큐 길이가 훑는 거리. 섹션이 떨어지면 앞 씬이 멈춘 자리에서 이어 읽는다(커서) - SCROLL_TAG_PRIORITY에서 notice·crossbanner 제거 — 약관을 읽히는 영상이 아니다 - final_checks: 씬 종류가 scroll이라고 적힌 것이 아니라 실제 이동 거리를 본다. 이 검사가 물러서 0픽셀 스크롤이 게이트를 통과했다 실측(심규선 자산 전체 합성, 569프레임 23.72초): 콘텐츠 비율 t=8s 23%→99% · t=11s 13%→92% · t=17s 44%→99% 프레임 간 변화량 0.01(정지) → 22~31 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| answers | ||
| assets | ||
| models | ||
| pipelines | ||
| raw_prompt | ||
| routers | ||
| services | ||
| tables | ||
| tests | ||
| utils | ||
| .dockerignore | ||
| Dockerfile | ||
| main.py | ||
| pyproject.toml | ||
| README.md | ||
| settings.py | ||
| uv.lock | ||
poster-alive
Requirements
Python
Python 3.14와 uv를 쓴다.
uv python install 3.14 # 없을 때만
cd backend
uv sync
uv sync가 pyproject.toml·uv.lock 기준으로 .venv를 만들고 패키지를 깐다.
uv run은 실행 전에 알아서 sync 한다.
.env
backend/.env에 둔다. CHATGPT_API_KEY만 없으면 기동이 안 되고, 나머지는 해당 단계를
쓸 때 필요하다.
| 키 | 쓰는 곳 |
|---|---|
CHATGPT_API_KEY |
detect · narration · motion · split 태깅 · 캐스트 · 제목 게이트 |
TYPECAST_API_KEY |
롱컷 tts (축제는 OpenAI를 써서 필요 없다) |
SUNO_API_KEY · SUNO_CALLBACK_URL |
bgm |
HIGGSFIELD_ACCOUNT |
upscale · i2v 계정 가드 |
MYSQL_URL |
DB 세션 |
AZURE_BLOB_BASE_URL · AZURE_BLOB_SAS_TOKEN |
blob 업로드 |
Docker
cd backend
docker build -t poster-alive-backend .
docker run --rm -p 30101:30101 \
--env-file .env \
-v ~/.config/higgsfield:/root/.config/higgsfield \
poster-alive-backend
Higgsfield CLI 토큰은 컨테이너가 켜질 때 호스트의 것을 참조한다.
Higgsfield CLI
③ upscale과 ⑨ i2v가 Higgsfield CLI를 서브프로세스로 부른다. 인증이 API 키가 아니라
~/.config/higgsfield/credentials.json의 CLI 토큰이라 머신마다 한 번씩 로그인해야 한다.
npm i -g @higgsfield/cli
higgsfield auth login
higgsfield workspace set <workspace-id>
로그인 후 higgsfield account status --json이 돌려주는 이메일을 .env의
HIGGSFIELD_ACCOUNT에 넣는다. 계정 가드가 이 값과 대조해, 다른 계정 토큰으로
남의 크레딧이 빠지는 것을 막는다.
실행
파이프라인 둘은 게이트에서 끊어 돌린다. 게이트에서 사람이 확인하고 다음 스크립트를 부른다.
축제 숏폼 — 포스터 1장
tests/run_poster_alive.sh test_image/<poster>.jpg # detect · narration · motion
tests/run_poster_alive_after_gate.sh test_image/<poster>.jpg # tts · bgm · i2v · render
Playreel 롱컷 — NOL 상품 id
tests/run_playreel.sh 26007416 # fetch · split · 캐스트
tests/run_playreel_after_gate1.sh 26007416 # upscale · analyze
tests/run_playreel_after_gate2.sh 26007416 # motion · narration
tests/run_playreel_after_gate3.sh 26007416 # tts · bgm · i2v
tests/run_playreel_after_gate4.sh 26007416 # hybrid · compose
단계 하나만 돌리려면 모듈로 부른다. backend/에서 실행해야 한다.
uv run python -m tests.playreel.test_tts 26007416
산출물은 tests/test_result/<플로우>/ 아래에 쌓인다.