블로그로 돌아가기
AX2026년 4월 30일75

Claude Code·Codex·Gemini로 비디오 전사 자동화: 오디오+프레임 멀티모달 파이프라인 실측

Claude Code 비디오 전사 파이프라인 4주 실측. mlx_whisper 한국어 환각 방지 + 씬 변화 감지 + ±30초 오디오 맥락 결합으로 슬라이드·차트·데모까지 읽는 멀티모달 transcript를 M1 맥 로컬·API key 없이 만든 5단계 구조와 에이전트 3종 비교.

회의 녹화 한 편을 통째로 텍스트화할 때, Claude Code 같은 AI 에이전트가 오디오 위에 화면 정보를 얹어주면 결과물이 어떻게 달라지는지 4주간 실험했다. 결론부터 말하면, 같은 프레임을 던져도 ±30초 오디오 맥락을 함께 보내는지 여부에 따라 출력 품질이 한 줄짜리 묘사에서 회의 흐름을 이해하는 문장으로 바뀐다. 이번 글은 우리 9명 팀이 사내 30분 데모 녹화 12편(총 6시간 30분)을 처리하면서 정리한 Claude Code 비디오 전사 파이프라인 5단계와 에이전트 3종(Claude Code / Codex / Gemini) 출력 비교 데이터를 공유한다.

기존 Whisper 회의록 자동화는 오디오 전사까지였다. 그런데 데모·세일즈콜·튜토리얼처럼 화면이 절반 이상의 정보를 차지하는 영상에서는 "화자가 차트를 가리키며 설명한다"는 오디오만 남고, 무슨 차트인지가 transcript에서 사라졌다. RAG 인덱스에 넣어도 "Q1 매출 슬라이드" 같은 시각 키워드로는 영영 검색되지 않는다는 뜻이다. 이 공백을 메우려고 만든 것이 오디오 + 프레임을 하나의 타임라인으로 병합하는 video_transcription 도구이고, 핵심 호출부에 어떤 에이전트를 끼우느냐가 출력 품질을 결정한다.

왜 오디오 전사만으로는 부족한가

Otter.ai, Whisper, 유료 STT API는 모두 음성→텍스트 한 방향에 최적화되어 있다. 이 구조는 인터뷰·팟캐스트처럼 오디오만으로 의미가 완결되는 콘텐츠에는 충분하다. 문제는 다음과 같은 영상이다.

  • 세일즈 데모: "이 대시보드에서 보이듯이…"가 30회 등장하지만, 정작 어떤 대시보드인지 transcript에 없다.
  • 기술 튜토리얼: 화자가 IDE 화면을 띄워두고 코드를 설명하는데, 코드 스니펫은 한 줄도 기록되지 않는다.
  • 분기 실적 리뷰: "Q1 매출이 우측 그래프처럼 증가했다"의 그래프가 사라진다.

OpenAI Whisper 공식 문서(github.com/openai/whisper)도 "audio-only model"이라고 명시한다. 시각 정보를 잡으려면 별도 멀티모달 파이프라인이 필요하고, Claude Code 비디오 전사 같은 에이전트 호출 흐름이 그 자리에 들어간다.

여기서 단순히 "프레임을 떼서 GPT-4V/Gemini Vision에 던지면 되지 않나"라는 접근의 한계도 같이 짚어둘 만하다. 프레임만 보면 에이전트는 그림 자체만 묘사한다. "회의의 어느 맥락에서 이 그림이 나왔는가"는 오디오 transcript와 결합해야 비로소 잡힌다. 이 결합을 어떻게 자동화하느냐가 우리 팀이 4주 동안 가장 많이 만진 부분이다.

Claude Code 비디오 전사 파이프라인 5단계

video_transcription의 핵심 흐름은 다섯 단계다. 각 단계가 독립적이라 어느 한 곳만 교체해도 전체가 돌아간다.

```

  1. extract_audio → ffmpeg로 16kHz mono PCM 분리
  2. transcribe_mlx → mlx_whisper (한국어 hallucination 방지 옵션)
  3. extract_frames → 씬 변화 감지 + hybrid interval (기본 5s)
  4. describe_frame → AI 에이전트 호출 (Claude Code / Codex / Gemini)
  5. merge_timeline → 오디오 + 프레임 설명 → .md / .json

```

1단계: 오디오 분리

```bash

ffmpeg -i input.mov -ac 1 -ar 16000 -c:a pcm_s16le audio.wav

```

mlx_whisper가 16kHz mono를 기대하므로 컨테이너 단계에서 맞춘다. 1080p 30분 영상 기준 500MB → 50MB로 떨어져 후속 단계 IO도 가벼워진다.

