Whisper와 Gemini를 연동해 1시간 분량 웨비나 음성에서 타임스탬프 포함 챕터 요약 노트를 자동으로 뽑아내는 방법
웨비나나 장시간의 기술 세미나가 끝난 후, 가장 번거롭지만 반드시 해야 하는 작업이 있습니다. 바로 ‘타임스탬프가 포함된 요약 노트’ 제작입니다. 1시간짜리 영상을 처음부터 다시 돌려보며 주요 주제가 전환되는 시점을 찾고, 발언 내용을 정리하는 작업은 최소 2~3시간 이상의 정성적 노동을 요구합니다.
많은 팀에서 이를 자동화하기 위해 음성 인식(STT) AI를 도입하지만, 단순히 텍스트로 변환된 긴 글(Raw Text)은 가독성이 떨어집니다. 반대로 일반적인 LLM에 전체 음성 텍스트를 집어넣으면 타임스탬프가 왜곡되거나 중요 내용이 누락되는 문제가 발생합니다.
이 글에서는 **OpenAI의 Whisper(음성 인식 및 정확한 시점 추출)**와 **Google의 Gemini(대용량 문맥 이해 및 구조화)**를 파이프라인으로 연결하여, 1시간 분량의 웨비나 음성 파일에서 클릭 시 바로 이동 가능한 챕터별 타임스탬프 요약 노트를 100% 자동 추출하는 시스템 구조와 실전 프롬프트 기법을 공유합니다.
핵심 엔진 비교: 왜 하필 Whisper + Gemini 조합인가?
웨비나 타임스탬프 자동화를 구현할 때 가장 먼저 고민하는 것은 모델의 조합입니다. 단일 모델만으로는 타임스탬프의 정확도와 문맥 요약의 품질을 동시에 잡기 어렵습니다.
| 비교 항목 | Whisper 단독 사용 | GPT-5.1 연동 | Whisper + Gemini 연동 (추천) |
|---|---|---|---|
| 타임스탬프 정확도 | 최상 (초 단위 Segment 매칭) | 중 (텍스트 기반 시점 추정 오차 발생) | 최상 (Whisper 추출 시점 유지) |
| 긴 문맥 요약력 | 불가능 (STT 전용 모델) | 우수 (토큰 제한 및 비용 부담) | 최우수 (최대 1M~2M 토큰의 압도적 윈도우) |
| 한국어 발화 처리 | 우수 (Whisper v3 기준) | 우수 | 우수 |
| 처리 비용 (1시간 기준) | 저렴 | 상대적으로 높음 | 매우 저렴 (Gemini Flash 활용 시) |
Whisper는 음성 파일에서 각 단어와 문장이 시작되고 끝나는 **초 단위의 타임스탬프(Segment Data)**를 가장 정확하게 추출합니다. 하지만 문맥을 파악하여 “여기서부터 주제가 바뀌었으니 하나의 챕터로 묶자”는 판단을 내리지 못합니다.
이 한계를 보완하는 것이 Gemini입니다. Gemini 1.5 Pro 및 Flash 모델은 압도적인 컨텍스트 윈도우(Context Window)를 제공하므로, 1시간 분량의 웨비나 전체 타임스탬프 데이터를 단 한 번의 프롬프트 입력(In-Context)으로 손실 없이 처리할 수 있습니다. Whisper가 찍어준 정확한 시점 데이터의 뼈대 위에 Gemini의 압축·요약 능력을 얹는 것이 이 시스템의 핵심입니다.
3단계 자동화 파이프라인 구축 절차
자동화 프로세스는 [음성 추출 및 전처리] → [Whisper 타임스탬프 JSON 생성] → [Gemini 구조화 요약 처리] 3단계로 진행됩니다.
[웨비나 음성/영상 파일 (MP4/MP3)]
│
▼ (FFmpeg 전처리: Mono 16kHz 변환)
[최적화된 음성 파일]
│
▼ (OpenAI Whisper API 또는 Local Whisper)
[타임스탬프가 포함된 Raw JSON / SRT 데이터]
│
▼ (Gemini 1.5 API + 프롬프트 엔지니어링)
[완성된 챕터별 타임스탬프 요약 노트 (Markdown)]
1단계: 음성 파일 전처리 및 Whisper 타임스탬프 추출
웨비나 영상(MP4)을 그대로 Whisper에 넘기면 파일 용량이 크고 API 비용이나 처리 시간이 증가합니다. 게다가 Whisper API에는 요청 1회당 25MB라는 엄격한 파일 크기 제한이 있어, 전처리 없이 원본 영상을 보내면 대부분 거부됩니다. 먼저 FFmpeg를 활용해 용량을 최소화한 후 Whisper를 호출합니다.
# 영상을 16kHz 모노 오디오(MP3)로 전환하여 전송 속도 최적화
ffmpeg -i webinar_input.mp4 -vn -ac 1 -ar 16000 -b:a 64k audio_payload.mp3
64kbps로 변환하면 1시간 분량 오디오는 약 29MB 안팎이 되는데, 이 역시 25MB 제한을 살짝 넘을 수 있습니다. 비트레이트를 32~48kbps 수준으로 더 낮추거나, 그래도 제한을 넘는 긴 분량이라면 파일을 여러 구간으로 분할(Chunking)해 순차 호출하는 방식으로 우회해야 합니다.
이후 Python 환경에서 Whisper API를 호출할 때 핵심은 response_format="verbose_json" 옵션을 사용하는 것입니다. 이 옵션을 지정해야 개별 문장의 시작 시간(start)과 종료 시간(end)이 포함된 세그먼트 데이터를 얻을 수 있습니다.
2단계: Raw 세그먼트 데이터 전처리
Whisper가 내뱉는 verbose_json 결과물은 수백 개의 잔개가 나눠진 초 단위 데이터입니다. 이를 그대로 LLM에 넘기면 토큰 소비가 불필요하게 커집니다. 따라서 다음과 같은 형식의 텍스트 리스트로 1차 정돈합니다.
[00:00:12] 안녕하세요, 오늘 AI 기반 웨비나 자동화 세션을 맡은 발표자입니다.
[00:00:45] 먼저 기존 시스템의 문제점 세 가지를 짚어보겠습니다.
[00:03:15] 첫 번째 문제는 수동 타임스탬프 작업에 소요되는 과도한 시간입니다.
...
3단계: Gemini를 이용한 문맥 기반 챕터링 및 요약
정돈된 타임스탬프 텍스트를 Gemini API에 전달합니다. 이때 Gemini가 새로운 타임스탬프를 지어내지(Hallucination) 않고, 오직 입력받은 데이터의 시점만 활용하도록 엄격한 프롬프트 제약조건을 부여해야 합니다.
실전 파이프라인 구현 코드 및 프롬프트 제어
아래는 Python을 통해 전체 프로세스를 실행하는 핵심 파이프라인 예시입니다.
import os
from openai import OpenAI
import google.generativeai as genai
# API 키 설정
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
client_openai = OpenAI(api_key=OPENAI_API_KEY)
genai.configure(api_key=GEMINI_API_KEY)
def extract_timestamps(audio_path):
"""1단계: Whisper를 통해 타임스탬프 데이터 추출"""
with open(audio_path, "rb") as audio_file:
transcript = client_openai.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
response_format="verbose_json",
timestamp_granularities=["segment"]
)
formatted_text = ""
for segment in transcript.segments:
# 초 단위를 HH:MM:SS 형식으로 변환
# 최신 OpenAI SDK(v1.0 이상)에서는 세그먼트가 Pydantic 객체로 반환되므로
# 딕셔너리 방식(segment['start'])이 아닌 속성 접근(segment.start)을 사용해야 합니다.
start_time = int(segment.start)
m, s = divmod(start_time, 60)
h, m = divmod(m, 60)
time_str = f"{h:02d}:{m:02d}:{s:02d}"
formatted_text += f"[{time_str}] {segment.text}\n"
return formatted_text
def generate_chapter_summary(raw_timestamp_text):
"""2단계: Gemini 1.5를 통해 챕터화 및 요약 노트 생성"""
prompt = f"""
당신은 수많은 기업 세미나와 웨비나를 요약하는 전문 콘텐츠 에디터입니다.
아래 제공된 [타임스탬프 음성 텍스트]를 분석하여 시청자가 빠르게 핵심을 파악할 수 있는 '챕터별 요약 노트'를 작성해주세요.
[작성 지침]
1. 주제가 전환되는 주요 시점을 기준으로 챕터를 나누세요 (1시간 기준 5~8개 챕터 권장).
2. 각 챕터의 시작 타임스탬프는 반드시 본문에 존재하는 [HH:MM:SS] 시점 중 하나를 그대로 사용해야 합니다. 절대 타임스탬프를 임의로 만들지 마세요.
3. 각 챕터마다 '주요 내용 요약(불릿 포인트 3개)'과 '핵심 인사이트/액션 아이템'을 명확히 작성하세요.
4. 결과물은 깔끔한 Markdown 형식으로 출력하세요.
[타임스탬프 음성 텍스트]
{raw_timestamp_text}
"""
# Gemini 1.5 Flash는 속도와 긴 문맥 처리에 매우 효율적입니다.
model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(prompt)
return response.text
# 실행 예시
# raw_data = extract_timestamps("audio_payload.mp3")
# final_summary = generate_chapter_summary(raw_data)
# print(final_summary)
워크플로우 실측 성능 및 운영 데이터
실제 현업 파이프라인에 이 구조를 적용할 때는 웨비나 분량, 오디오 비트레이트, 선택한 Gemini 모델(Flash vs Pro)에 따라 소요 시간과 처리 비용이 크게 달라집니다. 직접 운영하는 환경에서 1회 파이프라인을 실행해 Whisper API와 Gemini API 각각의 호출 시간·비용을 측정해 보고, 기존에 사람이 수작업으로 노트를 만들 때 걸리던 시간과 비교해 보는 것이 가장 정확합니다. 웨비나 처리 편수가 늘어날수록 자동화로 절감되는 시간과 비용의 격차도 함께 커지는 구조이므로, 월간 처리량 기준으로 추적해 두면 ROI를 가늠하기 좋습니다.
자주 발생하는 문제점과 트러블슈팅 (Q&A)
Q1. Gemini가 요약하면서 타임스탬프 시점을 임의로 조작하거나 틀리게 찍는 현상이 발생합니다.
원인: LLM이 문장을 재구성하는 과정에서 숫자 데이터를 연산/추정하려고 할 때 발생하는 할루시네이션입니다.
해결책:
- Gemini 프롬프트 내에
System Instruction으로 **“제공된 텍스트에 존재하는 [HH:MM:SS] 스트링 이외의 시간 표기를 출력하는 것은 금지된다”**라는 부정 제약(Negative Constraint)을 강조합니다. - 만약 증상이 지속된다면, Gemini에 넘겨줄 때 각 문장 앞에
[ID: 001],[ID: 002]식의 세그먼트 ID를 붙인 뒤, Gemini에게 ID만 고르게 하고 최종 출력 시 파이썬 코드에서 해당 ID의 타임스탬프를 원본 매핑 테이블에서 불러와 치환하는 **‘ID 매핑 방식’**을 사용하면 오류율을 0%로 만들 수 있습니다.
Q2. 전문 용어나 IT 고유명사(예: Docker, Kubernetes, LangChain 등)를 Whisper가 이상하게 알아듣습니다.
원인: 한국어와 영어가 섞인 IT 웨비나의 경우 Whisper의 발음 기반 한국어 변환 오차가 생길 수 있습니다.
해결책:
Whisper API 호출 시 prompt 파라미터를 활용하세요. 해당 웨비나에서 등장하는 도메인 용어 리스트를 미리 넘겨주면 인식률이 비약적으로 향상됩니다.
# Whisper 프롬프트 힌트 제공 예시
transcript = client_openai.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
prompt="Kubernetes, Docker, PyTorch, Gemini API, 파이프라인, 웨비나, 타임스탬프", # 고유명사 힌트
response_format="verbose_json"
)
Q3. 음성과 영상의 타임스탬프가 시간이 지날수록 조금씩 밀립니다.
원인: 음성 파일의 가변 비트레이트(VBR) 문제이거나 sample rate가 일치하지 않아 발생합니다.
해결책: 앞서 언급한 FFmpeg 전처리 과정에서 고정 비트레이트(CBR) 및 표준 샘플링 레이트(-ar 16000)를 강제로 지정하여 파형을 규격화한 후 Whisper에 입력해야 오차를 방지할 수 있습니다.
자동화 파이프라인 도입이 가져오는 변화
Whisper와 Gemini를 결합한 웨비나 타임스탬프 자동화는 단순히 ’요약문 하나를 얻는 것’에 그치지 않습니다. 한 번 구축해 둔 파이프라인은 웨비나 수신 데이터를 순식간에 다양한 마케팅 자산으로 재가공할 수 있는 데이터베이스로 만들어줍니다.
추출된 타임스탬프 챕터 노트를 기반으로 유튜브 영상의 Chapter를 즉시 업데이트할 수 있으며, Gemini 프롬프트의 출력 양식만 변경하면 동일한 음성 데이터로부터 기술 블로그 아티클, 뉴스레터용 요약본, LinkedIn 공유용 숏폼 카피까지 한 번에 생성해 낼 수 있습니다.
반복적인 수동 작업에 투입되던 시간을 기술적인 파이프라인을 고도화하고 콘텐츠의 기획력을 높이는 데 전환할 때, 콘텐츠 팀과 데이터 엔지니어링 간의 실제 생산성 격차가 벌어지기 시작합니다.