졸업프로젝트

5/5 STT 품질 개선 + 실험

ayoonistory 2026. 5. 6. 10:40

3. 이번 작업에서 구현한 기능

3-1. STT 후처리 파이프라인

음성 인식(STT) 과정에서 발생하는 오류를 자동으로 교정하는 파이프라인을 신규 구현하였다 (stt_corrector.py).

교정은 두 단계로 이루어진다.

1단계 — 규칙 기반 교정 (정규식)

자주 발생하는 오탈자 패턴을 정규식으로 사전 정의하여 즉시 교정한다.

  • 척추 기호 오류: L4 LO, L4 L0 → L4 L5 로 자동 변환
  • 한글 숫자/단위 표현 정규화: "이 백" → "200", "삼십 밀리그램" → "30mg"
  • 필러 단어 제거: "음", "어", "그", "저" 등 불필요한 간투사 삭제

2단계 — LLM 기반 교정 (Gemini 2.5-flash, temperature=0.3)

규칙으로 처리되지 않는 문맥적 오류를 LLM이 의료 문맥을 이해하고 교정한다. 원문의 구조와 내용은 유지하고 오인식된 부분만 수정한다.

이 교정 파이프라인은 요약(/summary), 용어 추출(/explain), 실시간 스트리밍 결과 모두에 적용된다.

3-2. 요약 품질 개선

기존 요약은 원문을 거의 그대로 줄이는 방식이어서 환자가 이해하기 어렵고, 소수점 숫자에서 문장이 잘리는 버그가 있었다. 이를 아래와 같이 개선하였다.

요약 방식 변경

원문 축약 방식에서 환자 친화적 재구성 방식으로 프롬프트를 전면 수정하였다. 수치는 반드시 괄호로 함께 표기하도록 하였다.

  • 변경 전: "공복 혈당 128이 나왔고 HbA1c 6.8%이며 당뇨 전 단계입니다."
  • 변경 후: "혈당이 당뇨 직전 수준으로 나왔습니다 (공복혈당 128, HbA1c 6.8%). 지금 관리하지 않으면 당뇨로 진행될 수 있습니다."

소수점 버그 수정

0.5와 같은 소수점 숫자에서 문장이 끊기던 문제를 정규식 조건 분기로 수정하였다.

출력 구조 확장

기존에는 요약 문장 목록만 반환하던 것을 아래와 같이 구조화된 형태로 확장하였다.

  • summary: 요약 문장 (최대 3개)
  • symptoms: 언급된 증상 목록
  • measurements: 검사 수치 목록
  • medications: 약물 및 용량 목록

3-3. 의료 용어 사전 구축

LLM을 통한 용어 추출이 실패할 경우를 대비한 fallback 용어 사전을 직접 구축하였다 (medical_terms.json). 내과, 정형외과, 심장내과, 신경과 등 주요 진료과 기준으로 60개 이상의 한국어 의료 용어와 쉬운 설명을 수록하였다.

예시)

  • HbA1c: 지난 2~3개월간 평균 혈당 수준을 나타내는 지표
  • 공복혈당: 8시간 이상 금식 후 측정한 혈당 수치
  • L4-L5: 허리뼈 4번과 5번 사이 디스크 위치

3-4. 진료 기록 API 확장

기존 기록 저장/조회 기능에 다음을 추가하였다.

DELETE /records/{id} 신규 추가

특정 진료 기록을 삭제하는 엔드포인트를 구현하였다. 존재하지 않는 id 요청 시 404를 반환한다.

저장 항목 확장

기록 저장 및 조회 시 다음 두 필드를 추가로 처리한다.

  • memo: 환자가 직접 입력하는 자유 메모
  • structured: 구조화된 증상/수치/약물 정보 (3-2에서 확장한 요약 결과와 연동)

3-5. 질문 자동 분류 기능

환자가 질문을 입력하면 AI가 내용을 분석하여 아래 세 가지로 자동 분류하고, AI 답변 가능한 경우 즉시 답변까지 생성한다.

  • ai_answer: AI가 바로 답변 가능한 정보성 질문 (예: "HbA1c가 뭔가요?")
  • ask_doctor: 다음 진료 때 의사에게 직접 확인이 필요한 질문 (예: "이 약 오래 먹어도 되나요?")
  • urgent: 즉시 병원 또는 응급 확인이 필요한 상황 (예: "가슴이 갑자기 너무 아파요")

사용자가 별도로 카테고리를 선택하지 않아도 AI가 자동 판단한다.

3-6. UI 목업 제작

프론트엔드 개발 방향 결정을 위한 HTML 목업을 두 종류 제작하였다.

홈 화면 목업 (mockup.html)

현재 화면과 개선안을 나란히 배치하여 비교하였다. 개선안은 녹음 전 / 녹음 중 / 녹음 완료 세 가지 상태를 각각 별도 화면으로 구성하였다.

분석 결과 및 질문하기 탭 목업 (mockup_result.html)

분석 결과 탭에서 AI가 자동 추정한 진료과를 표시하는 방식으로 두 가지 안을 제시하였다.

  • A안: 상단 배너 카드 방식 — AI 추정 진료과를 카드 형태로 표시하고 변경 버튼 포함
  • B안: 인라인 칩 방식 — 날짜 옆에 작은 칩으로 진료과를 표시하고 탭하여 변경

질문하기 탭은 단일 입력창 → 자동 분류 → AI 답변 카드 / 다음 진료 체크리스트 / 긴급 항목 섹션으로 구성하였다.

4. 파일별 변경 내역

신규 생성

  • medexplain/server/app/services/stt_corrector.py
  • medexplain/server/app/data/medical_terms.json

수정

  • medexplain/server/app/services/summarizer.py — 요약 프롬프트 개선, 소수점 버그 수정, temperature=0.3
  • medexplain/server/app/services/term_extractor.py — medical_terms.json fallback 추가, temperature=0.3
  • medexplain/server/app/services/question_analyzer.py — temperature=0.3
  • medexplain/server/app/routes/summary.py — STT 교정 연동, structured 반환
  • medexplain/server/app/routes/explain.py — STT 교정 연동
  • medexplain/server/app/routes/records.py — DELETE 엔드포인트 추가, memo/structured 저장
  • medexplain/server/app/models/schemas.py — StructuredInfo 모델, memo/structured 필드 추가
  • medexplain/server/app/stt_google_streaming.py — 숫자/단위 교정, 필러 단어 제거 후처리 추가
  • lib/api/app_config.dart — 서버 IP 업데이트

5. 앞으로 해야 할 작업

백엔드

  • 진료과 자동 추출 서비스 구현 — STT 텍스트에서 Gemini로 내과/정형외과 등 자동 추론

프론트엔드 (개발자 직접 구현)

  • 홈 화면 UI 개선 (mockup.html 참고)
  • 분석 결과 탭에 structured 정보 표시 (증상/수치/약물)
  • 진료과 표시 및 변경 기능 (mockup_result.html A안 또는 B안 선택 후 구현)
  • 질문하기 탭 전체 구현 (mockup_result.html 참고)
  • 진료 기록 삭제 버튼 연동 (DELETE /records/{id})
  • memo 입력 및 수정 기능