2단계: mlx_whisper 전사 (한국어 환각 방지)

Apple Silicon에서 가장 빠른 Whisper 구현은 `mlx-whisper`다(github.com/ml-explore/mlx-examples). 기본 설정만 쓰면 한국어 영상에서 "감사합니다", "네 알겠습니다"가 침묵 구간에 환각으로 채워지는 문제가 있는데, 다음 옵션 조합으로 잡힌다.

```python

mlx_whisper.transcribe(

"audio.wav",

path_or_hf_repo="mlx-community/whisper-large-v3",

language="ko",

condition_on_previous_text=False, # 환각 사슬 차단

no_speech_threshold=0.6, # 침묵 컷오프 강화

compression_ratio_threshold=2.4,

word_timestamps=True,

)

```

`condition_on_previous_text=False`가 결정적이다. 기본값(True)은 직전 텍스트를 컨텍스트로 넣는데, 한 번 환각이 시작되면 다음 세그먼트로 전염된다. 30분 영상에서 환각 세그먼트가 평균 11개 → 1~2개로 줄었다.

3단계: 씬 변화 감지 + Hybrid Interval

매 5초 단위로 프레임을 뽑으면 30분 영상에서 360장이 나온다. 에이전트 호출 비용·시간이 폭발한다. 실제로 필요한 건 화면이 바뀌는 시점이다.

```python

import cv2

def detect_scene_changes(video_path, threshold=30.0):

cap = cv2.VideoCapture(video_path)

prev = None

cuts = []

while True:

ok, frame = cap.read()

if not ok: break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

if prev is not None:

diff = cv2.absdiff(gray, prev).mean()

if diff > threshold:

cuts.append(cap.get(cv2.CAP_PROP_POS_MSEC) / 1000)

prev = gray

return cuts

```

여기에 최대 30초 간격을 보장하는 hybrid interval을 얹는다. 슬라이드를 오래 띄우는 강의 영상에서 씬 컷이 안 잡혀도 30초마다 한 장씩 강제 캡처되어 누락 구간이 사라진다. 30분 영상 기준 프레임 수가 360장 → 평균 47장으로 떨어졌다.

4단계: 에이전트 호출 (±30초 오디오 맥락 동봉)

여기가 이 파이프라인의 차별점이다. 프레임 한 장만 보내는 대신, 해당 시점 ±30초 transcript 세그먼트를 함께 프롬프트에 넣는다.

```

[Frame at 14:23]

Audio context (-30s ~ +30s):

"...이번 분기 매출은 전년 동기 대비 18% 증가했고,

신규 고객 비중이 32%로 가장 컸습니다. 우측 그래프를 보시면..."

Task: 이 프레임이 위 대화 맥락에서 어떤 시각 자료인지 한 문장으로 묘사하라.

```

같은 프레임을 맥락 없이 넣으면 에이전트는 `"스마트폰 화면입니다"`라고 답한다. 맥락을 함께 넣으면 `"화자가 Q1 실적 리뷰 중인 슬라이드. 매출 그래프 3종, 우측 하단 회사 로고"`로 답이 바뀐다. 같은 모델, 같은 프레임, 다른 맥락. 단순 프롬프트 한 줄 변경의 효과치고 결과물 가독성 차이가 크다.

5단계: 타임라인 병합

오디오 세그먼트와 프레임 묘사를 시간순으로 머지하면 다음 형태의 transcript가 떨어진다.

```markdown

14:20

화자: "이번 분기 매출은 전년 동기 대비 18% 증가했습니다."

14:23 [VISUAL]

Q1 실적 리뷰 슬라이드. 매출 그래프 3종(월별/제품군별/지역별),

우측 하단 회사 로고.

14:31

화자: "신규 고객 비중이 32%로 가장 컸고…"

```

`.md`와 `.json` 두 포맷으로 저장해 회의록은 마크다운, RAG 인덱싱은 JSON을 쓴다.

Claude Code · Codex · Gemini 에이전트 비교

세 에이전트 모두 CLI에서 호출 가능하다. 우리 팀 데모 영상 12편(총 6시간 30분)을 같은 파라미터로 돌린 4주 실측 결과다.

항목Claude CodeCodex (CLI)Gemini
프레임 묘사 평균 길이2.3문장1.8문장1.5문장
한국어 자연스러움자연스러움약간 번역체자연스러움
맥락 활용도(주관 평가)중상
처리 시간 (프레임당)4.2s3.1s2.8s
API key 필요불필요(CLI 세션)불필요(CLI 세션)불필요(CLI 세션)

