ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐ŸŽ™๏ธ Building a Local Voice-Controlled AI Agent
Dev.toDev.to
AI/ML

Local Whisper ๋ฐ LLM ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋ฐ˜์˜ ์Œ์„ฑ ์ œ์–ด AI ์—์ด์ „ํŠธ ๊ตฌํ˜„

๐ŸŽ™๏ธ Building a Local Voice-Controlled AI Agent

AKSHAT SAXENA2026๋…„ 4์›” 15์ผ15๋ถ„intermediate

Context

ํด๋ผ์šฐ๋“œ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ผ๋ฐ˜ ๋…ธํŠธ๋ถ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋กœ์ปฌ AI ์—์ด์ „ํŠธ ๊ตฌ์ถ• ํ•„์š”์„ฑ ๋Œ€๋‘. ๊ธฐ์กด API ๊ธฐ๋ฐ˜ ์—ฐ๋™ ๋ฐฉ์‹์˜ ํ† ํฐ ๋น„์šฉ ๋ฐœ์ƒ ๋ฐ ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ๋ฆฌ์Šคํฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ปฌ ์ค‘์‹ฌ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„.

Technical Solution

  • streamlit-mic-recorder๋ฅผ ํ†ตํ•œ ๋ธŒ๋ผ์šฐ์ € MediaRecorder API ๊ธฐ๋ฐ˜์˜ raw WAV ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๊ตฌ์กฐ ์„ค๊ณ„
  • ํ•˜๋“œ์›จ์–ด ์ œ์•ฝ์— ๋”ฐ๋ฅธ STT_BACKEND ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ถ„๋ฆฌ ๋ฐ Local Whisper(Base)์™€ Groq API ๊ฐ„์˜ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด ๊ตฌ์ถ•
  • ๋‹จ์ˆœ ํ‚ค์›Œ๋“œ ๋งค์นญ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด LLM ๊ธฐ๋ฐ˜์˜ Structured Prompt๋ฅผ ํ†ตํ•œ JSON ํ˜•ํƒœ์˜ Intent Classification ๊ตฌํ˜„
  • Path Traversal ๊ณต๊ฒฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ํ•ด์„ ๋ฐ output/ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ๊ฒฉ๋ฆฌ ๊ฒ€์ฆ ๋กœ์ง ์ ์šฉ
  • Audio Input โ†’ STT โ†’ Intent Classification โ†’ Tool Dispatch โ†’ UI Output์œผ๋กœ ์ด์–ด์ง€๋Š” ๋‹จ๋ฐฉํ–ฅ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
  • Ollama, Gemini, Groq ๋“ฑ ๋‹ค์–‘ํ•œ LLM ๋ฐฑ์—”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ต์ฒด ๊ฐ€๋Šฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ ์ฑ„ํƒ

- STT ๋ชจ๋ธ ์„ ํƒ ์‹œ CPU ํ™˜๊ฒฝ์—์„œ๋Š” Base ๋ชจ๋ธ์„ ํ†ตํ•ด ์ •ํ™•๋„์™€ ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์˜ ๊ท ํ˜•์  ํ™•๋ณด - LLM ๊ฒฐ๊ณผ๋ฌผ์„ ๋„๊ตฌ ์‹คํ–‰์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ JSON Schema๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ํŒŒ์‹ฑ ์—๋Ÿฌ ์ตœ์†Œํ™” - ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋„๊ตฌ ๊ตฌํ˜„ ์‹œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๊ฒ€์ฆ์„ ํ†ตํ•œ Path Traversal ๋ฐฉ์–ด ๊ธฐ์ œ ํ•„์ˆ˜ ์ ์šฉ - ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ Backend ์ถ”์ƒํ™”๋กœ ์ธํ”„๋ผ ํ™˜๊ฒฝ ๋ณ€ํ™”์— ์œ ์—ฐํ•œ ๋Œ€์‘ ๊ตฌ์กฐ ์„ค๊ณ„

์›๋ฌธ ์ฝ๊ธฐ