졸업프로젝트

3/19 제미나이 연결해서 요약 하기 + 프엔 코드 살짝 수정

ayoonistory 2026. 3. 19. 15:47

1. 작업 목표

MedExplain의 녹음 → STT → 요약 → 의료 용어 표시 흐름을 실제로 연결하고, 프론트와 백엔드 간 데이터 전달 문제를 해결하는 것을 목표로 작업하였다.
특히 결과 화면에서 원문 텍스트, 요약, 의료 용어가 비어 보이던 문제를 중점적으로 수정하였다.

2. 프론트엔드 작업 내용

초기 확인 결과, 프론트는 Windows 데스크톱 환경에서 실행 중이었으나 websocket 및 summary API 일부가 Android emulator용 주소인 10.0.2.2를 사용하고 있었다.
이를 Windows 로컬 서버 주소인 127.0.0.1로 수정하여 websocket /ws/stt 및 HTTP /summary 요청이 정상적으로 백엔드로 전달되도록 변경하였다.

또한 녹음 종료 직후 transcript를 바로 결과 화면에 넘기고 있었는데, 실제 final STT 결과는 websocket으로 조금 뒤에 도착하기 때문에 결과 화면으로 빈 문자열이 전달되는 문제가 있었다.
이를 해결하기 위해 녹음 종료 시점에는 transcript를 확정하지 않고 “STT 결과를 기다리는 중...” 상태만 표시하도록 수정하였다. 이후 websocket 이벤트 수신 시 transcriptStore를 갱신하고, 최신 transcript를 기준으로 결과 화면으로 이동하도록 변경하였다.

추가로 결과 보기 버튼도 실제 transcript가 존재할 때만 보이도록 조건을 수정하여, 빈 결과 화면으로 진입하는 문제를 줄였다.

3. STT 이벤트 파싱 관련 수정

프론트 models.dart와 transcript_store.dart를 점검하여 websocket으로 들어오는 STT 이벤트를 파싱하는 로직을 수정하였다.
초기에는 isFinal, text 필드가 기대한 형태로 들어오지 않아 transcriptStore에 값이 누적되지 않았고, 그 결과 combinedText가 빈 값으로 유지되었다.

이를 해결하기 위해 STT 이벤트 파싱 시 isFinal / final 값을 모두 처리할 수 있도록 보완하고, text가 실제로 존재하는 경우만 transcriptStore에 반영되도록 수정하였다.

4. 백엔드 websocket 처리 수정

백엔드 ws_stt.py에서 websocket 이벤트 형식과 전송 타이밍 문제를 수정하였다.
기존에는 STT 및 translation 이벤트를 payload 내부 중첩 구조로 전송하고 있었는데, 프론트는 top-level text, isFinal 등의 필드를 기대하고 있어 형식 불일치가 발생하였다.
이를 프론트가 읽을 수 있는 flat 구조로 수정하였다.

또한 recognize_once() 이후 결과 전송을 asyncio.create_task()로 처리하면서 websocket 연결 종료 후 send를 시도하는 문제가 발생하였다.
이를 asyncio.run_coroutine_threadsafe() 기반으로 바꿔 STT 및 translation 결과가 event loop에 즉시 안전하게 전달되도록 수정하였다.

5. 요약 기능 개선

백엔드 /summary 라우터를 확인한 결과, 기존 요약은 문장 분리 후 앞 3문장을 반환하는 단순 규칙 기반 로직이었다.
이를 유지하면서도 고도화를 위해 외부 LLM 요약을 도입하는 방향으로 구조를 정리하였다.

현재 방향은 다음과 같다.

  • /summary는 그대로 백엔드 엔드포인트 유지
  • 내부 summarizer.py에서 Gemini API를 우선 호출
  • 응답 실패 시 기존 규칙 기반 요약으로 fallback
  • 프론트는 별도 수정 없이 기존 /summary 호출 구조 유지

이를 위해 Gemini API 키를 발급받고, 백엔드 실행 cmd 창에서 set GEMINI_API_KEY=... 방식으로 환경변수를 설정한 뒤 서버에서 외부 요약 호출이 가능하도록 준비하였다.

6. STT 언어 설정 확인

stt_google_streaming.py를 확인한 결과 language_code가 ko-KR로 고정되어 있어 영어 발화 테스트 시 빈 결과가 나올 가능성이 있었다.
테스트 과정에서 영어/한국어 발화에 따라 STT 결과 차이가 발생할 수 있음을 확인하였고, 필요 시 language_code를 테스트 언어에 맞게 조정해야 함을 점검하였다.

7. 최종 결과

최종적으로 다음 흐름이 정상 동작하는 상태까지 확인하였다.

  • 프론트 Windows 앱 실행
  • websocket /ws/stt 정상 연결
  • 녹음 데이터 전송
  • 백엔드 STT final 결과 생성
  • 프론트 결과 화면에 원문 텍스트 표시
  • /summary 호출 후 요약 표시
  • /explain 호출 후 의료 용어 영역 표시 구조 유지
  • 백엔드와 프론트 간 기본 연동 성공

즉, MedExplain의 핵심 1차 흐름인 녹음 → STT → 요약 출력까지는 동작 가능한 상태로 정리되었다.

8. 이후 과제

이후에는 다음 작업을 진행하면 된다.

  • explain 기능을 의료 사전 기반 또는 외부 API 기반으로 고도화
  • Gemini 요약 품질 안정화
  • websocket/session 종료 처리 추가 안정화
  • 저장된 records 화면과 상세 화면 연결 점검
  • 실제 의료 시나리오 기반 테스트 데이터 확장

6. 커밋 메시지 추천

프론트:

git commit -m "STT 결과 반영 흐름 수정 및 결과 화면 연동 개선"
 
 

백엔드:

git commit -m "웹소켓 STT 이벤트 형식 수정 및 Gemini 요약 구조 반영"