- 이메일: ojosama55@gmail.com
- 비밀번호: kakao2024
- 🍪노션 페이지
- ✨프로젝트 소개
- [🙋🏻♂️내가 기여한 부분]
- 🖥️배포 링크
- 🤝그라운드 룰
- 📜커밋 컨벤션
- 👨💻코딩 컨벤션
- 📋API 명세서
- ❎에러코드 정의서
- 🛠️테스트 결과 보고서
영상 하이라이트를 분석하여 쇼츠를 생성해주는 쇼츠 자동화 서비스
딸깍은 크리에이터들이 손쉽게 긴 영상에서 핵심 장면을 자동으로 추출하고, 짧고 임팩트 있는 숏폼 콘텐츠로 편집해주는 AI 기반 서비스입니다. 사용자는 딸깍을 통해 클릭 한 번으로 하이라이트 영상을 생성할 수 있을 뿐 아니라, 사용자 간 피드백을 주고받으며 성장할 수 있는 커뮤니티도 제공합니다.
최근 영상 소비 트렌드는 짧고 핵심적인 숏폼 위주로 변하고 있습니다. 이러한 흐름에 맞춰, 딸깍은 영상 편집의 진입 장벽을 낮춰 누구나 손쉽게 숏폼 영상을 만들고 공유할 수 있도록 돕는 것을 목표로 하고 있습니다. 또한, 서로의 영상을 시청하고 피드백을 교환할 수 있는 커뮤니티를 통해 사용자들이 상호작용하며 함께 성장할 수 있는 플랫폼을 제공합니다.
1. 하이라이트 추출 및 숏폼 생성: AI가 긴 영상에서 주요 장면을 분석하여 자동으로 숏폼 영상으로 편집해주어, 짧은 시간 내에 완성도 높은 콘텐츠를 제작할 수 있습니다.
2. 커뮤니티 기반 피드백: 사용자 간에 서로의 콘텐츠에 대해 피드백을 교환하고, 이를 바탕으로 콘텐츠를 개선할 수 있는 커뮤니티 기능을 제공합니다.
3. 사용자별 추천 영상: 각 사용자의 관심사와 영상을 분석하여, 개인에게 적합한 흥미로운 콘텐츠를 추천합니다.
-
- 전체 유튜브 인기 쇼츠 추출 From Youtube Data API
- 특정 카테고리 유튜브 인기 쇼츠 추출 From Youtube Data API
-
영상 추천 알고리즘 메서드 작성 https://github.com/yjhannn/recommend-algorithm
- 캐싱 처리
- 서비스 성장 시 과도한 외부 API 호출을 방지한 캐싱 작업
- 6시간마다 캐시 제거 후 최신 데이터 불러오도록 설정
- 좋아요 및 조회수 Mysql에서 Redis로 이전
를 기반으로 추천 영상 리스트를 생성하게 하였고, 좋아요 기능은 Redis 동시성 제어 기능을 활용하여 안전하게 전체 좋아요 수가 반영되도록 설계하였습니다.
- Docker 컨테이너로 서버에 배포하여 배포의 안정성을 높였고, 테스트용 Redis 컨테이너를 별도로 구성하여 테스트에도 활용될 수 있도록 하였습니다.
- 저희 서비스에서는 많은 양의 외부 API 호출을 효율적으로 처리하기 위해 스프링 내장 캐시인 Ehcache를 도입하여 캐싱 전략을 구현하였습니다.
- 인기 있는 유튜브 쇼츠와 카테고리별 쇼츠 영상을 가져올 때, 6시간 간격으로 캐시를 업데이트하여 최신 데이터를 제공하도록 구현했습니다.
- 이를 통해 유튜브 쇼츠 레퍼런스 기능에서 자주 요청되는 데이터를 캐싱하여 응답 속도를 개선하고 네트워크 비용을 절감하는데 주력했습니다.
- 사용자 요청 클라이언트에서 Google 계정으로 로그인한 사용자가 YouTube URL, 제목, 카테고리 등의 정보를 입력합니다. 해당 정보는 Spring Framework 웹 애플리케이션에서 FastAPI 애플리케이션의 /extract-highlights 엔드포인트로 전송됩니다.
- 비디오 하이라이트 추출 요청 (FastAPI) FastAPI는 요청을 수신한 후, 해당 YouTube 영상을 다운로드하고 사이즈를 조정합니다. Whisper 모델을 이용하여 비디오의 스크립트를 추출하고, GPT 모델을 통해 하이라이트 구간을 탐색합니다. 이 과정은 비동기적으로 처리되며, FastAPI는 이 요청에 대해 task_id를 응답으로 반환합니다. task_id는 FastAPI의 로컬 스토리지에서 비동기 작업 상태와 결과 데이터를 관리하는 키로 사용됩니다.
- 작업 상태 조회 (Polling) 클라이언트는 task_id를 이용해 FastAPI의 /task-status/{task_id} 엔드포인트에 polling을 시도하며 작업 상태를 확인합니다. 작업 상태가 “완료”로 변경되면 클라이언트는 FastAPI의 /select-highlight/{task_id} 엔드포인트를 호출하여, 생성된 5개의 하이라이트 후보 영상의 S3 URL과 관련 메타데이터(DTO)를 받아옵니다.
- 하이라이트 선택 및 업로드 사용자는 5개의 하이라이트 중 하나를 선택하고, 프론트엔드에서 FastAPI의 /select-highlight 엔드포인트로 task_id와 선택한 영상의 인덱스(index)를 전송합니다. FastAPI는 선택한 하이라이트를 Spring Framework 웹 애플리케이션의 /api/videos/create 엔드포인트에 전달하여, 최종적으로 해당 하이라이트를 Video 객체로 웹 서비스에 업로드합니다.
- 원본 비디오 다운로드 업로드된 비디오가 Video 객체로 생성된 후, 사용자는 원본 비디오를 다운로드할 수 있습니다. 클라이언트는 Spring 웹 애플리케이션의 /api/videos/{videoId}/extract 엔드포인트에 요청하여, 원본 비디오의 AWS S3에 저장된 presigned URL을 받아 로컬로 다운로드할 수 있습니다.
┌────────────┐
│ Client │
└─────┬──────┘
│
(User Input: │ YouTube URL, ...)
│
▼
┌─────────────────────────────┐
│ Spring Framework Web Server │
└─────────────┬───────────────┘
│
POST /extract-highlights (video info)
│
▼
┌───────────────────┐
│ FastAPI Server │
└───────┬───────────┘
│
┌──────────────▼───────────────┐
│ Background Task (Async) │
│ - Video download │
│ - Resize, Whisper model │
│ - Highlight extraction (GPT) │
└──────────────┬───────────────┘
│
Respond with │ task_id
│
▼
┌────────────────────┐
│ Client (Polling) │
└─────────▲──────────┘
│
GET /task-status/{task_id}
│
If Status = "Complete"
│
▼
GET /select-highlight/{task_id}
│
│
(5 highlight │ S3 URLs)
│
▼
┌────────────────────────────┐
│ Client selects one video │
│ POST /select-highlight │
└──────────┬─────────────────┘
│
│
▼
┌───────────────────────────────┐
│ Spring Framework Web Server │
│ POST /api/videos/create │
└───────────────────────────────┘
│
│
▼
┌────────────────────┐
│ AWS S3 Storage │
└────────────────────┘
│
│
GET /api/videos/{videoId}/extract
│
▼
Client receives presigned URL
(Download)
오조사마
| 경북대 BE 신성민 | 경북대 BE 도기헌 | 경북대 BE 석혜원 |
| 경북대 BE 탁정민 | 경북대 BE 한영진 |
http://talkak-fe.s3-website.ap-northeast-2.amazonaws.com
http://ec2-43-202-1-31.ap-northeast-2.compute.amazonaws.com
서버 가용량이 부족하여 동시 접속이 어려운 구조인 점 유의 부탁드립니다.






