분류 전체보기 9

FastAPI + Google STT + Gemini로 진료 음성 분석 백엔드 만들기

MedExplain환자가 진료실에서 의사의 설명을 녹음하면 AI가 핵심 내용을 요약하고, 어려운 의료 용어를 쉽게 풀어서 설명해주는 앱이다. Flutter로 만든 안드로이드 앱이 프론트엔드고, 이 글에서 다룰 FastAPI 서버가 백엔드다.이 글에서는 오디오가 서버에 도착한 이후, 최종 요약이 앱에 돌아가기까지의 전체 백엔드 파이프라인을 단계별로 설명한다.전체 흐름Flutter 앱 (오디오 파일 전송)↓ WebSocketFastAPI 서버↓[1단계] Google STT → 텍스트 변환↓[2단계] 후처리 → 구어체/약어 정규화, 필러 단어 제거↓[3단계] STT 교정 → 규칙 기반 + Gemini 의료 문맥 교정↓[4단계] Gemini 요약 → 환자 친화적 요약 + 구조화 정보 추출↓Flutter 앱 (결..

졸업프로젝트 2026.05.10

5/5 STT 품질 개선 + 실험

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이 의료 문맥을 이해하고 ..

졸업프로젝트 2026.05.06

4/3 데모 직전 수정하기

1. 버그 수정1-1. 진료 기록 저장 오류 (Critical)파일: app/routes/records.py문제: 용어 저장 시 description 키 대신 easy 키를 참조해서 용어 설명이 항상 빈 문자열로 저장됨수정: item.get("easy", "") → item.get("description", "") or item.get("easy", "")영향: 저장 후 진료 기록 상세 조회 시 용어 설명이 정상적으로 표시됨1-2. records.json 데이터 정리중복 레코드 5개 제거description 없이 easy: ""만 있는 오염 레코드 정리2. STT 인식 품질 개선파일: app/stt_google_streaming.py문제: language_code="ko-KR" 단일 언어 설정으로 인해 ..

졸업프로젝트 2026.04.03

3/26 서버(STT/저장/기록 조회) 안정화 및 예외 처리 보완 작업 보고서

1. 오늘 작업 목표오늘 작업의 목표는 MedExplain의 서버 흐름 중에서STT 결과 처리, 빈 결과 예외 처리, 기록 저장/조회 안정화를 점검하고,프론트와 연동되는 records 흐름이 실제로 동작하는지 확인하는 것이었다.특히 MedExplain은 단순히 결과를 한 번 보여주는 데서 끝나는 것이 아니라,진료 날짜 / 진료과 / 원문 텍스트 / 요약 / 의료 용어가 기록으로 저장되고 다시 조회되는 구조가 중요하기 때문에 이 흐름을 우선적으로 확인하였다.2. 오늘 진행한 주요 작업(1) 프론트 최신 코드 반영 및 실행 환경 정리GitHub에 올라온 프론트 최신 코드를 로컬에 pull하여 반영함실행 과정에서 누락된 파일(section_card.dart) 문제를 확인하였고, A가 push한 후 다시 pul..

졸업프로젝트 2026.03.26

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

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를..

졸업프로젝트 2026.03.19

코테 공부 시작

지피티가 시키는대로 가볼게요,,,하다 보면 되겄지 샤갈 0주차 (3/12, 3/16)GOAT - Ch.05 읽기2557 Hello World이걸 왜 시키나 라고 한동안 고민했음 공대도서관에서 하기엔 민망했어1000 A+Bmap(int, input().split()) 알기 2753 윤년python에서는 &&가 아니라 and, or조건문 끝날때 :문자열일때 '' 잊지 말기2438 별 찍기 - 11부터 해서 n까지 하기 range 10871 X보다 작은 수문제를 똑바로 읽자,,,,주어진다고 해도 random 생성인줄,,,,

3/12 응 결국 수정

MedExplain 서버 개발 진행 보고서 1. 작업 개요 이번 작업에서는 MedExplain 프로젝트의 서버(B) 파트에서 모바일(A)와 연결 가능한 1차 API 뼈대를 구축하였다. 기존에는 STT 연결 및 WebSocket 기반 텍스트 수신 구조가 중심이었다면, 이번 작업에서는 STT 이후 결과를 사용자가 실제로 활용할 수 있는 형태로 가공하고 저장하는 기능을 우선 구현하는 방향으로 범위를 확장하였다. 2. 변경 배경 및 이유 초기 구상에서는 음성 입력 이후 STT 결과를 얻는 것 자체에 초점이 맞춰져 있었다. 하지만 프로젝트 방향이 점차 “환자/보호자가 진료 내용을 이해하고 다시 확인할 수 있도록 돕는 앱” 쪽으로 구체화되면서, 단순 전사 결과만으로는 사용자 가치가 부족하다는 문제가 있었다...

졸업프로젝트 2026.03.12

1/25 API 계약 최종 고정,JSON 깨짐 방어 로직

1. 담당 역할 개요 (B 담당)본 프로젝트에서 B 담당은 FastAPI 기반 서버를 구축하고,STT 결과 텍스트를 입력받아 환자 친화적 요약 JSON으로 변환하는 /summarize API를 구현하였다.특히 프론트엔드와의 안정적인 연동을 위해 API 계약 고정 및 JSON 안정성 확보를 핵심 목표로 두었다.2. API 설계 및 구현(1) API 계약 고정shared/schema.md를 단일 기준으로 삼아, 요청·응답 구조를 변경하지 않고 구현하였다.요청POST /summarize{"raw_text":"string"}응답{"summary_3sent":"string","easy_terms":[{"term":"string","easy":"string"}],"next_actions":[{"title":"str..

졸업프로젝트 2026.03.07

1/19 서버 Google Cloud Speech-to-Text(STT) 연동 설정 및 REST 요청/응답 확정

1. 목표Google Cloud Speech-to-Text API를 프로젝트에 연결하고,WAV 파일을 REST로 전송했을 때 어떤 JSON이 오며,응답에서 최종 텍스트(transcript)를 추출하는 방법을 확정한다.“샘플 오디오로 STT 1회 성공”을 기준으로 기능 검증을 완료한다.2. GCP 콘솔 설정 절차2.1 프로젝트 생성 및 결제 연결Google Cloud Console에서 신규 프로젝트 생성(예: medexplain-stt)결제(Billing) 계정 생성/연결STT API는 유료 과금 가능성이 있으므로 결제 계정 연결이 필요함비용 통제 목적의 Budget/알림 설정은 선택(추가로 설정 가능)2.2 Speech-to-Text API 활성화API 및 서비스 → 라이브러리Cloud Speech-to..

졸업프로젝트 2026.03.07