[카테고리:] 미분류

  • 🔍 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
    

    ⚡ 해결 방안

    즉시 적용 가능한 최적화:

    1. TTS 캐싱 추가 – 동일 텍스트 재요청 방지
    2. Streaming TTS 사용tts-1 대신 스트리밍으로 점진적 재생
    3. prepareAsync() 사용 – 동기 prepare → 비동기로 변경
    4. CAGE 요약 비동기화 – 응답 후 백그라운드에서 요약

    📁 생성된 파일

    파일주요 최적화
    OpenAITTSService_optimized.ktLRU 캐시 (10MB), OkHttp 타임아웃, Connection Pool
    SpeechManager_optimized.ktprepareAsync(), 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 (백그라운드)