정신을 잃지 않고 텍스트, 이미지, 비디오를 하나의 파이프라인으로 연결하기
요약
텍스트, 이미지, 비디오를 하나의 파이프라인으로 연결하는 멀티모달 시스템 구축 경험을 공유합니다. 각 모달리티 간의 데이터 계약 정의, 프롬프트 최적화, 배치 처리 및 TTS 분리 등 안정적인 오케스트레이션을 위한 실무적인 팁을 다룹니다.
핵심 포인트
- 단계 간 데이터 계약(Data Contract)을 정의하여 API 변경에 대응
- 이미지 모델의 일관성을 위해 텍스트 프롬프트를 단순화
- 비디오 생성 시 타임아웃 방지를 위해 짧은 클립 단위로 배치 처리
- 비용 절감과 재시도를 위해 TTS(음성 해설) 단계를 별도로 분리
지난달 저는 클라이언트가 사용자의 텍스트 프롬프트(text prompt)를 입력받아 그에 맞는 이미지를 생성하고, 해당 이미지로부터 음성 해설(voiceover)이 포함된 짧은 비디오 클립을 제작하는 시스템을 원하는 사이드 프로젝트에 참여하게 되었습니다. 피치 덱(pitch deck)에서는 간단해 보였지만, 실제로 저는 첫 일주일 동안 어떤 API들이 서로 통신하는지, 그리고 어떤 것들이 조용히 프레임을 누락시키는지 파악하는 데에만 시간을 보냈습니다.
핵심 문제는 단일 모델의 문제가 아니었습니다. 그것은 오케스트레이션 (orchestration)의 문제였습니다. 각 모달리티 (modality)는 저마다의 특이점이 있습니다. 텍스트 모델은 관대한 편이지만, 이미지 모델은 모호한 프롬프트를 싫어하며, 비디오 파이프라인 (pipeline)은 눈을 깜빡이는 순간 당신의 RAM을 집어삼킬 것입니다.
명확한 데이터 계약(data contract)부터 시작하기
AI 코드를 작성하기 전에, 단계 사이에서 무엇이 이동하는지를 정의했습니다. 간단한 딕셔너리 (dict)가 잘 작동했습니다:
job = {
'text_prompt': 'a calm lake at sunset, painted style',
'image_url': None,
...
이 형태를 고정해 두면 각 단계는 자신의 키(key)에만 신경 쓰면 됩니다. 당연한 소리처럼 들리겠지만, 저는 이미지 생성기를 비디오 인코더 (video encoder)와 결합해 두었다가 이미지 API의 응답 형식이 변경되었을 때 울상을 짓는 팀들을 보아왔습니다.
텍스트에서 이미지로: 의도적으로 프롬프트를 지루하게 유지하기
저는 OpenAI 호환 엔드포인트를 통해 표준 디퓨저 (diffuser) 호출을 사용했습니다. 비결은 텍스트 프롬프트에서 개성을 제거하는 것이었습니다. 창의적인 표현은 이미지 모델을 혼란스럽게 만들고 흐릿한 결과를 초래했습니다.
import requests
def generate_image(prompt, api_key):
...
저는 하나의 API 키 아래 30개 이상의 모델을 통합하는 https://xinghuo1300ai.com을 발견했는데, 덕분에 위의 함수를 다시 작성하지 않고도 이미지 백엔드 (backend)를 교체할 수 있었습니다. 저는 단지 베이스 URL (base URL)과 모델 이름만 변경하면 되었습니다.
이미지에서 비디오로: 작게 배치 처리하기
단일 이미지로부터 비디오를 생성하는 과정은 문제가 발생하는 지점입니다. 대부분의 서비스는 8~16 프레임을 원하며, 그보다 길어지면 타임아웃 (timeout)이 발생합니다. 저는 클립을 4초로 제한하고 나중에 ffmpeg로 이어 붙였습니다.
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex concat=n=2:v=1:a=0 out.mp4
한 가지 주의할 점은 종횡비 (aspect ratios)입니다. 이미지는 1024x1024인데 비디오 모델이 16:9를 기대한다면, 레터박스 (letterboxing) 현상이 발생하거나 오류가 발생할 수 있습니다. 사전에 크기를 조정 (Resize) 하세요.
음성 해설 (Voiceover)은 별도의 단계입니다
API가 강제하지 않는 한, TTS (Text-to-Speech)를 비디오 호출에 묶지 마세요. TTS를 별도로 실행하면 오디오를 캐싱 (cache) 하고 재시도 (retries) 시 재사용할 수 있습니다. 비디오 작업은 이미지 작업보다 실패율이 높기 때문에, 오디오를 캐싱하는 것이 실제로 비용을 절감해 주었습니다.
실제로 효과가 있었던 것
2주가 지난 후, 파이프라인은 데모를 보여줄 수 있을 만큼 안정되었습니다. 저해상도 기준으로 전체 텍스트-이미지-비디오 작업당 총 비용은 약 $0.14 수준이었습니다. 아주 적은 금액은 아니지만, 프로토타입(prototype)으로서는 괜찮은 수준입니다.
솔직히 말씀드리면, 멀티모달 (multimodal)이 어려운 이유는 모델이 똑똑해서가 아니라 모델이 일관적이지 않기 때문입니다. 어떤 주에는 비디오 엔드포인트 (endpoint)가 MP4를 반환하더니, 다음 주에는 60초 후에 만료되는 서명된 URL (signed URL)을 반환합니다. 이러한 불안정성 (flakiness)에 대비하여 구축하세요.
현재 제 작업에서는 각 단계를 분리 (decoupled) 하여 유지하고, 특정 벤더 (vendor)에 종속되지 않도록 애그리게이터 (aggregators)를 사용합니다. 이러한 유연성이 그 어떤 영리한 프롬프트 (prompt) 기술보다 저를 더 많이 구해 주었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기