← Projects
AI · STT

SonaNote — 실시간 STT 회의록 자동화

회의 음성을 실시간으로 텍스트로 변환하고, 화자분리·요약까지 자동화한 STT 플랫폼

소속
(주)페르소나AI
기간
2025.10 – 현재
역할
프론트엔드 · STT 백엔드 · 실시간 API 연동
Next.js 15React 19TypeScriptFastAPISpring BootApache KafkaWebSocket / STOMPfaster-whisperPostgreSQLCelery / RedisDockerGitLab CI/CD
01

Overview

실시간 회의·녹음·업로드 세 가지 방식으로 들어오는 음성을 STT로 변환하고, 화자를 분리해 요약·문서화하는 회의록 자동화 서비스입니다. 경기도청 등 공공 회의 환경을 대상으로 페르소나AI에서 개발·운영하고 있습니다.

02

Background

회의록은 여전히 수기 정리에 의존해 시간이 많이 들고, 실시간으로 누가 무슨 말을 했는지 추적하기 어렵습니다. 특히 공공기관 회의는 다수 화자·장시간·정확도 요구가 동시에 걸립니다.

03

Problem

실시간 스트리밍 STT에서 연결/재연결 시 메시지 유실과 NPE가 반복되고, 다수 화자 분리 정확도와 장시간 대용량 오디오의 비동기 처리(백프레셔)가 핵심 과제였습니다.

04

My Role

  • Next.js 15 실시간 회의 UI 및 WebSocket ws-proxy(커스텀 server.js) 구현
  • FastAPI 기반 STT 백엔드(화자분리·VAD·요약)의 작업 큐 설계
  • 경기도청 Spring Boot WebSocket API와의 이벤트 기반 연동 및 GitLab CI/CD 배포
05

Architecture

클라이언트 오디오는 노이즈 억제 후 WebSocket으로 스트리밍되고, 커스텀 Next 서버의 ws-proxy가 업스트림 Spring Boot API로 중계합니다. STT는 Kafka로 비동기 분리되어 faster-whisper 컨슈머가 처리하고, 화자분리(ONNX VAD + 클러스터링) 결과를 PostgreSQL에 적재합니다.

Client (Next.js · Speex 노이즈 억제)WebSocket / STOMPws-proxy (커스텀 server.js)Spring Boot API (WebSocket)Apache KafkaSTT Consumer (faster-whisper)화자분리 (VAD · ONNX · 클러스터링)PostgreSQL · LLM 요약
06

Key Features

  • 실시간 회의 / 녹음 / 오디오 업로드 3가지 입력 모드
  • Speex 기반 노이즈 억제 및 백그라운드 WAV 업로드(SFTP)
  • 화자분리 + 재생 동기 하이라이트
  • LLM 기반 회의 요약·제목 자동 생성
07

Technical Decisions

STT→API 구간을 이벤트 기반으로 재설계
왜 → 요청/응답 방식에서 ready 신호 유실과 NPE가 반복돼, 이벤트 기반으로 전환해 유실을 제거했습니다.
standalone 빌드 대신 커스텀 server.js 실행
왜 → Next standalone에서 WebSocket ws-proxy가 끊겨, 커스텀 서버로 프록시 경로를 직접 유지했습니다.
Kafka로 STT 처리 분리
왜 → 장시간 오디오의 처리 지연이 API 응답을 막지 않도록 비동기 파이프라인으로 분리했습니다.
08

Troubleshooting

문제 · 재연결 시 ws-proxy 업스트림 연결 전 클라이언트 메시지가 유실되어 NPE 발생
해결 · 업스트림이 ready 될 때까지 클라이언트 메시지를 큐잉했다가 전송하도록 변경.
문제 · 실시간 회의 start 시 식별자(mtngrmIdntfyNo) 역직렬화 null
해결 · 식별자를 문자열로 직렬화해 전송, 백엔드 NPE 해결.
문제 · Javadoc 경고로 CI 빌드 실패
해결 · 경고 원인 제거 및 빌드 파이프라인 안정화.
09

Result

  • 경기도청 실시간 STT 서비스 STG/PROD 환경 운영
  • 실시간·업로드 회의록 자동 생성 및 화자분리 제공
10

What I Learned

  • 실시간 스트리밍에서 연결 상태·세션·백프레셔를 다루는 법
  • MSA 비동기(Kafka) 설계와 프론트~백 전 구간 디버깅 역량