🎙️ 음성 → 텍스트 변환 & AI 분석 웹앱
만들려던 것 📝
음성 파일을 올리면 텍스트로 자동 변환하고, AI가 요약·키워드 추출·오탈자 교정까지 해주는 로컬 실행형 개인 도구를 만들고자 함.
회의·강의 녹음을 빠르고 정확하게 텍스트로 옮기는 환경을 구축하고자 함.
여러 파일을 한 번에 처리하고, 긴 오디오도 멈추지 않고 안정적으로 변환하는 구조를 구현하고자 함.
변환에서 끝나지 않고 AI 요약·교정까지 한 흐름으로 이어지는 개인용 분석 도구를 목표로 함.
상용 프로그램은 좀 쓰다 보면 한도가 차서 유료 전환을 해야 하고, 화자 분리된 텍스트를 복사하기가 너무 어려워 직접 만들었음.
활용한 툴 ⚒️
Claude Code: 바이브코딩
faster-whisper (CTranslate2): 음성→텍스트 STT 엔진. openai-whisper 대비 2~4배 빠름.
OpenAI GPT-4.1: 요약, 키워드 추출, 오탈자 교정 담당.
pyannote.audio: 화자 분리(누가 말했는지 감지) — 선택 기능.
Streamlit / ffmpeg / PyTorch: 웹 UI, 오디오 분할, 딥러닝 연산 백엔드.
진행 세부 내용 🔍
1️⃣ 음성 변환 코어 구축
mp3·mp4·wav·m4a·ogg 등 주요 포맷을 지원하고, 여러 파일을 동시에 업로드해 순차 처리하도록 구성함.
Whisper 모델 5종(tiny~large-v3)과 언어(한/영/자동)를 사이드바에서 선택할 수 있게 함.
GPU면 float16, CPU면 int8을 자동 선택해 환경에 맞게 동작하도록 함.
2️⃣ 긴 오디오 자동 분할 처리
ffprobe로 오디오 길이를 먼저 측정하고, 기준 시간(기본 10분)을 넘으면 ffmpeg으로 청크를 분할함.
분할된 청크를 개별 변환한 뒤 타임스탬프 offset을 더해 다시 합산하여 하나의 결과로 만듦.
3️⃣ AI 분석 기능 결합
변환된 텍스트에 대해 요약(일반/회의록/강의·인터뷰), 키워드 10개 추출, 오탈자 교정을 GPT-4.1로 수행하도록 구성함. (옵션)
각 기능은 자동 실행이 아닌 버튼 클릭 시에만 호출해 API 비용을 통제함.
4️⃣ 이력 관리 및 내보내기
변환할 때마다
history.json에 자동 저장(최대 100건)하고, 히스토리 탭에서 조회·삭제·다운로드하도록 함.결과를 TXT·JSON으로 내보내고 클립보드 복사까지 지원하도록 구성함.
시행착오 ⚠️
flowchart LR
P1["🐌 초기 로딩 수 분"] --> S1["faster-whisper 교체<br/>+ lazy import"]
P2["📂 단일 파일만 지원"] --> S2["다중 업로드<br/>+ Expander 분리"]
P3["💥 긴 파일 OOM"] --> S3["ffprobe 측정<br/>+ ffmpeg 청크 분할"]
P4["✏️ 오탈자·환각"] --> S4["VAD 필터<br/>+ GPT 교정 버튼"]
P5["💸 자동 요약 비용"] --> S5["요약/키워드/교정<br/>버튼 분리 실행"]
P6["👤 SPEAKER_00 표시"] --> S6["화자 이름 입력<br/>실시간 치환"]
초기 로딩이 수십 초~수 분으로 느림 → openai-whisper를 faster-whisper로 교체하고, pyannote는 lazy import로 화자 분리 OFF 시 로딩을 건너뛰게 하여 해결함.
긴 오디오를 통째로 넣으면 메모리 부족(OOM) 위험 → 청크 단위 분할 후 합산 방식으로 우회함.
Whisper 변환 결과에 오탈자·환각(hallucination) 발생 → VAD 필터로 묵음 구간을 제거(환각 감소)하고, 보완책으로 GPT-4.1 교정 탭을 추가함.
AI 요약이 매번 자동 실행되어 비용 낭비 → 요약·키워드·교정을 각각 버튼으로 분리하고 결과를 세션에 캐싱함.
배운 점 📚
단순히 빠른 라이브러리로 교체하는 것만으로도 사용자가 체감하는 초기 로딩 병목이 크게 줄어든다는 점을 확인함.
긴 작업은 통째로 처리하기보다 잘게 쪼갠 뒤 합치는 구조가 메모리·안정성 면에서 유리함을 인 식함.
STT 정확도는 한 가지 방법으로 끝나지 않고 전처리(VAD)와 후처리(AI 교정)를 함께 가져가야 실용 수준에 도달함을 체감함.
비용이 드는 AI 호출은 자동이 아니라 사용자가 의도적으로 누를 때만 실행시키는 설계가 개인 도구에서 중요함을 배움.
향후 계획 🧭
실시간 마이크 녹음 → 즉시 변환(Streamlit-webrtc) 기능 추가 고민중
변환 결과를 앱 내에서 바로 편집하는 텍스트 에디터를 내장.
도움이 필요한 점 🤝
1️⃣ STT 정확도의 근본적 향상 방안
현재 상황: VAD 필터와 GPT 교정으로 오탈자를 줄였으나, 음질이 낮은 파일에서는 여전히 환각·오인식이 남아 있음.
시도한 방법: VAD 파라미터 튜닝, beam_size 조정, 이전 문맥 반영, 그리고 변환 후 GPT-4.1 교정.
필요한 도움: 후처리 교정에 의존하기 전에, 입력 단계(노이즈 제거·도메인 용어 사전 등)에서 정확도를 끌어올릴 수 있는 접근 방식.
2️⃣ 로컬 도구의 배포·공유 구조 구체화
현재 상황: 현재는 로컬에서 배치파일로만 실행되어, 다른 사람이 바로 쓰기 어려운 상태임.
시도한 방법: run.bat 원클릭 실행, requirements.txt 정리 정도까지 진행함.
필요한 도움: 모델 다운로드·API 키·GPU 의존성을 가진 앱을 Docker/클라우드로 깔끔하게 배포하는 현실적인 방법이나 방향성.