매일 아침 유투브로 전일 미국 시장 정보를 습득하는 편인데 영상을 처음부터 보려면 너무 많은 시간이 소비된다. 그리고 이러한 영상들은 대부분 스크립트를 제공하지 않는다. 그래서 스크립트를 제공하지 않는 영상의 스크립트를 추출해서 AI를 활용해 요약본을 만들 수 있게 만드는 개인용 파이프라인을 설계했다. 아직 구상 단계지만, 각 단계를 어떤 도구로 어떻게 연결할지는 구체적으로 정리해뒀다.
1단계: 오디오 추출 — AI 없이 로컬에서 가능
가장 먼저 필요한 건 영상에서 오디오만 뽑아내는 작업이다. 이건 AI가 필요 없는 단순 작업이라 로컬에서 처리한다.
yt-dlp -x --audio-format mp3 <video_url>
yt-dlp로 오디오만 추출하고, 필요하면 ffmpeg으로 포맷을 다듬는다. 이 단계는 API 호출도, 비용도 들지 않는다.
2단계: 텍스트 변환 — 두 가지 경로를 나눈 이유
여기가 이 파이프라인 설계에서 가장 신경 쓴 부분이다. 유튜브 영상 중에는 이미 자막(수동 또는 자동 생성)이 달려 있는 것도 있고, 없는 것도 있다. 자막이 있는 영상까지 굳이 음성인식(STT)을 돌리는 건 낭비라고 판단해서, 경로를 두 갈래로 나눴다.
- 자막이 있는 영상:
youtube-transcript-api로 자막을 직접 긁어온다. AI 호출 자체가 없어 가장 빠르고 무료다. - 자막이 없는 영상만: AI를 활용하여 STT를 돌린다.
3단계: 스크립트 가공 — 비용을 아끼는 위치 선정
STT나 자막으로 뽑아낸 원본 텍스트는 그대로 쓰기엔 지저분하다. “음”, “어” 같은 필러(filler) 표현 제거, 문장 정리, 구어체를 읽기 좋은 문어체로 다듬는 후처리가 필요하다.
이 단계를 어디서 처리할지가 중요한 설계 포인트였다. Gemini 무료 API가 소화 가능할지는 확인이 필요했다. Claude API를 직접 호출하면 이 후처리에도 토큰 비용이 계속 발생한다.
대신 이미 상시 구동 중인 휴대폰 서버(갤럭시 퀀텀2/S9)의 Claude Code 원격 세션을 활용하기로 했다. 정액제로 쓰고 있는 Claude Code 구독 안에서 처리하면, 이 후처리 단계에 별도의 API 크레딧을 쓰지 않아도 된다.
4단계: 저장 구조 — GitHub 레포로 관리
가공된 스크립트는 GitHub 레포에 정리해서 쌓아둘 계획이다. 계획한 폴더 구조는 이렇다.
/extract - 오디오 추출 관련 스크립트
/stt - STT/자막 추출 로직
/script - 후처리(필러 제거, 문장 정리) 로직
/trigger - 파이프라인을 실행시키는 트리거
/config - 설정 파일
Git으로 관리하면 나중에 검색뿐 아니라, 스크립트를 다시 손보거나 다른 형태(예: 요약본)로 재가공하기도 수월해진다.
5단계: 트리거 — 기존 인프라 재사용
이 파이프라인을 실행시키는 방법도 새로 만들기보다는 이미 운영 중인 인프라를 재사용하기로 했다. 휴대폰 서버에 이미 Cloudflare Tunnel 서브도메인이 열려 있으니, 여기에 새 트리거 엔드포인트 하나만 추가하는 방식이다. 예를 들어 유튜브 링크를 이 엔드포인트로 보내면 파이프라인이 순서대로 실행되는 구조를 그리고 있다.
전체 흐름 정리
유튜브 링크
│
▼
[트리거] 휴대폰 API 서버의 새 엔드포인트
│
▼
[오디오 추출] yt-dlp + ffmpeg (로컬, AI 미사용)
│
▼
자막 있음? ──예──▶ youtube-transcript-api (무료, 빠름)
│아니오
▼
AI로 STT
│
▼
[스크립트 가공] 휴대폰 서버의 Claude Code 원격 세션
(필러 제거, 문장 정리)
│
▼
[저장] GitHub 레포 (/extract /stt /script /trigger /config)
아직 남은 일
이 파이프라인은 각 구성 요소(yt-dlp, youtube-transcript-api, Gemini API, Claude Code 원격 세션, Cloudflare Tunnel)가 개별적으로는 이미 검증된 도구들이라, 남은 건 이들을 하나로 엮어 실제로 돌려보는 구현 단계다. 특히 자막 유무를 자동으로 판별해서 두 경로 중 하나로 분기하는 로직과, 트리거 엔드포인트의 인증(아무나 이 엔드포인트를 두드릴 수 없도록) 부분을 먼저 다듬어야 한다. 구현이 진행되면 각 단계별로 겪는 시행착오를 이어서 기록할 계획이다.


💬 댓글