한 시간짜리 회의가 끝나면 진짜 일이 시작됩니다. 녹음 파일을 열어 두고 앞뒤로 돌려 가며 누가 무엇을 하기로 했는지 찾아 적는 그 작업 말입니다. 손으로 정리하면 한 시간 회의에 보통 30~40분이 더 듭니다. 주간회의만 매주 한 번 있어도 한 달이면 두 시간이 넘고, 그렇게 만든 회의록조차 며칠 지나면 아무도 안 봅니다.
AI 회의록 정리는 이 구간을 거의 통째로 덜어낼 수 있는 몇 안 되는 작업입니다. 음성을 텍스트로 옮기는 일과 긴 텍스트에서 결정·할 일을 뽑아내는 일 모두 지금 기술로 충분히 되기 때문입니다. 이 글에서는 설치 없이 바로 되는 방법부터, 녹음 파일을 폴더에 넣어 두기만 하면 회의록이 만들어지는 스크립트까지 단계별로 정리합니다.
워크플로우는 네 단계로 쪼개집니다
“회의록 자동화”를 한 덩어리로 보면 막막한데, 실제로는 독립된 네 단계입니다. 각 단계를 따로 바꿔 끼울 수 있다는 점이 중요합니다. 전사는 로컬에서 하고 요약만 API로 돌리는 식의 조합이 가능해집니다.
- 녹음 — 회의 도구의 녹화 기능이나 휴대폰 녹음기
- 전사(STT) — 음성을 텍스트로. 여기가 품질을 좌우합니다
- 정리 — 전사본에서 결정사항·할 일·미결 항목 추출
- 보관 — 검색 가능한 곳에 저장. 노션, 옵시디언, 사내 위키 등
3단계만 AI에게 맡기고 나머지는 수동으로 해도 체감 효과의 절반은 나옵니다. 처음부터 전부 자동화하려다 지치는 것보다, 3단계부터 시작하는 편을 권합니다.
1단계: 이미 쓰는 회의 도구의 내장 기능부터 확인하세요
구글 미트, 마이크로소프트 팀즈, 줌 모두 자동 전사·요약 기능을 자체적으로 제공합니다. 별도 설치나 코드 없이 켜기만 하면 되고, 화자 구분도 계정 정보를 알고 있으니 정확한 편입니다. 다만 어떤 요금제에 포함되는지는 서비스마다 다르고 정책도 자주 바뀌므로, 회의 도구 설정 화면에서 직접 확인하는 게 정확합니다.
한국어 회의라면 네이버 클로바노트도 선택지입니다. 한국어에 특화돼 있고 웹·앱에서 바로 쓸 수 있습니다. 무료로 쓸 수 있는 사용량이 정해져 있으니, 월 회의량이 많다면 한도를 먼저 보고 판단하세요.
내장 기능으로 충분하다면 아래 단계는 안 읽어도 됩니다. 다음 경우에만 직접 만들 가치가 있습니다. 외부 서비스에 올릴 수 없는 내용을 다루거나, 대면 회의처럼 녹음 파일만 손에 있거나, 정리 형식을 내 마음대로 고정하고 싶을 때입니다.
2단계: 내 PC에서 무료로 전사하기 (Whisper)
OpenAI가 공개한 음성 인식 모델 Whisper는 오픈소스라 내 컴퓨터에서 그냥 돌릴 수 있습니다. 파일이 밖으로 나가지 않고, 아무리 많이 돌려도 추가 비용이 없습니다. 실무에서는 원본 구현보다 faster-whisper를 씁니다. 같은 모델을 더 빠르고 적은 메모리로 돌리는 재구현체입니다.
# transcribe.py -- 녹음 파일 하나를 타임스탬프가 붙은 텍스트로 옮깁니다.
# pip install faster-whisper
import sys
from pathlib import Path
from faster_whisper import WhisperModel
# CPU만 있는 노트북이면 device="cpu", compute_type="int8"
# NVIDIA GPU가 있으면 device="cuda", compute_type="float16" 이 훨씬 빠릅니다.
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
src = Path(sys.argv[1])
segments, info = model.transcribe(
str(src),
language="ko", # 지정하지 않으면 앞부분만 듣고 언어를 추측합니다
vad_filter=True, # 무음 구간을 걸러냅니다. 환각을 줄이는 핵심 옵션
vad_parameters={"min_silence_duration_ms": 500},
)
print("감지 언어:", info.language, "/ 길이:", round(info.duration), "초")
lines = []
for seg in segments:
stamp = "[%02d:%02d]" % (int(seg.start) // 60, int(seg.start) % 60)
lines.append(stamp + " " + seg.text.strip())
out = src.with_suffix(".txt")
out.write_text("\n".join(lines), encoding="utf-8")
print("저장:", out, "/", len(lines), "줄")
모델 크기는 tiny부터 large-v3까지 있습니다. 한국어는 작은 모델에서 정확도가 눈에 띄게 떨어지므로 medium 이상을 권합니다. CPU로 large-v3를 돌리면 1시간 오디오에 수십 분이 걸릴 수 있으니, 저녁에 걸어 두고 아침에 확인하는 식으로 쓰거나 GPU를 쓰세요.
녹음 파일은 전사 전에 한 번 정리해 두면 여러모로 편합니다. 회의 녹음은 스테레오·고음질일 이유가 없습니다.
# 1시간짜리 회의 녹음을 음성 인식용으로 가볍게 변환합니다.
# 모노(-ac 1) + 16kHz(-ar 16000)면 인식률 손해 없이 용량이 크게 줄어듭니다.
ffmpeg -i meeting.m4a -ac 1 -ar 16000 -c:a libmp3lame -b:a 64k meeting.mp3
# 파일이 커서 API 업로드 한도에 걸릴 때, 10분(600초) 단위로 자릅니다.
ffmpeg -i meeting.m4a -f segment -segment_time 600 -c copy part_%03d.m4a
3단계: 전사본을 회의록으로 바꾸는 프롬프트
전사본을 그대로 붙여넣고 “요약해 줘”라고 하면 줄거리 요약이 나옵니다. 회의록에서 필요한 건 줄거리가 아니라 결정과 할 일입니다. 출력 형식을 먼저 고정하고, 없는 내용을 지어내지 못하게 막는 게 핵심입니다.
아래는 회의 녹취를 그대로 옮긴 전사본입니다.
받아쓰기 오류와 중복된 말, 잡담이 섞여 있습니다.
[회의 정보]
- 회의명: 9월 2주차 제품 주간회의
- 일시: 2026-09-15 10:00~11:00
- 참석자: 김OO(PM), 이OO(개발), 박OO(디자인)
[요구사항]
1. 아래 형식의 마크다운으로만 답하세요. 형식 밖의 인사말은 붙이지 마세요.
## 한 줄 요약
## 결정된 사항
- (결정 내용) -- 근거: (전사본에서 그렇게 판단한 대목)
## 할 일
| 담당 | 할 일 | 기한 |
## 결론이 나지 않은 것
## 원문 확인이 필요한 부분
2. 전사본에 없는 내용은 절대 만들어 내지 마세요.
담당자나 기한이 언급되지 않았으면 "미정"이라고 쓰세요.
3. 발음이 비슷해서 잘못 받아쓴 것으로 보이는 용어는
"원문 확인이 필요한 부분"에 타임스탬프와 함께 적으세요.
[전사본]
...여기에 transcribe.py가 만든 텍스트를 붙여넣습니다...
이 프롬프트에서 실제로 효과가 큰 장치는 세 가지입니다.
- 결정마다 근거를 적게 하는 것 — 전사본 어디를 보고 그렇게 판단했는지 쓰게 하면, 지어낸 항목이 눈에 띄게 줄어듭니다.
- “미정”을 허용하는 것 — 담당자와 기한을 반드시 채우라고 하면 AI가 그럴듯한 이름을 넣습니다. 빈칸을 허용해야 빈칸으로 둡니다.
- “원문 확인이 필요한 부분” 항목 — 받아쓰기 오류는 반드시 생깁니다. 의심 구간을 타임스탬프로 모아 주면 그 부분만 다시 들어 보면 됩니다.
4단계: 폴더에 넣으면 알아서 정리되게
여기까지 손으로 해 보고 결과가 쓸 만하다 싶으면, 두 단계를 하나로 묶습니다. 녹음 파일을 폴더에 던져 넣고 스크립트를 실행하면 전사본과 회의록이 함께 나옵니다.
# meeting_notes.py -- recordings 폴더에 녹음을 넣어 두고 한 번 실행하면
# notes 폴더에 전사본과 회의록이 쌓입니다.
# pip install faster-whisper anthropic
import os
from pathlib import Path
from faster_whisper import WhisperModel
import anthropic
INBOX = Path("recordings")
OUTBOX = Path("notes")
AUDIO_EXT = {".m4a", ".mp3", ".wav", ".mp4"}
OUTBOX.mkdir(exist_ok=True)
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
# 위에서 다듬은 프롬프트를 그대로 재사용합니다.
PROMPT = open("prompt.txt", encoding="utf-8").read()
def transcribe(path):
segments, _ = model.transcribe(str(path), language="ko", vad_filter=True)
return "\n".join(
"[%02d:%02d] %s" % (int(s.start) // 60, int(s.start) % 60, s.text.strip())
for s in segments
)
def summarize(transcript):
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=4000,
messages=[{"role": "user", "content": PROMPT + "\n\n" + transcript}],
)
return msg.content[0].text
for audio in sorted(INBOX.iterdir()):
if audio.suffix.lower() not in AUDIO_EXT:
continue
note = OUTBOX / (audio.stem + ".md")
if note.exists(): # 이미 처리한 파일은 건너뜁니다
continue
print("처리 중:", audio.name)
text = transcribe(audio)
# 전사본을 먼저 저장합니다. 요약이 실패해도 원본은 남습니다.
(OUTBOX / (audio.stem + ".transcript.txt")).write_text(text, encoding="utf-8")
note.write_text(summarize(text), encoding="utf-8")
print(" ->", note)
전사본을 요약 전에 먼저 저장하는 부분이 중요합니다. 전사는 오래 걸리고 요약은 순식간인데, API 호출이 실패했다고 수십 분짜리 전사를 다시 하는 건 아깝기 때문입니다. 처리 끝난 파일을 건너뛰는 조건도 같은 이유로 넣었습니다. 이 스크립트를 윈도우 작업 스케줄러에 매일 저녁 한 번 걸어 두면 그날 녹음이 자동으로 정리됩니다.
어떤 방법을 고를까
| 방법 | 비용 | 데이터가 나가는 곳 | 적합한 상황 |
|---|---|---|---|
| 회의 도구 내장 기능 | 요금제에 포함 | 해당 서비스 서버 | 이미 그 도구로 화상회의를 할 때 |
| 클로바노트 등 전사 서비스 | 무료 사용량 + 유료 전환 | 해당 서비스 서버 | 한국어 회의, 설치 없이 바로 |
| Whisper 로컬 실행 | 전기값만 | 나가지 않음 | 민감한 내용, 파일이 많고 시간 여유 있을 때 |
| 전사 API 이용 | 재생 시간당 과금 | API 제공사 서버 | PC 성능이 부족하고 빨리 끝내야 할 때 |
정하기 어렵다면 기준은 하나입니다. 이 녹음이 밖으로 나가도 되는가. 고객사 이름과 계약 조건이 오간 회의라면 성능과 무관하게 로컬이 답이고, 사내 스터디 모임 회의라면 편한 걸 쓰면 됩니다.
실제로 사고가 나는 지점
돌려 보면 대체로 잘 되지만, 아래 다섯 가지는 거의 반드시 만나게 됩니다.
- 무음 구간 환각 — Whisper는 아무 말도 없는 구간에서 없는 문장을 만들어 내는 성질이 있습니다. 끝부분에 “시청해 주셔서 감사합니다” 같은 문장이 붙는 게 전형적인 증상입니다. 위 코드의
vad_filter=True가 이걸 크게 줄여 줍니다. - 화자 구분은 별개 작업 — Whisper는 누가 말했는지 구분하지 않습니다. 화자 분리가 꼭 필요하면
pyannote.audio같은 별도 도구를 붙여야 하는데, 설정 난이도가 한 단계 올라갑니다. 참석자가 서너 명이고 회의록 형식이 고정돼 있다면, 굳이 없어도 대부분 읽힙니다. - 고유명사 오인식 — 사내 용어와 제품명은 거의 틀립니다. 전사본에서 일괄 치환하는 게 가장 확실하지만, 미리 힌트를 줄 수도 있습니다.
- 긴 회의의 뒷부분 품질 저하 — 두세 시간짜리 전사본을 한 번에 넣으면 뒤쪽 내용이 뭉뚱그려지는 경향이 있습니다. 30분 단위로 나눠 각각 정리한 뒤 합치는 편이 안정적입니다.
- 녹음 사실을 알리지 않는 것 — 내가 참여한 대화를 녹음하는 것 자체는 통신비밀보호법이 금지하는 “타인 간 대화 녹음”에 해당하지 않지만, 회사 내규나 고객사와의 계약은 별개 문제입니다. 회의 시작할 때 한마디 하고 시작하세요.
# 사내 용어와 제품명을 미리 알려 주면 받아쓰기 정확도가 올라갑니다.
# initial_prompt는 "앞서 이런 맥락의 말이 있었다"고 모델에 귀띔하는 용도입니다.
segments, info = model.transcribe(
"meeting.m4a",
language="ko",
vad_filter=True,
initial_prompt="코드팁박스, 애드센스, 스프린트 회고, KPI, 온보딩 퍼널",
)
AI가 만든 회의록은 초안입니다. 결정사항과 할 일 칸만 1~2분 훑어보고 내보내세요. 잘못된 회의록은 회의록이 없는 것보다 나쁩니다.
마무리
오늘 당장 할 수 있는 건 3단계 하나입니다. 다음 회의를 녹음해 두고, 쓰던 전사 도구로 텍스트만 뽑은 다음, 위 프롬프트를 붙여넣어 보세요. 결과가 쓸 만한지 확인하는 데 10분이면 충분하고, 그 10분으로 자동화를 더 만들지 말지 판단할 수 있습니다.
쓸 만하다고 판단됐다면 2단계와 4단계를 붙이면 됩니다. 순서를 거꾸로 가면 — 스크립트부터 만들면 — 정작 결과물이 마음에 안 들어서 전부 버리게 되는 경우가 많습니다.
다음 글에서는 로컬 서버를 띄우려 할 때 자주 만나는 포트 충돌(이미 사용 중인 포트) 오류를 다룹니다. 어떤 프로세스가 포트를 잡고 있는지 찾아내고 정리하는 방법을 윈도우·맥 각각 정리해 보겠습니다.