⚙ 영상 생성 파이프라인
입력된 주제가 완성 영상(final.mp4)이 되기까지의 전체 과정을 설명합니다.
처리 방식: 요청은 즉시 큐에 등록되고, PHP CLI 워커 프로세스([워커스크립트])가 백그라운드에서 순차적으로 처리합니다.
브라우저를 닫아도 영상 생성은 계속 진행됩니다.
전체 흐름도
입력
→
STEP 1
스크립트 → STEP 2
이미지 → STEP 3
TTS → STEP 3.5
환경음 → STEP 4
클립 → STEP 5
합성 → 🎉 완성
스크립트 → STEP 2
이미지 → STEP 3
TTS → STEP 3.5
환경음 → STEP 4
클립 → STEP 5
합성 → 🎉 완성
STEP 1 — AI 스크립트 생성 (5% → 15%)
DeepSeek AI에게 주제 · 추가 설명 · 방향 · 영상 길이를 전달하면 아래 구조의 JSON 스크립트가 생성됩니다.
한글 입력 시 자동으로 영문 번역 후 프롬프트에 적용됩니다.
{
"title": "봄철 건강 관리 5가지 방법",
"description": "영상 설명 (100자, 배포용)",
"hashtags": ["#건강관리", "#봄건강", "#헬스팁"],
"scenes": [
{
"no": 1,
"description": "Bright spring morning, person stretching outdoors",
"narration": "따뜻한 봄이 찾아왔습니다. 이 계절에 건강을 챙기는 방법을 알아볼까요?",
"subtitle": "봄 건강 관리의 시작",
"ambient_sound": "nature",
"image_keyword": "spring morning exercise outdoor",
"duration_sec": 10
}
]
}
STEP 2 — 이미지 준비 (18% → 28%)
🌐 Pexels API 자동 다운로드
- 각 장면의
image_keyword로 Pexels 검색 - 가로/세로 비율에 맞는 이미지 자동 선택
jobs/{jobId}/images/scene_N.jpg에 저장
📤 사용자 업로드 이미지
- 업로드된 이미지를 장면 수만큼 순환 배분
- JPG · PNG 지원
- Pexels 검색 없이 바로 사용
STEP 3 — TTS 나레이션 생성 (30% → 38%)
OpenAI TTS API를 사용해 각 장면의 narration 텍스트를 음성으로 변환합니다.
- 출력 형식: MP3 (44.1kHz)
- 저장 위치:
jobs/{jobId}/audio/scene_N.mp3 - [OpenAI API 키]가 없을 경우 이 단계를 건너뜁니다 (무음 진행)
자세한 내용은 음성 · 자막 · 환경음 페이지를 참고하세요.
STEP 3.5 — 환경음 트랙 생성 (40% → 45%)
각 장면의 ambient_sound 필드 값에 해당하는 SFX 파일을 장면 길이만큼 loop+trim한 뒤, 전체 영상 길이의 단일 ambient_track.mp3로 concat합니다.
| 타입 | 설명 | 주요 사용 장면 |
|---|---|---|
nature | 자연 (새소리, 바람) | 야외, 공원, 숲 |
ocean | 바다 파도 | 해변, 수중, 여행 |
rain | 빗소리 | 감성적, 실내, 우울 |
wind | 바람소리 | 고원, 산, 개방 공간 |
city | 도시 소음 | 카페, 거리, 도심 |
indoor | 실내 공기음 | 강의, 회의, 인터뷰 |
dramatic | 저음 드라마틱 | 오프닝, 클라이맥스 |
default | 기본 배경음 | 범용 |
SFX 파일 위치:
SFX 파일이 하나도 없으면 환경음 단계를 건너뛰고 무음으로 진행합니다.
[내부경로]/[SFX폴더]/SFX 파일이 하나도 없으면 환경음 단계를 건너뛰고 무음으로 진행합니다.
STEP 4 — AI 클립 생성 (45% → 80%)
선택된 엔진으로 이미지 → 동영상 클립을 생성합니다.
①
AI 엔진 (Kling / fal.ai)
이미지와 장면 설명(description)을 전달하여 AI 동영상 클립 생성.
API 키가 있고 엔진을 선택한 경우만 시도합니다.
②
자막 소각 (burn-in)
AI 클립 생성 성공 시, subtitle 텍스트를 FFmpeg drawtext 필터로 영상에 직접 소각합니다.
한글 폰트 지원, 하단 중앙 반투명 배경 표시.
③
FFmpeg 폴백
AI 엔진 실패(API 오류, 타임아웃) 또는 FFmpeg 엔진 선택 시 Ken Burns 효과(줌+패닝) 클립 생성.
이미지 → 10초 MP4 변환, 자막 동시 소각.
STEP 5 — 최종 합성 (83% → 97%)
모든 클립을 concat하고 3트랙 오디오를 믹싱하여 final.mp4를 생성합니다.
| 트랙 | 소스 | 볼륨 | 처리 |
|---|---|---|---|
| 나레이션 | OpenAI TTS MP3 | 100% | 장면별 타이밍 오프셋 적용 |
| 환경음 | SFX concat MP3 | 35% | 영상과 동일 길이, 장면별 타입 |
| 배경음악 | ambient_default.mp3 | 10% | aloop으로 전체 반복 |
최종 합성 후 ffmpeg -ss 0.5 -vframes 1로 썸네일(thumb.jpg)을 자동 추출합니다.
완료 상태 파일:
jobs/{jobId}/status.jsonfinal.mp4, thumb.jpg, script.json 모두 같은 jobDir에 저장됩니다.