영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스
- 2024.09 - 2024.11 (3M / 7명) [BE, AI]
- 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함
- 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
- 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
- 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
- S3 Presigned URL을 도입하여 해결
- 기존의 방식
- multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
- 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
- Presigned Url
-
Presigned Url은 s3의 소유자가 미리 업로드, 다운로드 등에 대해 서명을 해준 뒤 사용자에게 해당 Url을 제공해주는 방식
-
해당 방식을 사용하면 클라이언트는 서버를 거치지 않고 파일을 s3에 바로 업로드할 수 있어 서버의 자원을 절약할 수 있고, 트래픽이나 스토리지 사용에 대한 추가 비용 또한 절약할 수 있음
-
프로메테우스 쿼리 : 100 * rate(process_cpu_time_ns_total[5m]) / 1e9 / 2 로 CPU 사용률을 정량적으로 비교
- 동일 조건(321.6 MB 단일 파일, 컨테이너 2 VCPU)에서 업로드 처리 구간의 JVM CPU 사용률이 2.0(100%) → 0.4(20%)로 개선
- 서버가 파일 데이터 중계를 하지 않으므로, 업로드 API의 응답 시간도 3448ms → 8ms로 개선
- 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음
처리 과정
- 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
- 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송
- AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
- Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
- 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
- task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨
- 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
- 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴
- 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
- AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드
- 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
- 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
- Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
- OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
- FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
- 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신
- 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
- 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택
- Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
- 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상
- 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)


