Gemini 렌더링 — 씬 기반 파이프라인 구축
이번 작업의 핵심은 두 가지였다. 모델 업그레이드, 그리고 씬 단위 렌더링 구조 도입.
Gemini 2.5 Flash 업그레이드
script-generator.ts에서 모델을 gemini-2.0-flash에서 gemini-2.5-flash로 올렸다. 모델 교체 자체는 단순하다. 근데 이번 업그레이드의 진짜 목적은 Scene 인터페이스를 새로 정의하는 거였다.
interface Scene {
start: number;
end: number;
text: string;
keyword: string; // Pexels 검색용 영문 키워드
effect: "zoom-in" | "zoom-out" | "pan-left" | "pan-right";
}
ScriptOutput에 scenes 배열을 추가하고, 시스템 프롬프트에 5~8개 씬을 생성하도록 규칙을 넣었다. 씬당 5~10초, 키워드는 Pexels에서 잘 검색되도록 영문으로 뽑게 했다.
씬별 렌더링 파이프라인
render-worker 쪽은 꽤 많이 바뀌었다. image-generator.ts에서 함수명을 generateBackgroundImage에서 downloadSceneImage로 바꾸고, 검색 결과 수를 10개로 늘려 씬마다 다른 이미지를 쓸 수 있게 했다.
renderer.ts에는 buildZoompanFilter 함수를 추가해서 4종 효과를 FFmpeg zoompan 필터로 변환한다. 씬 배열을 순회하며 클립을 개별 생성한 뒤 concat 필터로 합치는 방식이다.
scenes 데이터가 없는 경우(구버전 스크립트 등)에는 topic 키워드로 단일 이미지 fallback 처리도 추가했다. 하위 호환성 챙기는 게 번거롭지만, 안 하면 나중에 꼭 터진다.
자막 스타일도 Bold, Outline, Shadow 옵션으로 개선했다. Shorts 특성상 가독성이 중요한데, 기존에는 단순 텍스트라 너무 밋밋했다.