2

[3월 11일부터!] 2025 AOAI톤 아이디어 경진대회

마이크로소프트

유튜브 분석 어시 (다운로드 + 자막 추출 + 요약 + 타임코드 답변)

AF 김태영
2025.03.25 18:03
344

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

에이전트 API 개요

  1. 세션 생성: 여러 유튜브 영상을 동시에 처리할 수 있도록 세션 단위로 관리
  2. 영상 다운로드: yt-dlp를 사용해 유튜브 링크로부터 mp4 다운로드
  3. 오디오 추출: ffmpeg로 mp4에서 오디오(wav)만 추출
  4. Whisper로 자막(SRT) 생성: OpenAI의 음성인식 모델
  5. SRT → 텍스트 변환: 자막 파일을 읽어 "시작시간 자막텍스트" 형태로 가공
  6. 다운로드 및 파일 제공: 세션별로 저장된 비디오/오디오/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: 세션 ID
  • file_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")
  • 이 방식으로 브라우저나 클라이언트에서 바로 다운로드 할 수 있습니다.

전체 흐름 정리

  1. 세션 생성
    • GET /create_session → 세션 ID 발급
  2. 유튜브 다운로드
    • POST /youtube_downloadyt-dlp로 mp4 획득, video_path 저장
  3. 오디오 추출
    • POST /extract_audioffmpeg로 mp4 → wav 변환, audio_path 저장
  4. 자막 생성
    • POST /audio2srtwhisper 음성인식 후 SRT 작성, srt_path 저장
  5. 텍스트 변환
    • POST /srt_to_text → 사용자가 재가공하기 쉽게 SRT 파싱
  6. 파일 다운로드
    • 파일이 필요할 때 GET /download_file/{session_id}/{file_type}로 가져오기

확장 아이디어

자동 요약:

  • 마지막 단계에서 result["text"]를 받아 GPT나 다른 NLP 알고리즘을 사용해 요약.

시간대별 검색:

  • SRT 결과를 저장해두면 특정 키워드가 언제 등장했는지 알려줄 수 있습니다.
  • 예: "문장에 'Python' 이라는 단어가 몇 번째 시간 구간에 나오는지"

번역:

  • Whisper가 언어를 자동 감지하므로, 특정 언어로 번역해서 SRT를 만드는 것도 가능.

다운로드 로직 개선:

  • 실제 운영에선 대형 파일을 저장/관리하는 방식을 S3 등 클라우드 스토리지와 연계하기도 합니다.

마무리

위 API들로 "유튜브 → 자막 생성 → 텍스트 변환" 과정을 구축해 에이전트가 손쉽게

  • 주요 내용 요약
  • 질문에 시간대별로 답변
  • 추가적인 NLP 분석 등을 수행할 수 있습니다.

정말 편해지겠죠? 추가 기능이 필요하다면 댓글로 남겨주세요~

2
0개의 댓글
로그인 후 이용해주세요!