엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"1시간짜리 회의 녹음을 다시 들으면서 회의록을 작성하느라 회의 시간보다 더 오래 걸린다", "출장 중 통화 내용을 녹음해뒀는데 텍스트로 정리할 시간이 없다", "여러 명이 참석한 회의 내용을 핵심만 요약해서 공유하고 싶다"…
회의록 작성은 회의 자체보다 시간이 더 걸리는 경우가 많습니다. 파이썬과 무료 음성 인식 라이브러리를 활용하면 녹음 파일을 텍스트로 자동 변환하고, 핵심 내용만 추출해서 워드 파일로 정리할 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
음성 인식에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install openai-whisper python-docx
openai-whisper는 OpenAI에서 공개한 무료 음성 인식 모델입니다. 별도 API 키나 인터넷 연결 없이 PC에서 직접 음성을 텍스트로 변환할 수 있습니다. 한국어 인식 성능이 뛰어난 편입니다. python-docx는 결과를 워드 파일로 저장하는 데 사용합니다.
⚠️ 추가 설치 필요: Whisper는 내부적으로 FFmpeg라는 프로그램이 필요합니다. ffmpeg.org에서 윈도우용을 내려받아 압축을 풀고, 시스템 환경 변수 PATH에 bin 폴더 경로를 추가해야 합니다. 검색창에 "환경 변수 편집"을 입력하면 설정 화면을 찾을 수 있습니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, transcribe.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import whisper
from pathlib import Path
from datetime import datetime
# ① 설정
AUDIO_PATH = r"C:\Users\내이름\Desktop\회의녹음.mp3" # ← 녹음 파일 경로 (mp3, wav, m4a 등 지원)
OUTPUT_TXT = r"C:\Users\내이름\Desktop\회의록_원문.txt" # ← 저장할 텍스트 경로
MODEL_SIZE = "base" # ← 모델 크기: tiny(빠름,부정확) / base / small / medium(느림,정확)
# ② Whisper 모델 로드 (최초 실행 시 모델 다운로드, 시간이 걸립니다)
print(f" 모델 로드 중... ({MODEL_SIZE})")
model = whisper.load_model(MODEL_SIZE)
print(f" ✔ 모델 로드 완료")
# ③ 음성을 텍스트로 변환
print(f" 음성 인식 중... (녹음 길이에 따라 시간이 걸립니다)")
result = model.transcribe(AUDIO_PATH, language="ko")
full_text = result["text"]
print(f" ✔ 변환 완료: {len(full_text)}자")
# ④ 타임스탬프가 포함된 상세 결과도 함께 정리
segments_text = []
for seg in result["segments"]:
start_min = int(seg["start"] // 60)
start_sec = int(seg["start"] % 60)
segments_text.append(f"[{start_min:02d}:{start_sec:02d}] {seg['text'].strip()}")
# ⑤ 텍스트 파일로 저장
output_content = f"""회의록 원문 (자동 변환)
변환일시: {datetime.now().strftime('%Y-%m-%d %H:%M')}
원본파일: {Path(AUDIO_PATH).name}
{'='*50}
[전체 텍스트]
{'='*50}
{full_text}
{'='*50}
[시간대별 상세 내용]
{'='*50}
""" + "\n".join(segments_text)
Path(OUTPUT_TXT).write_text(output_content, encoding="utf-8")
print(f"\n✅ 완료! 저장 → {OUTPUT_TXT}")
변환된 텍스트에서 핵심 문장만 추출해 보기 좋은 워드 회의록으로 만드는 코드입니다. 아래 코드를 summarize.py로 저장하세요.
from docx import Document
from docx.shared import Pt
from pathlib import Path
from datetime import datetime
import re
# ① 설정
INPUT_TXT = r"C:\Users\내이름\Desktop\회의록_원문.txt" # ← 변환된 텍스트 경로
OUTPUT_DOCX = r"C:\Users\내이름\Desktop\회의록_정리.docx" # ← 워드 저장 경로
# 강조할 키워드 (이 단어가 포함된 문장을 핵심 내용으로 추출)
KEYWORDS = ["결정", "확정", "다음 주", "마감", "담당", "예산", "일정", "회의"]
# ② 원문 텍스트 읽기
text = Path(INPUT_TXT).read_text(encoding="utf-8")
# 전체 텍스트 구간만 추출
match = re.search(r"\[전체 텍스트\]\n={10,}\n(.+?)\n\n={10,}", text, re.DOTALL)
full_text = match.group(1).strip() if match else text
# ③ 문장 단위로 분리 후 키워드 포함 문장 추출
sentences = re.split(r"(?<=[.!?])\s+", full_text)
key_sentences = [s.strip() for s in sentences
if any(kw in s for kw in KEYWORDS) and len(s.strip()) > 5]
print(f" ✔ 전체 문장: {len(sentences)}개")
print(f" ✔ 핵심 문장 추출: {len(key_sentences)}개")
# ④ 워드 문서 작성
doc = Document()
doc.add_heading("회의록 요약", level=1)
doc.add_paragraph(f"작성일: {datetime.now().strftime('%Y년 %m월 %d일')}")
doc.add_paragraph()
doc.add_heading("핵심 내용", level=2)
for sentence in key_sentences:
p = doc.add_paragraph(f"• {sentence}")
p.style.font.size = Pt(11)
doc.add_heading("전체 회의 내용", level=2)
doc.add_paragraph(full_text)
doc.save(OUTPUT_DOCX)
print(f"\n✅ 완료! 회의록 저장 → {OUTPUT_DOCX}")
AUDIO_PATH에 녹음 파일 경로를 입력합니다.MODEL_SIZE를 선택합니다. 처음 사용할 때는 base로 시작하는 것을 권장합니다.python transcribe.py
변환 완료 후 요약 정리를 실행합니다:
python summarize.py
정상 실행 시 터미널에 이렇게 출력됩니다:
모델 로드 중... (base) ✔ 모델 로드 완료 음성 인식 중... (녹음 길이에 따라 시간이 걸립니다) ✔ 변환 완료: 3842자 ✅ 완료! 저장 → C:\Users\내이름\Desktop\회의록_원문.txt
오류 1: FileNotFoundError 또는 FFmpeg 관련 오류
FFmpeg가 설치되지 않았거나 PATH에 등록되지 않은 경우입니다. 1단계의 FFmpeg 설치 및 환경 변수 등록을 다시 확인하세요. 등록 후에는 터미널을 완전히 닫고 새로 열어야 적용됩니다.
오류 2: 변환이 너무 오래 걸림
MODEL_SIZE가 클수록 정확하지만 느립니다. 긴 회의(1시간 이상)는 tiny 또는 base로 먼저 테스트하고, 중요한 회의만 small 이상으로 다시 처리하는 것을 권장합니다.
오류 3: 한국어 인식이 부정확함
녹음 음질이 좋지 않거나 여러 명이 동시에 말하는 구간에서 정확도가 떨어질 수 있습니다. MODEL_SIZE를 medium으로 올리면 정확도가 개선됩니다. 다만 PC 성능에 따라 처리 시간이 크게 늘어날 수 있습니다.
Whisper 자체는 화자 구분을 지원하지 않지만, 시간 구간을 기준으로 발화자를 수동으로 매핑할 수 있습니다.
# 시간 구간별 발화자 매핑 (회의 진행 순서를 미리 알 때)
SPEAKER_MAP = [
(0, 300, "팀장"), # 0~300초: 팀장 발언
(300, 600, "담당자A"), # 300~600초: 담당자A 발언
]
for seg in result["segments"]:
speaker = "알수없음"
for start, end, name in SPEAKER_MAP:
if start <= seg["start"] < end:
speaker = name
break
print(f"[{speaker}] {seg['text'].strip()}")
💡 이전 게시글과 결합하면: 이메일 자동 발송 편과 결합하면 완성된 회의록을 참석자들에게 자동으로 발송할 수 있고, 워드 문서 자동 생성 편의 서식 기법을 추가하면 더 보기 좋은 회의록을 만들 수 있습니다.
이 코드를 응용하면 여러 녹음 파일을 한꺼번에 처리하거나, 회의록에서 액션 아이템(할 일)만 따로 추출하는 것도 가능합니다.