🔍 STT/TTS 성능 저하 원인 분석 완료
두 프로젝트를 비교한 결과, 성능 저하의 주요 원인을 찾았습니다.
📊 핵심 차이점 비교
| 항목 | 기존 () | 새 버전 () |
|---|---|---|
| TTS 방식 | Android TextToSpeech (로컬) | OpenAI TTS API (네트워크) |
| LLM 호출 | 1회 (질문→응답) | 1~2회 (질문→응답 + CAGE 요약) |
| Context 처리 | RAG만 | RAG + CAGE (대화 기록) |
| 오디오 처리 | 즉시 재생 | 파일 저장 후 MediaPlayer 재생 |
🚨 성능 저하 원인 (Step-by-Step)
1. TTS 네트워크 지연 (가장 큰 원인)
기존: speak() → Android TTS → 즉시 재생 (50~100ms)
새버전: speak() → OpenAI API 호출 → 오디오 다운로드 → 파일 저장 → MediaPlayer 재생 (1~3초)
2. CAGE 요약으로 인한 추가 API 호출
// 대화가 10개 초과 시 자동으로 요약 API 호출
suspend fun summarizeOldConversations() {
openAIService.summarizeConversations(conversationTexts) // 추가 API 호출!
}
3. 더 많은 Context 전송
// 매 요청마다 RAG + CAGE 컨텍스트 결합
val combinedContext = buildString {
append("참고 문서:\n$ragContext\n\n") // RAG
append(cageContext) // + 대화 기록 전체
}
4. 동기적 파일 I/O
// TTS 오디오를 파일로 저장 후 재생
FileOutputStream(tempFile).use { fos ->
fos.write(audioBytes) // 파일 쓰기 지연
}
mediaPlayer.setDataSource(tempFile.absolutePath)
mediaPlayer.prepare() // 동기 prepare
⚡ 해결 방안
즉시 적용 가능한 최적화:
- TTS 캐싱 추가 – 동일 텍스트 재요청 방지
- Streaming TTS 사용 –
tts-1대신 스트리밍으로 점진적 재생 - prepareAsync() 사용 – 동기 prepare → 비동기로 변경
- CAGE 요약 비동기화 – 응답 후 백그라운드에서 요약
📁 생성된 파일
| 파일 | 주요 최적화 |
|---|---|
OpenAITTSService_optimized.kt | LRU 캐시 (10MB), OkHttp 타임아웃, Connection Pool |
SpeechManager_optimized.kt | prepareAsync(), AudioAttributes, 임시파일 자동정리 |
CAGEManager_optimized.kt | 백그라운드 요약, 동기 컨텍스트 조회 |
DashboardViewModel_optimized.kt | 컨텍스트 크기 제한, 비동기 대화 추가 |
README_OPTIMIZATION.md | 적용 방법 및 테스트 가이드 |
⚡ 예상 성능 개선
| 상황 | 기존 | 최적화 후 |
|---|---|---|
| TTS 첫 재생 | 2~3초 | 1.5~2초 |
| TTS 캐시 히트 | 2~3초 | 50~100ms |
| CAGE 요약 대기 | 1~2초 | 0ms (백그라운드) |