mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 11:26:25 +00:00
- SSE 스트리밍 방식으로 AI 분석 결과 실시간 전송 구현 - 용어 감지 및 관련 회의록 검색 기능 개선 - API 명세 업데이트 (SSE 엔드포인트 추가) - AI 및 STT 서비스 테스트 환경 구성 문서 작성 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
295 lines
10 KiB
Markdown
295 lines
10 KiB
Markdown
# STT Service 백엔드 개발 결과서
|
||
|
||
## 📋 개발 개요
|
||
- **서비스명**: STT Service (Speech-To-Text)
|
||
- **개발일시**: 2025-10-24
|
||
- **개발자**: 준호
|
||
- **개발 가이드**: 백엔드개발가이드 준수
|
||
|
||
## ✅ 구현 완료 항목
|
||
|
||
### 1. 실시간 AI 제안사항 API (100% 완료)
|
||
| API | 메서드 | 경로 | 설명 | 상태 |
|
||
|-----|--------|------|------|------|
|
||
| AI 제안사항 스트리밍 | GET | `/api/v1/stt/ai-suggestions/meetings/{meetingId}/stream` | 실시간 AI 제안사항 SSE 스트리밍 | ✅ |
|
||
| 회의 메모 저장/업데이트 | PUT | `/api/v1/stt/ai-suggestions/meetings/{meetingId}/memo` | 회의 메모 저장 및 업데이트 | ✅ |
|
||
| 회의 메모 조회 | GET | `/api/v1/stt/ai-suggestions/meetings/{meetingId}/memo` | 저장된 회의 메모 조회 | ✅ |
|
||
|
||
### 2. 기존 STT API (100% 완료)
|
||
| API | 메서드 | 경로 | 설명 | 상태 |
|
||
|-----|--------|------|------|------|
|
||
| 녹음 준비 | POST | `/api/v1/stt/recordings/prepare` | 회의 녹음 초기화 및 설정 | ✅ |
|
||
| 녹음 시작 | POST | `/api/v1/stt/recordings/{recordingId}/start` | 녹음 세션 시작 | ✅ |
|
||
| 녹음 중지 | POST | `/api/v1/stt/recordings/{recordingId}/stop` | 녹음 세션 중지 | ✅ |
|
||
| 녹음 상세 조회 | GET | `/api/v1/stt/recordings/{recordingId}` | 녹음 정보 조회 | ✅ |
|
||
| 실시간 음성 변환 | POST | `/api/v1/stt/transcription/stream` | 실시간 STT 변환 | ✅ |
|
||
| 변환 결과 조회 | GET | `/api/v1/stt/transcription/{recordingId}` | 전체 변환 결과 조회 | ✅ |
|
||
|
||
### 3. 아키텍처 구현 (100% 완료)
|
||
- **패턴**: Layered Architecture 적용
|
||
- **계층**: Controller → Service → Repository → Entity
|
||
- **의존성 주입**: Spring DI 활용
|
||
- **실시간 스트리밍**: Spring WebFlux Reactor 활용
|
||
|
||
### 4. 🆕 실시간 AI 제안사항 스트리밍 (새로 추가)
|
||
- **프로토콜**: Server-Sent Events (SSE)
|
||
- **스트리밍**: Spring WebFlux Flux를 활용한 실시간 데이터 전송
|
||
- **AI 제안 카테고리**: DECISION, ACTION_ITEM, KEY_POINT, QUESTION
|
||
- **신뢰도 점수**: 85-99 범위의 confidence score 제공
|
||
|
||
### 5. 회의 메모 관리 (새로 추가)
|
||
- **실시간 메모 저장**: 회의 중 작성한 메모를 실시간으로 저장
|
||
- **AI 제안 통합**: AI 제안사항을 메모에 추가 가능
|
||
- **타임스탬프 지원**: 녹음 시간과 함께 메모 저장
|
||
|
||
## 🔧 기술 스택
|
||
- **Framework**: Spring Boot 3.3.5, Spring WebFlux
|
||
- **Reactive Programming**: Project Reactor
|
||
- **실시간 통신**: Server-Sent Events (SSE)
|
||
- **AI 분석**: Mock 구현 (향후 실제 AI 엔진 연동 예정)
|
||
- **Documentation**: Swagger/OpenAPI
|
||
- **Build**: Gradle
|
||
|
||
## 📂 패키지 구조
|
||
```
|
||
stt/src/main/java/com/unicorn/hgzero/stt/
|
||
├── controller/
|
||
│ ├── RecordingController.java # 녹음 관리 API
|
||
│ ├── TranscriptionController.java # 음성 변환 API
|
||
│ └── AiSuggestionController.java # 🆕 AI 제안사항 API
|
||
├── dto/
|
||
│ ├── RecordingDto.java
|
||
│ ├── TranscriptionDto.java
|
||
│ ├── TranscriptSegmentDto.java
|
||
│ └── AiSuggestionDto.java # 🆕 AI 제안사항 DTO
|
||
└── service/
|
||
├── RecordingService.java
|
||
├── TranscriptionService.java
|
||
└── AiSuggestionService.java # 🆕 AI 제안사항 서비스
|
||
```
|
||
|
||
## 🔄 실시간 AI 제안사항 스트리밍
|
||
|
||
### SSE 연결 방법
|
||
```javascript
|
||
// 프론트엔드에서 EventSource API 사용
|
||
const eventSource = new EventSource(
|
||
'http://localhost:8082/api/v1/stt/ai-suggestions/meetings/meeting-123/stream'
|
||
);
|
||
|
||
eventSource.addEventListener('ai-suggestion', (event) => {
|
||
const suggestion = JSON.parse(event.data);
|
||
console.log('AI 제안:', suggestion);
|
||
|
||
// 화면에 제안사항 표시
|
||
displayAiSuggestion(suggestion);
|
||
});
|
||
|
||
eventSource.onerror = (error) => {
|
||
console.error('스트리밍 오류:', error);
|
||
eventSource.close();
|
||
};
|
||
```
|
||
|
||
### AI 제안사항 응답 예시
|
||
```json
|
||
{
|
||
"suggestionId": "suggestion-a1b2c3d4",
|
||
"meetingId": "meeting-123",
|
||
"timestamp": "00:05:23",
|
||
"suggestionText": "신제품의 타겟 고객층을 20-30대로 설정하고, 모바일 우선 전략을 취하기로 논의 중입니다.",
|
||
"createdAt": "2025-10-24T14:05:23",
|
||
"confidenceScore": 92,
|
||
"category": "DECISION"
|
||
}
|
||
```
|
||
|
||
### 제안 카테고리 설명
|
||
| 카테고리 | 설명 | 예시 |
|
||
|---------|------|------|
|
||
| DECISION | 의사결정 사항 | "타겟 고객층 20-30대로 결정" |
|
||
| ACTION_ITEM | 실행 항목 | "11월 15일까지 프로토타입 완성" |
|
||
| KEY_POINT | 핵심 요점 | "마케팅 예산 배분 논의" |
|
||
| QUESTION | 질문 사항 | "추가 검토 필요" |
|
||
|
||
## 📝 회의 메모 관리
|
||
|
||
### 메모 저장 요청 예시
|
||
```bash
|
||
curl -X PUT http://localhost:8082/api/v1/stt/ai-suggestions/meetings/meeting-123/memo \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"meetingId": "meeting-123",
|
||
"memoContent": "[00:05] 신제품 타겟 고객층 논의\n[00:08] 개발 일정 수립\n[00:12] 마케팅 예산 배분",
|
||
"userId": "user-001"
|
||
}'
|
||
```
|
||
|
||
### 메모 저장 응답 예시
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"data": {
|
||
"memoId": "memo-x9y8z7w6",
|
||
"meetingId": "meeting-123",
|
||
"memoContent": "[00:05] 신제품 타겟 고객층 논의\n[00:08] 개발 일정 수립\n[00:12] 마케팅 예산 배분",
|
||
"savedAt": "2025-10-24T14:10:00",
|
||
"userId": "user-001"
|
||
},
|
||
"timestamp": "2025-10-24T14:10:00"
|
||
}
|
||
```
|
||
|
||
## 🧪 테스트 방법
|
||
|
||
### 1. 서비스 시작
|
||
```bash
|
||
./gradlew stt:bootRun
|
||
```
|
||
|
||
### 2. Swagger UI 접속
|
||
```
|
||
http://localhost:8082/swagger-ui.html
|
||
```
|
||
|
||
### 3. 실시간 AI 제안사항 테스트
|
||
```bash
|
||
# SSE 스트리밍 연결 (터미널에서 테스트)
|
||
curl -N http://localhost:8082/api/v1/stt/ai-suggestions/meetings/meeting-123/stream
|
||
|
||
# 실시간으로 AI 제안사항이 표시됩니다 (10초마다)
|
||
event: ai-suggestion
|
||
id: suggestion-a1b2c3d4
|
||
data: {"suggestionId":"suggestion-a1b2c3d4","meetingId":"meeting-123",...}
|
||
```
|
||
|
||
### 4. 회의 메모 API 테스트
|
||
```bash
|
||
# 메모 저장
|
||
curl -X PUT http://localhost:8082/api/v1/stt/ai-suggestions/meetings/meeting-123/memo \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"meetingId": "meeting-123", "memoContent": "[00:05] 테스트 메모", "userId": "user-001"}'
|
||
|
||
# 메모 조회
|
||
curl -X GET http://localhost:8082/api/v1/stt/ai-suggestions/meetings/meeting-123/memo
|
||
```
|
||
|
||
## 🚀 빌드 및 컴파일 결과
|
||
- ✅ **컴파일 성공**: `./gradlew stt:compileJava`
|
||
- ✅ **의존성 해결**: Spring WebFlux Reactor 추가
|
||
- ✅ **코드 품질**: 컴파일 에러 없음, 타입 안전성 확보
|
||
|
||
## 📝 백엔드개발가이드 준수 체크리스트
|
||
|
||
### ✅ 개발원칙 준수
|
||
- [x] 개발주석표준에 맞게 주석 작성
|
||
- [x] API설계서와 일관성 있게 설계
|
||
- [x] Layered 아키텍처 적용 및 Service 레이어 Interface 사용
|
||
- [x] Gradle 빌드도구 사용
|
||
- [x] 설정 Manifest 표준 준용
|
||
|
||
### ✅ 개발순서 준수
|
||
- [x] 참고자료 분석 및 이해 (회의진행.html 분석)
|
||
- [x] DTO 작성 (AiSuggestionDto)
|
||
- [x] Service 작성 (AiSuggestionService)
|
||
- [x] Controller 작성 (AiSuggestionController)
|
||
- [x] 컴파일 및 에러 해결
|
||
- [x] Swagger 문서화
|
||
|
||
### ✅ 설정 표준 준수
|
||
- [x] 환경변수 사용 (하드코딩 없음)
|
||
- [x] spring.application.name 설정
|
||
- [x] OpenAPI 문서화 표준 적용
|
||
- [x] Logging 표준 적용
|
||
|
||
## 🎯 새로 추가된 주요 기능
|
||
|
||
### 1. 실시간 AI 제안사항 스트리밍
|
||
- **기술**: Server-Sent Events (SSE) 프로토콜
|
||
- **장점**:
|
||
- 단방향 실시간 통신으로 WebSocket보다 가볍고 간단
|
||
- 자동 재연결 기능 내장
|
||
- HTTP 프로토콜 기반으로 방화벽 이슈 없음
|
||
- **구현**: Spring WebFlux Flux를 활용한 Reactive 스트리밍
|
||
|
||
### 2. AI 제안 카테고리 분류
|
||
- **DECISION**: 회의에서 결정된 사항 자동 추출
|
||
- **ACTION_ITEM**: 실행이 필요한 항목 자동 식별
|
||
- **KEY_POINT**: 핵심 논의 사항 요약
|
||
- **QUESTION**: 추가 검토가 필요한 질문사항
|
||
|
||
### 3. 신뢰도 점수 (Confidence Score)
|
||
- AI가 제안한 내용에 대한 신뢰도를 85-99 범위로 제공
|
||
- 낮은 신뢰도의 제안은 필터링 가능
|
||
|
||
### 4. 타임스탬프 통합
|
||
- 녹음 시간(HH:MM:SS)과 함께 제안사항 제공
|
||
- 메모에 시간 정보 자동 추가
|
||
- 회의록 작성 시 정확한 시간 참조 가능
|
||
|
||
## 📊 개발 완성도
|
||
- **기능 구현**: 100% (9/9 API 완료)
|
||
- **가이드 준수**: 100% (체크리스트 모든 항목 완료)
|
||
- **코드 품질**: 우수 (컴파일 성공, 표준 준수)
|
||
- **실시간 통신**: SSE 프로토콜 적용
|
||
|
||
## 🔗 화면 연동
|
||
|
||
### 회의진행.html과의 연동
|
||
- **710-753라인**: "💬 AI가 실시간으로 분석한 제안사항" 영역
|
||
- **SSE 연결**: EventSource API로 실시간 제안사항 수신
|
||
- **메모 추가**: ➕ 버튼 클릭 시 제안사항을 메모에 추가
|
||
- **자동 삭제**: 메모에 추가된 제안 카드는 자동으로 사라짐
|
||
|
||
### 프론트엔드 구현 예시
|
||
```javascript
|
||
// 실시간 AI 제안사항 수신
|
||
const eventSource = new EventSource(
|
||
`/api/v1/stt/ai-suggestions/meetings/${meetingId}/stream`
|
||
);
|
||
|
||
eventSource.addEventListener('ai-suggestion', (event) => {
|
||
const suggestion = JSON.parse(event.data);
|
||
|
||
// 화면에 AI 제안 카드 추가
|
||
const card = createAiSuggestionCard(suggestion);
|
||
document.getElementById('aiSuggestionList').appendChild(card);
|
||
});
|
||
|
||
// AI 제안을 메모에 추가
|
||
function addToMemo(suggestionText, timestamp) {
|
||
const memo = document.getElementById('meetingMemo');
|
||
const timePrefix = `[${timestamp.substring(0, 5)}] `;
|
||
memo.value += `\n\n${timePrefix}${suggestionText}`;
|
||
|
||
// 메모 서버에 저장
|
||
saveMemoToServer();
|
||
}
|
||
|
||
// 메모 저장
|
||
function saveMemoToServer() {
|
||
fetch(`/api/v1/stt/ai-suggestions/meetings/${meetingId}/memo`, {
|
||
method: 'PUT',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({
|
||
meetingId: meetingId,
|
||
memoContent: document.getElementById('meetingMemo').value,
|
||
userId: currentUserId
|
||
})
|
||
});
|
||
}
|
||
```
|
||
|
||
## 🚀 향후 개선 사항
|
||
1. **실제 AI 엔진 연동**: 현재 Mock 데이터 → OpenAI/Azure AI 연동
|
||
2. **다국어 지원**: 영어, 일본어 등 다국어 STT 지원
|
||
3. **화자 식별**: 여러 참석자 음성 구분 및 식별
|
||
4. **감정 분석**: 회의 분위기 및 감정 상태 분석
|
||
5. **키워드 추출**: 핵심 키워드 자동 추출 및 태깅
|
||
|
||
## 🔗 관련 문서
|
||
- [회의진행 화면](../../design/uiux/prototype/05-회의진행.html)
|
||
- [API 설계서](../../design/backend/api/)
|
||
- [외부 시퀀스 설계서](../../design/backend/sequence/outer/)
|
||
- [내부 시퀀스 설계서](../../design/backend/sequence/inner/)
|