이제 에이전트로 유튜브 영상 분석하는 시대! 어시웍스 덕분에 유튜브 링크만 있으면 AI가 자막을 추출하고, 핵심 내용을 뽑아주며, 질문하면 "몇 초에 나와요!"까지 알려줍니다 🤖✨

에이전트 API 개요
- 세션 생성: 여러 유튜브 영상을 동시에 처리할 수 있도록 세션 단위로 관리
- 영상 다운로드:
yt-dlp
를 사용해 유튜브 링크로부터 mp4 다운로드 - 오디오 추출:
ffmpeg
로 mp4에서 오디오(wav)만 추출 - Whisper로 자막(SRT) 생성: OpenAI의 음성인식 모델
- SRT → 텍스트 변환: 자막 파일을 읽어 "시작시간 자막텍스트" 형태로 가공
- 다운로드 및 파일 제공: 세션별로 저장된 비디오/오디오/SRT 파일을 직접 다운로드
각 단계를 에이전트가 순서대로 호출하면, 영상 처리 작업이 완결됩니다.
사용 시나리오
사용자가 에이전트에게 "이 유튜브 영상 요약 좀 해줘!"라고 요청합니다. 에이전트는 이 API 서버를 통해 다음을 진행합니다:
/create_session
으로 새 세션 아이디(session_id
) 받기/youtube_download
로 영상 다운로드/extract_audio
로 오디오 추출/audio2srt
로 자막 생성/srt_to_text
로 완성된 자막을 텍스트로 가져오기- 필요하다면 자막 텍스트를 기반으로 LLM이 요약함
결과:
- 에이전트가 "영상에서 뽑은 자막과 요약"을 사용자에게 답변합니다.
- 사용자가 추가 질문을 하면, 자막에 시간대별로 접근해
"몇 초 부분입니다."
라고 알려줍니다.
시연 동영상을 보도록 하겠습니다.
API 상세 설명
1. 세션 생성: /create_session
Method: GET
설명:
- 세션이란, 각 작업(영상 다운로드 등)을 독립적으로 처리하기 위해 필요한 고유 식별자입니다.
- 이 엔드포인트는 내부적으로
uuid.uuid4()
로 고유 ID를 만들고,SESSIONS[session_id]
에 작업 상태를 저장할 공간을 마련합니다.
사용 예시:
GET /create_session
샘플 응답:
{
"session_id": "4f055ad9-268c-4caa-be39-...",
"message": "새로운 세션이 생성되었습니다."
}
주요 포인트
글로벌 딕셔너리 SESSIONS
:
SESSIONS[session_id] = {
"video_path": None,
"audio_path": None,
"srt_path": None,
}
- 실제 배포 시: Redis, DB 등을 사용해 세션 정보를 관리하는 방식을 권장.
2. 유튜브 영상 다운로드: /youtube_download
Method: POST
Payload:
{
"session_id": "string",
"youtube_url": "string"
}
설명:
yt_dlp
라이브러리를 통해 지정된session_id
경로에 mp4 영상을 저장합니다.- 다운로드된 파일 경로를
SESSIONS[session_id]["video_path"]
에 기록합니다.
응답:
{
"message": "다운로드 완료",
"file_path": "...",
"download_url": "http://127.0.0.1:8000/download_file/{session_id}/video",
"session_id": "..."
}
주요 포인트
yt-dlp 설정:
ydl_opts = {
'format': 'best[ext=mp4]/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best',
'outtmpl': f'{download_dir}/%(title)s.%(ext)s',
'merge_output_format': 'mp4'
}
- 가능한 mp4 포맷 중 가장 화질 좋은 것부터 시도.
- 영상/오디오 스트림 통합(m4a → mp4).
파일명 관리:
- 실제 파일명은 동영상의 title을 가져와
[title].mp4
형태로 저장. session_id
별로downloads/{session_id}
디렉토리에 구분 저장.
3. 오디오 추출: /extract_audio
Method: POST
Payload:
{
"session_id": "string"
}
설명:
ffmpeg
를 이용해 영상(mp4)에서 오디오(wav)만 추출합니다.SESSIONS[session_id]["audio_path"]
에 결과 파일 경로를 저장합니다.
응답:
{
"session_id": "...",
"audio_path": "outputs/..._audio.wav",
"download_url": "http://127.0.0.1:8000/download_file/{session_id}/audio",
"message": "오디오 추출이 완료되었습니다."
}
주요 포인트
ffmpeg-python 사용 예시:
ffmpeg.input(video_path).output(
audio_path, format='wav', acodec='pcm_s16le', ar='16000', ac=1
).run(overwrite_output=True)
ac=1
: 모노로 변환ar=16000
: Whisper 권장 16kHz 샘플링pcm_s16le
: 16비트 오디오 인코딩
폴더 구조:
outputs/
디렉토리에 WAV를 저장해두고, 필요하면/download_file/
API를 통해 액세스.
4. Whisper로 자막(SRT) 생성: /audio2srt
Method: POST
Payload:
{
"session_id": "string",
"model_size": "tiny" // tiny, base, small, medium, large
}
설명:
- OpenAI Whisper 모델로 오디오를 인식하고, segment별로 SRT 파일을 생성.
SESSIONS[session_id]["srt_path"]
에 자막 파일 경로를 저장합니다.
응답:
{
"session_id": "...",
"srt_path": "...",
"download_url": "http://127.0.0.1:8000/download_file/{session_id}/srt",
"message": "SRT 생성이 완료되었습니다."
}
주요 포인트
Whisper 모델 로딩:
model = whisper.load_model(req.model_size)
result = model.transcribe(audio_path)
- 큰 모델로 갈수록 정확도 높아지나, 메모리 점유/추론 시간이 증가.
SRT 형식 생성:
for i, segment in enumerate(result['segments'], start=1):
start_time = str(timedelta(seconds=segment['start']))
end_time = str(timedelta(seconds=segment['end']))
...
start_time --> end_time
- SRT 파일에선 인덱스 번호, 시간 정보, 자막 텍스트, 공백 줄 구조를 지킵니다.
5. SRT → 텍스트 변환: /srt_to_text
Method: POST
Payload:
{
"session_id": "string"
}
설명:
- 생성된 SRT 파일을 파싱하여
"시작시간 자막텍스트"
형식의 문자열로 변환. - 추가적으로 사용자 입맛에 맞게 "00:00:01,000 Hello..." 등 더 정교한 포맷을 만들 수도 있습니다.
응답:
{
"session_id": "...",
"srt_path": "...",
"text": "00:00:02 Hello and welcome to ...\n00:00:07 Today we are...",
"message": "SRT 텍스트 변환이 완료되었습니다."
}
기술 포인트
SRT 파싱:
# SRT 파일 읽으며:
if content[i].strip().isdigit():
i += 1
if '-->' in content[i]:
time_line = content[i].strip()
start_time = time_line.split(' --> ')[0]
- 자막 인덱스 번호 / 시간 구간 / 자막 본문을 순서대로 읽어내는 간단한 로직.
포맷 변환:
- 필요하다면
start_time
,end_time
모두 저장해 DB나 JSON 형태로 응답 가능.
6. 파일 다운로드: /download_file/{session_id}/{file_type}
Method: GET
Path Variables:
session_id
: 세션 IDfile_type
:video
,audio
,srt
설명:
- 서버에 저장된 (video/audio/srt) 파일을 직접 다운로드할 수 있는 엔드포인트.
응답:
FileResponse
로 해당 파일을 즉시 다운로드.
기술 포인트
StaticFiles:
app.mount("/downloads", StaticFiles(directory="downloads"), name="downloads")
app.mount("/outputs", StaticFiles(directory="outputs"), name="outputs")
고정된 폴더 구조에 접근 가능.
FileResponse:
return FileResponse(path=file_path, filename=os.path.basename(file_path), media_type="application/octet-stream")
- 이 방식으로 브라우저나 클라이언트에서 바로 다운로드 할 수 있습니다.
전체 흐름 정리
- 세션 생성
GET /create_session
→ 세션 ID 발급
- 유튜브 다운로드
POST /youtube_download
→yt-dlp
로 mp4 획득,video_path
저장
- 오디오 추출
POST /extract_audio
→ffmpeg
로 mp4 → wav 변환,audio_path
저장
- 자막 생성
POST /audio2srt
→whisper
음성인식 후 SRT 작성,srt_path
저장
- 텍스트 변환
POST /srt_to_text
→ 사용자가 재가공하기 쉽게 SRT 파싱
- 파일 다운로드
- 파일이 필요할 때
GET /download_file/{session_id}/{file_type}
로 가져오기
- 파일이 필요할 때
확장 아이디어
자동 요약:
- 마지막 단계에서
result["text"]
를 받아 GPT나 다른 NLP 알고리즘을 사용해 요약.
시간대별 검색:
- SRT 결과를 저장해두면 특정 키워드가 언제 등장했는지 알려줄 수 있습니다.
- 예: "문장에 'Python' 이라는 단어가 몇 번째 시간 구간에 나오는지"
번역:
- Whisper가 언어를 자동 감지하므로, 특정 언어로 번역해서 SRT를 만드는 것도 가능.
다운로드 로직 개선:
- 실제 운영에선 대형 파일을 저장/관리하는 방식을 S3 등 클라우드 스토리지와 연계하기도 합니다.
마무리
위 API들로 "유튜브 → 자막 생성 → 텍스트 변환" 과정을 구축해 에이전트가 손쉽게
- 주요 내용 요약
- 질문에 시간대별로 답변
- 추가적인 NLP 분석 등을 수행할 수 있습니다.
정말 편해지겠죠? 추가 기능이 필요하다면 댓글로 남겨주세요~