Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Dockerel/Team5_BE: 카카오테크캠퍼스 2기 Step3 5팀 백엔드 · GitHub
Skip to content

Repository files navigation

image

딸깍

개요

영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스

개발 정보

  • 2024.09 - 2024.11 (3M / 7명) [BE, AI]

기술 스택



시스템 아키텍처

image

담당한 기능

1. 대용량 영상 파일 업로드 최적화

개요

  • 영상 분석 및 편집을 위해 클라이언트측에서 영상 파일을 업로드 해주어야 함

문제 및 의사결정 과정

  • 서버를 통해 대용량 영상 파일(예: 321.6 MB)을 업로드할 때, 업로드 처리 시점에 컨테이너 CPU 사용률이 급격히 상승(2 vCPU 한도에서 최대 100%까지 소진)
  • 네트워크, 메모리, 버퍼 등 리소스 부담이 커져 확장성과 안정성에 한계가 있었음
  • 특히 동시 업로드나 대용량 파일 처리 시 서버가 바이트 스트림을 직접 중계하면서 CPU 스파이크와 지연이 발생해, 서비스 품질 저하와 인프라 비용 증가가 우려되었음
  • S3 Presigned URL을 도입하여 해결

1. S3 Presigned URL

  1. 기존의 방식

image

  • multipart/form-data를 통한 데이터 전송 시 클라이언트 → 서버, 서버 → s3로 데이터를 전송하는 이중 작업이 필요
  • 또한 서버측에서 Spring은 file-size-threshold를 넘어가는 파일은 임시 파일로 저장하여 처리하기 때문에 서버에서 대용량 파일을 직접 처리하면, 서버 자원(메모리, CPU 등)의 사용률이 증가함
  1. Presigned Url

image

  • 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로 개선
  • 서버 확장성, 안정성이 향상되고, 인프라 자원 효율 및 비용 최적화 효과를 얻음

개요

처리 과정

1. 사용자 요청

  • 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력
  • 해당 정보는 AI 서버의 /extract-highlights 엔드포인트로 전송

2. 비디오 하이라이트 추출 요청

  • AI 서버는 해당 YouTube 영상을 다운로드하고 사이즈를 조정
  • Whisper AI를 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색
  • 이 과정은 비동기적으로 처리되며, AI 서버는 이 요청에 대해 task_id를 응답으로 반환
  • task_id는 AI 서버에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됨

3. 작업 상태 조회

  • 클라이언트는 task_id를 이용해 AI 서버의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인
  • 작업 상태가 “완료”로 변경되면 클라이언트는 AI 서버의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옴

4. 하이라이트 선택 및 업로드

  • 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 AI 서버의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송
  • AI 서버는 선택한 하이라이트를 웹 백엔드 서버의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드

5. 원본 비디오 다운로드

  • 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드 가능
  • 클라이언트는 웹 백엔드 서버의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있음
  • Whisper AI로 영상에서 음성을 추출하고 스크립트 자동 생성
  • OpenAI API를 이용해 스크립트 기반으로 핵심 하이라이트 구간 추출
  • FFmpeg을 활용해 영상 리사이징(9:16) 및 자막 자동 삽입
  • 클라이언트 측에서 폴링 방식으로 진행 정도를 확인할 수 있도록 진행 상황 자동 갱신

문제 및 의사결정 과정

1. 폴링 방식 vs WebSocket vs SSE

  • 클라우드 GPU 측에서 지속 연결을 차단하여 WebSocket, SSE 사용 불가
  • 구현 단순성과 영상 생성 시간이 평균 3분 정도임을 고려하여 5초 주기의 폴링 방식 채택

2. 클라우드 GPU 도입

  • Whisper AI와 FFmpeg 영상 편집 작업에서 CPU를 사용하여 처리 시간이 오래 걸림
  • 클라우드 GPU 도입으로 Whisper AI와 FFmpeg 영상 편집 작업 처리 속도 향상

성과

  • 클라우드 GPU 환경 도입으로 Whisper 연산과 FFmpeg 처리속도가 CPU 대비 약 6.7배 향상 (20분 영상 기준, 약 20분 → 약 3분)

About

카카오테크캠퍼스 2기 Step3 5팀 백엔드

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages