๐Ÿ” 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 (๋ฐฑ๊ทธ๋ผ์šด๋“œ)

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค