Bun 스크립트와 Runway API를 사용하여 시네마틱 비디오 광고 생성하기
요약
Bun 스크립트와 Runway API를 활용하여 시네마틱 비디오 광고를 생성하는 실무 가이드를 소개합니다. API 호출 구조, 보안 주의사항, 효율적인 프롬프트 작성법 및 화면 비율 설정 등 실제 개발 과정에서의 팁을 다룹니다.
핵심 포인트
- Runway API는 비동기 방식으로 작동하며 작업 완료를 위한 폴링 단계가 필수적임
- API 키 보안을 위해 CLI 플래그 대신 환경 변수 사용을 권장함
- 세로형 영상 제작 시 크롭 대신 처음부터 적절한 화면 비율로 요청해야 함
- 구체적인 촬영 기법 용어를 포함한 프롬프트가 고품질 결과물을 생성함
체스 앱 광고를 위한 5초 분량의 시네마틱 비디오 클립이 필요했습니다. 카메라도, 배우도, 그 둘을 위한 예산도 없었습니다. 그래서 Runway의 API를 연결하고 Bun 스크립트로 클립들을 생성했습니다. 문서에서 대충 넘어가는 부분을 포함하여 전체 과정을 소개합니다.
API의 구조
Runway의 비디오 생성은 비동기(async) 방식입니다. 한 번의 호출로 비디오를 바로 돌려받지 못합니다. 작업을 시작한 다음, 완료될 때까지 폴링(polling)을 수행하고, 그 후에 결과를 다운로드해야 합니다. 총 세 단계이며, 사람들이 실수하는 지점은 바로 폴링 단계입니다.
현재 텍스트 투 비디오(text-to-video)에 중요한 모델들은 다음과 같습니다:
gen4.5: 초당 12 크레딧 소모. 저의 기본 설정입니다. 스틸 프레임이 스톡 푸티지(stock footage)처럼 보일 정도로 충분히 훌륭합니다.veo3.1: 초당 20-40 크레딧 소모. Google의 모델입니다. 움직임은 더 뛰어나지만 비용이 더 많이 듭니다.gen4_turbo: 초당 5 크레딧 소모하지만, 입력 이미지(input image)가 필요합니다.
초당 12 크레딧 기준으로 5초 클립은 60 크레딧이 소모됩니다. 크레딧은 하나당 약 1페니 정도이므로, 클립 하나당 약 60센트 정도입니다. 프롬프트를 반복 수정하며 12개의 클립을 생성했는데, 샌드위치 하나 값보다 적게 들었습니다.
인증(Auth), 그리고 하지 말아야 할 한 가지
API 키는 환경 변수(env var)인 RUNWAYML_API_SECRET에 저장됩니다. 이를 CLI 플래그로 전달하지 마세요. 셸 히스토리(shell history)에 남게 되고, 해당 시스템을 사용하는 다른 사람이 ps 명령어를 통해 확인할 수 있습니다. 환경 변수나 .env 파일만 사용하세요. 다른 방법은 안 됩니다.
배치(batch) 작업을 시작하기 전에 잔액을 확인하세요:
curl -s https://api.dev.runwayml.com/v1/organization \
-H "Authorization: Bearer $RUNWAYML_API_SECRET" \
-H "X-Runway-Version: 2024-11-06" | jq .creditBalance
X-Runway-Version 헤더는 필수입니다. 이 헤더를 누락하면 실제 문제와는 전혀 상관없는 혼란스러운 에러 메시지를 받게 됩니다.
실제로 효과가 있었던 방법
세로형 릴스(portrait reels)를 위해 비율(ratio)을 720:1280으로 설정했습니다. 이는 프롬프트보다 더 중요합니다. 1280:720으로 생성한 다음 세로로 크롭(crop)하면 픽셀의 절반을 버리게 되고 구도(framing)도 틀어집니다. 실제 배포할 화면 비율을 요청하세요.
사용 가능한 푸티지(footage)를 만들어준 프롬프트들은 지루할 정도로 구체적이었습니다:
따뜻한 창가 햇살 아래 나무 체스판을 공부하는 젊은 여성의 시네마틱한 세로형 샷, 집중된 표정, 포토리얼리스틱 (photorealistic), 얕은 피사체 심도 (shallow depth of field), 부드러운 필름 그레인 (soft film grain)
저 단어 하나하나가 제 역할을 하고 있습니다. "Cinematic"과 "shallow depth of field"는 배경을 흐릿하게 만들어 줍니다. "Soft film grain"은 AI 특유의 인위적인 광택을 제거합니다. "Photorealistic"은 일러스트레이션처럼 변하는 것을 막아줍니다. 이 중 하나라도 빼면 품질이 함께 떨어집니다.
모호한 프롬프트는 모호하고, 붕 떠 있으며, 누가 봐도 생성된 티가 나는 쓰레기를 만들어냈습니다. 모델은 실제 촬영 감독 (DP)이 설정할 법한 실제 샷을 묘사할 때 보상을 줍니다.
폴링 (Polling) 주의사항
5초짜리 gen4.5 클립의 경우, 작업이 RUNNING 상태로 60초에서 120초 동안 머뭅니다. 스크립트는 단순히 요청만 보내고 끝내는(fire-and-forget) 방식이 아니라, 폴링 (polling)을 하며 기다려야 합니다. 또한 제 티어에서 gen4.5의 동시성 제한 (concurrency limit)은 1이므로, 배치 (batch) 생성을 할 때는 Promise.all을 사용하는 것이 아니라 직렬 (series)로 실행해야 합니다. 첫 번째 호출이 아직 처리 중일 때 두 번째 호출이 실패하는 것을 보고 이 사실을 배웠습니다.
대략적인 루프 (loop) 구조:
- 작업을 시작하기 위해 POST 요청을 보내고, 작업 ID (task id)를 받습니다.
- 몇 초마다 GET 요청으로 작업 상태를 확인합니다.
- 상태가
SUCCEEDED로 바뀌면, 출력 URL을 가져와 다운로드합니다. FAILED상태가 되면 이유를 읽습니다.SAFETY.INPUT은 프롬프트가 검열 (moderation)에 걸렸음을 의미하므로 문구를 수정해야 합니다.ASSET.INVALID는 입력 이미지가 잘못되었음을 의미합니다.
가치가 있었는가
네. 클립들은 실제 광고처럼 나왔습니다. ffmpeg를 사용하여 그 위에 자막과 보이스오버 (voiceover)를 입히고 릴스 (reels)로 배포했습니다. 책상 스탠드 아래에서 좌절하는 플레이어, 정장을 입고 수를 두는 아이, 창가에 있는 여성까지. 이들 중 실제 인물은 아무도 없습니다. 하지만 지나가며 스크롤하는 사람이 눈치채지 못할 정도로 모두 충분히 진짜처럼 보입니다.
이 모든 과정은 스크립트 하나로 실행됩니다. 장면을 묘사하고, 2분을 기다리면, 클립을 얻습니다. 1년 전과 비교하면 정말 놀라운 수준입니다.
영상 제작이 필요한 무언가를 만들고 있는데 촬영 팀이 없다면, 이것이 바로 치트 코드 (cheat code)입니다. 이것은 제가 광고를 만든 앱인 aichess.guru를 위한 것이었습니다. 왜 패배했는지 알려주는 AI 코치입니다. 무료로 시작할 수 있습니다.
Runway나 Veo, 또는 Kling에서 비디오 파이프라인 (video pipelines)을 구축하고 계신가요? 여러분은 어떤 프롬프트 (prompts)가 일관되게 작동하는 것을 발견했는지 알고 싶습니다. 제가 사용하는 방식은 여전히 절반 정도는 추측에 의존하는 느낌입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기