솔랩스 AI 체험관의 회의록 AI는 녹음 파일을 올리면 발화자별 대화록, 요약, 할 일과 우선순위까지 정리해 줘요. 겉으로는 "파일 올리기 → 결과 보기" 한 단계지만, 뒤에서는 꽤 여러 문제를 풀어야 했어요. 직접 만들고 운영하면서 정한 구조를 정리했어요.
1. 전체 흐름
- 브라우저가 녹음 파일을 저장소(Vercel Blob)에 바로 올려요
- 음성을 글자로 바꿔요 (STT · Speech-to-Text, OpenAI Whisper)
- 언어 모델(Claude)이 대화록을 발화자별로 나누고 요약 · 할 일을 뽑아요
- 결과를 화면에 보여 주고, 올린 파일은 바로 지워요
서버리스 환경은 한 번에 받을 수 있는 요청 크기에 한도가 있어요. 그래서 파일은 저장소에 먼저 올리고, 서버는 그 주소만 받아 처리해요. 처리가 끝나면 저장소의 파일은 즉시 삭제해 비용과 보관 부담을 줄여요.
2. 긴 녹음은 잘라서 나란히
Whisper API는 한 번에 받을 수 있는 파일이 25MB로 정해져 있어요. 한 시간 넘는 회의 녹음은 이 한도를 쉽게 넘어요. 또 서버리스 함수는 실행 시간에도 한도가 있어서, 긴 파일을 한 번에 처리하다 보면 중간에 끊겨요.
그래서 기준을 정해 길이에 따라 길을 나눴어요.
| 조건 | 처리 위치 |
|---|---|
| 25MB 이하 · 30분 이하 | 웹 서버에서 바로 처리 |
| 그보다 크거나 긴 파일 | 별도 처리 서버(Railway)로 넘겨 ffmpeg로 잘게 나눈 뒤 동시에 변환 |
ffmpeg(음성 · 영상 변환 도구)는 서버리스 환경에서 쓰기 어려워 별도 서버에 뒀어요. 조각들을 동시에 변환한 뒤 순서대로 이어 붙이면 긴 회의도 끊기지 않고 처리돼요. 지금은 최대 200MB 파일까지 받아요.
3. 발화자 구분은 단서를 모아서
녹음 한 파일에 여러 사람이 섞여 있으니 "누가 말했는지"를 나누는 게 가장 까다로웠어요. 지금은 언어 모델에게 다음 단서를 근거로 판단하게 해요.
- 말 사이의 쉼(pause) — 1.5초 이상 쉬면 다른 사람일 가능성을 먼저 봐요
- 대화 중 불린 이름 — "○○님"이 나오면 그다음 응답자를 확정해요
- 질문과 답의 흐름 — 질문한 사람과 답한 사람은 다른 사람이에요
- 참석자 정보 — 미리 적어 준 참석자 수 안에서만 나눠요
긴 파일은 조각마다 따로 분석하니, 앞 조각에서 정한 이름을 다음 조각에 넘겨 같은 사람이 같은 이름으로 이어지게 했어요. 음성 자체로 목소리를 구분하는 방식(화자 분리 모델)은 GPU 서버를 갖춘 뒤 다음 단계로 붙일 계획이에요.
글로 읽는 것보다 직접 써 보는 게 빨라요AI 체험관 · 간편 로그인 후 기업 분석 · 회의록 · 계약서 검토를 무료로무료 체험4. 요약 품질 맞추기
요약이 쓸모 있으려면 "무엇을 결정했고, 누가 무엇을 언제까지 하는지"가 바로 보여야 해요. 그래서 자유롭게 요약하게 두지 않고, 결과 형식을 정해 두었어요.
- 회의 한 줄 요약
- 주요 논의와 결정 사항
- 할 일 (담당자 · 기한 · 우선순위)
- 다음에 확인할 것
긴 회의는 조각별로 먼저 분석하고, 마지막에 조각 결과를 모아 한 번 더 정리하는 2단계로 처리해요. 처음부터 전체를 한 번에 요약하는 것보다 놓치는 내용이 적어요.
5. 비용과 안정성
Whisper는 음성 길이만큼, 언어 모델은 글자 양만큼 비용이 들어요. 실패했을 때 무작정 다시 시도하지 않고, 같은 지시문은 캐시(프롬프트 캐싱)로 재사용해 비용을 줄였어요. 하루 사용 횟수도 제한해 체험 서비스가 남용되지 않게 했어요.
회사 회의 녹음을 밖으로 내보내기 어렵다면, 같은 구조를 사내 서버에 올리는 방식으로도 만들 수 있어요.