세 에이전트 모두 별도 API 결제 없이 CLI 세션만으로 동작한다(M1 맥 기준 100% 로컬). 속도는 Gemini가 가장 빠르고, 묘사 품질·맥락 활용도는 Claude Code가 앞섰다. 데모·세일즈콜처럼 결과물이 그대로 고객에게 전달되는 영상은 Claude Code, 사내 빠른 인덱싱은 Gemini가 비용/시간 대비 합리적이라는 게 4주 결론이다.

체감상 가장 큰 차이는 "차트를 정확히 읽느냐"였다. 매출 그래프가 들어간 슬라이드를 던졌을 때 Claude Code는 "월별/제품군별/지역별 3종 그래프, Q1이 가장 높음"까지 잡아냈고, Codex는 "여러 그래프가 표시된 실적 슬라이드", Gemini는 "그래프와 텍스트가 있는 화면" 수준이었다. 단순 객체 인식이 아니라 "이 그래프가 무엇을 의미하는가"의 해석 깊이가 갈렸다는 뜻이다.

현장에서 막혔던 3가지

4주 운영 동안 가장 시간을 잡아먹은 지점들을 기록해둔다. 도입하는 팀에서 같은 함정을 다시 밟지 않도록.

1. mlx_whisper Large-v3가 작은 영상에서 더 느린 경우: 5분 미만 짧은 영상은 모델 로딩 오버헤드가 커서 medium 모델보다 오히려 1.5배 느렸다. 영상 길이별로 모델을 자동 선택하도록 분기를 넣었더니 평균 처리 시간이 22% 줄었다.

2. 씬 감지 threshold가 카메라 흔들림에 약함: 핸드헬드 촬영 영상에서는 같은 화면인데도 흔들림 때문에 픽셀 차이가 임계값을 넘어 프레임이 폭발적으로 추출되는 문제가 있었다. 가우시안 블러를 한 번 입힌 뒤 차이를 계산하니 잡음이 잡혔다.

3. 에이전트 응답이 가끔 빈 문자열: CLI 세션이 길어지면 가끔 빈 응답을 돌려준다. retry 3회 + 지수 백오프(1s → 3s → 9s)를 넣은 뒤 재발률이 0%에 가까워졌다. 빈 응답을 그대로 transcript에 박아두면 후속 RAG 인덱싱에서 노이즈가 된다.

다음 단계: 어떻게 도입할 것인가

video_transcription 도구는 Dion의 LinkedIn 포스트에서 공개한 GitHub 링크로 받을 수 있다. 우리 팀의 도입 순서는 다음과 같았다.

  1. 샘플 영상 1편으로 파이프라인 검증: 5분짜리 데모로 각 단계 출력물 확인.
  2. mlx_whisper 옵션 튜닝: 본인 도메인 영상으로 환각 패턴 관찰 후 `no_speech_threshold` 조정.
  3. 씬 감지 threshold 조정: 슬라이드 위주(낮게) vs 카메라 핸드헬드(높게).
  4. 에이전트 1종 고정: 비교 끝났으면 운영은 한 종으로 통일해야 프롬프트 유지보수가 쉬워진다.
  5. RAG 연결: `.json` 출력을 임베딩해 사내 검색에 붙이면 "Q1 매출 슬라이드 보여줬던 미팅"이 키워드로 바로 잡힌다.

오디오만 다루던 회의록 자동화에 시각 정보가 합쳐지면, AI 에이전트가 보는 transcript는 "녹취록"이 아니라 "회의 그 자체"에 가까워진다. AI 에이전트 멀티모달 파이프라인의 다음 실용화 지점은 여기라고 본다.

비용 측면에서도 짚어둘 가치가 있다. 같은 30분 영상을 클라우드 멀티모달 API로 풀 처리하면 프레임당 $0.01만 잡아도 47장 × $0.01 = $0.47, 12편이면 $5.6가 들고 영상 분량이 늘면 선형으로 늘어난다. 이번 파이프라인은 mlx_whisper와 CLI 에이전트 모두 로컬에서 도는 video transcription 오픈소스 스택이라 추가 과금이 0원이다. 9명 팀이 일주일에 영상 회의 20편을 처리한다고 가정하면 월 $30 이상의 차이가 생기고, RAG 인덱스를 매주 다시 빌드하는 시나리오에서는 차이가 더 벌어진다.

도구 자체는 시작점일 뿐이다. 우리 팀의 다음 과제는 transcript 출력을 다시 에이전트에 입력해 자동 회의록 요약·액션 아이템 추출까지 연결하는 것이고, 이 부분이 정리되면 별도 글로 공유하겠다. 실제 도입하면서 막히는 지점이 있다면 GitHub 이슈로 남겨주시면 우리 팀 운영 노트와 비교해 답하겠다.