Skip to main content
PromptQuorumPromptQuorum
ํ™ˆ/๊ณ ๊ธ‰ ๋กœ์ปฌ LLM/2026๋…„ ์™„์ „ ์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ ๋งŒ๋“ค๊ธฐ: Whisper + LLM + Piper (๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ)
Voice, Speech & Multimodal

2026๋…„ ์™„์ „ ์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ ๋งŒ๋“ค๊ธฐ: Whisper + LLM + Piper (๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ)

ยท14๋ถ„ ๋ถ„๋Ÿ‰ยทHans Kuepper ์ € ยท PromptQuorum ์ฐฝ๋ฆฝ์ž, ๋ฉ€ํ‹ฐ ๋ชจ๋ธ AI ๋””์ŠคํŒจ์น˜ ๋„๊ตฌ ยท PromptQuorum

2026๋…„ ์™„์ „ ์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: ์Œ์„ฑ ์ธ์‹์„ ์œ„ํ•œ whisper.cpp, ์ถ”๋ก ์„ ์œ„ํ•œ Ollama๋ฅผ ํ†ตํ•œ ๋กœ์ปฌ LLM, ์˜ค๋””์˜ค ์ถœ๋ ฅ์„ ์œ„ํ•œ Piper TTS. ์„ธ ๊ฐ€์ง€๋Š” ์˜ค๋””์˜ค๋ฅผ ๋“ฃ๊ณ , ์ „์‚ฌํ•˜๊ณ , LLM์— ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ์Œ์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. RTX 3060 12 GB VRAM์ด ์žˆ๋Š” PC์—์„œ ์—”๋“œํˆฌ์—”๋“œ ์ง€์—ฐ์‹œ๊ฐ„์€ Llama 3.3 8B์™€ Whisper small๋กœ 1~2์ดˆ์ž…๋‹ˆ๋‹ค. Mac Mini M5(24 GB)์—์„œ๋Š” ๋™์ผํ•œ ๋ชจ๋ธ๋กœ Apple Silicon์„ ํ†ตํ•ด 1~1.5์ดˆ์ž…๋‹ˆ๋‹ค. Raspberry Pi 5(8 GB)์—์„œ๋Š” Phi-3 mini 3.8B๋กœ 5~8์ดˆ์ž…๋‹ˆ๋‹ค โ€” ์–ด๋А ์ •๋„์˜ ์ธ๋‚ด์‹ฌ์ด ์žˆ๋‹ค๋ฉด ํ•ธ์ฆˆํ”„๋ฆฌ ์ฟผ๋ฆฌ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์œผ๋กœ Whisper๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ํ•ญ์ƒ ๋“ฃ๋„๋ก ํ•˜๋ ค๋ฉด ์›จ์ดํฌ ์›Œ๋“œ ๊ฐ์ง€๊ธฐ(OpenWakeWord ๋˜๋Š” Porcupine)๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

2026๋…„ ์™„์ „ ์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค: ์Œ์„ฑ ์ธ์‹์„ ์œ„ํ•œ whisper.cpp, ์ถ”๋ก ์„ ์œ„ํ•œ ๋กœ์ปฌ LLM(Ollama๋ฅผ ํ†ตํ•œ Llama 3.3 8B, Phi-4 ๋˜๋Š” Mistral Small), ์˜ค๋””์˜ค ์ถœ๋ ฅ์„ ์œ„ํ•œ Piper TTS. GPU๊ฐ€ ์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ PC์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ ์ง€์—ฐ์‹œ๊ฐ„์€ 1~2์ดˆ๋กœ Alexa๋‚˜ Google Assistant์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. Mac Mini M5์—์„œ๋Š” 1.5์ดˆ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. Raspberry Pi 5์—์„œ๋Š” 5~8์ดˆ์ž…๋‹ˆ๋‹ค โ€” ํ•ธ์ฆˆํ”„๋ฆฌ ์ฟผ๋ฆฌ์—๋Š” ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ์œ ์—ฐํ•œ ๋Œ€ํ™”์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ํ•˜๋“œ์›จ์–ด ํ‘œ, Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์ฝ”๋“œ, ์›จ์ดํฌ ์›Œ๋“œ ์„ค์ •, ์ง€์—ฐ์‹œ๊ฐ„ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๊ณผ ํ•จ๊ป˜ ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์ 

  • ์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ ์Šคํƒ์€: whisper.cpp โ†’ Ollama LLM โ†’ Piper TTS์ด๋ฉฐ, Python ์Šคํฌ๋ฆฝํŠธ๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค. ์„ธ ๊ตฌ์„ฑ์š”์†Œ ๋ชจ๋‘ ๋ฌด๋ฃŒ, ์˜คํ”ˆ์†Œ์Šค์ด๋ฉฐ ์„ค์น˜ ํ›„ ์™„์ „ํžˆ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์Šคํฌํ†ฑ GPU(RTX 3060 12 GB)์—์„œ ์—”๋“œํˆฌ์—”๋“œ ์ง€์—ฐ์‹œ๊ฐ„: 1โ€“2์ดˆ. Alexa ๋ฐ Google Assistant์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค โ€” ์Œ์„ฑ ์ƒํ˜ธ์ž‘์šฉ์ด "์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋А๊ปด์ง€๋Š”" ์ž„๊ณ„๊ฐ’. ์ด ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•ด Whisper small๊ณผ Llama 3.3 8B๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • Raspberry Pi 5(8 GB)๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋А๋ฆฐ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Phi-3 mini 3.8B์™€ Whisper base๋กœ ์ง€์—ฐ์‹œ๊ฐ„์ด 5โ€“8์ดˆ์ž…๋‹ˆ๋‹ค. ๋” ๊ธด ์ค‘์ง€๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ•ธ์ฆˆํ”„๋ฆฌ ์ฟผ๋ฆฌ์— ์œ ์šฉํ•˜์ง€๋งŒ ๋Œ€ํ™”์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Mac Mini M5(24 GB ํ†ตํ•ฉ ๋ฉ”๋ชจ๋ฆฌ)๋Š” ํ’ˆ์งˆ๊ณผ ์กฐ์šฉํ•จ ์‚ฌ์ด์˜ ์ตœ์  ์ง€์ ์ž…๋‹ˆ๋‹ค. ์œ ํœด ์‹œ ์กฐ์šฉํ•˜๊ณ , Whisper large-v3๋ฅผ Metal๋กœ 10ร— ์‹ค์‹œ๊ฐ„์œผ๋กœ, Llama 3.3 8B๋ฅผ ~50 tokens/s๋กœ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์‹œ๊ฐ„ 1โ€“1.5์ดˆ.
  • Whisper๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์›จ์ดํฌ ์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. OpenWakeWord(MIT, ๋ฌด๋ฃŒ, ์‚ฌ์šฉ์ž ์ •์˜ ์›จ์ดํฌ ์›Œ๋“œ)๊ฐ€ ์ตœ๊ณ ์˜ ์˜คํ”ˆ์†Œ์Šค ์„ ํƒ์ž…๋‹ˆ๋‹ค. Porcupine(Picovoice)์€ "Hey Jarvis" ๊ฐ™์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์›จ์ดํฌ ์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐœ์ธ ์‚ฌ์šฉ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์นจ๋ฌต์—์„œ์˜ Whisper ํ™˜๊ฐ์ด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. Whisper๋Š” ์นจ๋ฌต์„ ์ฑ„์šฐ๋Š” ๋‹จ์–ด๋‚˜ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ์ธ์šฉ์œผ๋กœ ์ „์‚ฌํ•ฉ๋‹ˆ๋‹ค. Whisper์— ์˜ค๋””์˜ค๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์ตœ์†Œ ์˜ค๋””์˜ค ์—๋„ˆ์ง€ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  whisper.cpp์—์„œ --no-speech-threshold 0.6์„ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.
  • ์ด ์„ค์ •์€ ์ž‘๋™ ์ค‘์— ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ๋ฆฝ ํ›„ Wireshark๋กœ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์˜ค๋””์˜ค, ์ „์‚ฌ๋ณธ, LLM ์ฟผ๋ฆฌ ์–ด๋А ๊ฒƒ๋„ ๊ธฐ๊ธฐ๋ฅผ ๋– ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋„๊ตฌ์— ๋Œ€ํ•œ GDPR ์ค€์ˆ˜๋Š” ์ž๋™์ž…๋‹ˆ๋‹ค โ€” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณ„์•ฝ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‚ฌ์‹ค

  • STT ๋ ˆ์ด์–ด: whisper.cpp(Apple Silicon ๋ฐ ์ž„๋ฒ ๋””๋“œ ํ•˜๋“œ์›จ์–ด์— ์ตœ์ ), faster-whisper(NVIDIA GPU๊ฐ€ ์žˆ๋Š” Python ํŒŒ์ดํ”„๋ผ์ธ์— ์ตœ์ ).
  • LLM ๋ ˆ์ด์–ด: Ollama + Llama 3.3 8B(๊ถŒ์žฅ), Phi-4(๋” ๊ฐ€๋ณ๊ณ  ์ข‹์€ ํ’ˆ์งˆ) ๋˜๋Š” Mistral Small(Llama 3.3 8B์™€ ๋น„์Šทํ•œ ํ’ˆ์งˆ).
  • TTS ๋ ˆ์ด์–ด: Piper(๋” ๋น ๋ฆ„, CPU๋งŒ, Pi์—์„œ ์‹ค์‹œ๊ฐ„), Coqui TTS(๋” ์ข‹์€ ํ’ˆ์งˆ, GPU ํ•„์š”).
  • ์›จ์ดํฌ ์›Œ๋“œ ์˜ต์…˜: OpenWakeWord(MIT, ์™„์ „ ์˜คํ”„๋ผ์ธ), Porcupine(๋ฌด๋ฃŒ ํ‹ฐ์–ด, ์‚ฌ์šฉ์ž ์ •์˜ ์›จ์ดํฌ ์›Œ๋“œ 1๊ฐœ).
  • ์ตœ์†Œ ํ•˜๋“œ์›จ์–ด: 8 GB RAM์˜ Raspberry Pi 5(~$100), 5โ€“8์ดˆ ์ง€์—ฐ์‹œ๊ฐ„.
  • ๊ถŒ์žฅ ํ•˜๋“œ์›จ์–ด: Mac Mini M5 24 GB(~$600) ๋˜๋Š” RTX 3060 12 GB๊ฐ€ ์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ(~$800), 1โ€“2์ดˆ ์ง€์—ฐ์‹œ๊ฐ„.
  • ์–ธ์–ด: Whisper๋Š” 99๊ฐœ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Piper๋Š” 20๊ฐœ ์ด์ƒ์˜ ์Œ์„ฑ ํŒฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. LLM ์„ฑ๋Šฅ์€ ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ 

Alexa, Siri, Google Assistant๋Š” ์Œ์„ฑ์„ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค โ€” ์˜ค๋””์˜ค๊ฐ€ ์ œ๊ณต์—…์ฒด์— ์˜ํ•ด ์ „์‚ฌ, ์ฒ˜๋ฆฌ, ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ž์ฒด ํ•˜๋“œ์›จ์–ด์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋ผ์ด๋ฒ„์‹œ: ์˜ค๋””์˜ค๊ฐ€ ์ง‘์„ ๋– ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ์— ์›จ์ดํฌ ์›Œ๋“œ ์˜ค๋””์˜ค ์ €์žฅ ์—†์Œ. ์ œ3์ž ์„œ๋ฒ„์— ๋Œ€ํ™” ๊ธฐ๋ก ์—†์Œ. ์˜๋ฃŒ ์ „๋ฌธ๊ฐ€, ๋ณ€ํ˜ธ์‚ฌ, ์ €๋„๋ฆฌ์ŠคํŠธ, ๋ฏผ๊ฐํ•œ ์—…๋ฌด๋ฅผ ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • ๋น„์šฉ: ๊ตฌ๋… ์—†์Œ. Alexa+๋Š” ์›” $4.99์ž…๋‹ˆ๋‹ค. Google One์€ ์›” $1.99โ€“$9.99์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ํ•˜๋“œ์›จ์–ด ์ผํšŒ์„ฑ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜: ์›จ์ดํฌ ์›Œ๋“œ, ๊ฐœ์„ฑ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น ์ถ”๊ฐ€, ๋กœ์ปฌ ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ ์—ฐ๊ฒฐ, ๋กœ์ปฌ API ํ†ตํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜คํ”„๋ผ์ธ ์ž‘๋™: ์ธํ„ฐ๋„ท ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ •์ „(UPS ํฌํ•จ) + ์ธํ„ฐ๋„ท ์ค‘๋‹จ: ๋กœ์ปฌ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋‘๋ง‰, ์›๊ฒฉ ์ง€์—ญ, ๋น„์ƒ ๋Œ€๋น„์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์žƒ๋Š” ๊ฒƒ: ์›น ๊ฒ€์ƒ‰, ๋…์  ํด๋ผ์šฐ๋“œ ์Šค๋งˆํŠธ ํ™ˆ ํ†ตํ•ฉ, ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์™€์˜ ์บ˜๋ฆฐ๋” ๋™๊ธฐํ™”, ๊ทธ๋ฆฌ๊ณ  Alexa/Siri๊ฐ€ ์—ฃ์ง€ ์ผ€์ด์Šค์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ˆ˜๋…„๊ฐ„์˜ RLHF ์กฐ์ •.
  • ์Šค๋งˆํŠธ ํ™ˆ ํ†ตํ•ฉ: ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ Home Assistant์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ์™„์ „ํžˆ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์Œ์„ฑ์œผ๋กœ ์กฐ๋ช…, ์˜จ๋„ ์กฐ์ ˆ๊ธฐ, ์„ผ์„œ๋ฅผ ์ œ์–ดํ•˜์‹ญ์‹œ์˜ค. ์ „์ฒด Piper + Whisper + Home Assistant ์„ค์ • ๊ฐ€์ด๋“œ๋Š” ์Šค๋งˆํŠธ ํ™ˆ์šฉ ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ โ†’๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜

์˜คํ”„๋ผ์ธ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋กœ ์—ฐ๊ฒฐ๋œ ์„ธ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ํ•œ ๋ฌธ์žฅ์œผ๋กœ

๋งˆ์ดํฌ โ†’ whisper.cpp (STT) โ†’ Ollama LLM โ†’ Piper TTS โ†’ ์Šคํ”ผ์ปค: ~50์ค„์˜ Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋กœ ์—ฐ๊ฒฐ๋œ ์„ธ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๊ตฌ์„ฑ์š”์†Œ.

๐Ÿ’ฌ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด

์ „ํ™” ๋ฆด๋ ˆ์ด ์ฒด์ธ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค: ๋งํ•˜๋ฉด, Whisper๊ฐ€ ๊ทธ๊ฒƒ์„ ์”๋‹ˆ๋‹ค, LLM์ด ์‘๋‹ต์„ ์ƒ๊ฐํ•˜๊ณ  ์”๋‹ˆ๋‹ค, Piper๊ฐ€ ์†Œ๋ฆฌ๋‚ด์–ด ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด๊ณ  Python์ด ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์ด์—์„œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ ˆ์ด์–ด 1 โ€” STT(์Œ์„ฑ ์ธ์‹): whisper.cpp ๋˜๋Š” faster-whisper. ๋งˆ์ดํฌ ์˜ค๋””์˜ค๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ, ๋„คํŠธ์›Œํฌ ์—†์ด ์ž‘๋™.
  • ๋ ˆ์ด์–ด 2 โ€” LLM(์ถ”๋ก ): Ollama๊ฐ€ Llama 3.3 8B, Phi-4 ๋˜๋Š” Mistral Small์„ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค. ์ „์‚ฌ๋œ ํ…์ŠคํŠธ + ๋Œ€ํ™” ๊ธฐ๋ก + ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐ›์•„ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ, ๋„คํŠธ์›Œํฌ ์—†์ด ์ž‘๋™.
  • ๋ ˆ์ด์–ด 3 โ€” TTS(์Œ์„ฑ ํ•ฉ์„ฑ): Piper ๋˜๋Š” Coqui TTS. LLM์˜ ์‘๋‹ต ํ…์ŠคํŠธ๋ฅผ ์˜ค๋””์˜ค๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์Šคํ”ผ์ปค๋กœ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ, ๋„คํŠธ์›Œํฌ ์—†์ด ์ž‘๋™.
  • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ: ์„ธ ๊ฐ€์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” Python ์Šคํฌ๋ฆฝํŠธ: ๋งˆ์ดํฌ ์˜ค๋””์˜ค ์บก์ฒ˜ โ†’ STT ์ „๋‹ฌ โ†’ ์ „์‚ฌ๋ณธ์„ LLM์— ์ „๋‹ฌ โ†’ ์‘๋‹ต์„ TTS์— ์ „๋‹ฌ โ†’ ์˜ค๋””์˜ค ์žฌ์ƒ.
  • ์„ ํƒ์  ์›จ์ดํฌ ์›Œ๋“œ: ํ•ญ์ƒ ํ™œ์„ฑํ™”๋œ ๊ฒฝ๋Ÿ‰ ๊ฐ์ง€๊ธฐ(OpenWakeWord, Porcupine)๋กœ ํ™œ์„ฑํ™” ๊ตฌ๋ฌธ์ด ๊ฐ์ง€๋  ๋•Œ๋งŒ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์—†์ด๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ whisper.cpp๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋” ๋งŽ์€ CPU๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ๋” ๋งŽ์€ ์˜คํƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ

์ง€์—ฐ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋„ค ๊ฐ€์ง€ ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€. ๋ชจ๋‘ Whisper + LLM + Piper์˜ ์ „์ฒด ์Šคํƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑSTT ๋ชจ๋ธLLM ๋ชจ๋ธTTS์ด ๋น„์šฉ์—”๋“œํˆฌ์—”๋“œ ์ง€์—ฐ์‹œ๊ฐ„
Raspberry Pi 5 (8 GB)Whisper base (CPU)Phi-3 mini 3.8B Q4Piper (CPU)~$1005โ€“8์ดˆ
๋ฏธ๋‹ˆ PC (16 GB RAM)Whisper small (CPU)Llama 3.3 8B Q4 (CPU)Piper (CPU)~$3003โ€“5์ดˆ
๋ฐ์Šคํฌํ†ฑ (RTX 3060 12 GB)Whisper large-v3 (GPU)Llama 3.3 8B Q4 (GPU)Piper ๋˜๋Š” Coqui (CPU/GPU)~$8001โ€“2์ดˆ
Mac Mini M5 (24 GB)Whisper large-v3 (Metal)Llama 3.3 8B (Metal)Piper (CPU)~$6001โ€“1.5์ดˆ

๐Ÿ’กTip: Mac Mini M5๋Š” 2์ดˆ ๋ฏธ๋งŒ์˜ ์ง€์—ฐ์‹œ๊ฐ„์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๋น„์šฉ ํšจ์œจ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์œ ํœด ์‹œ ์กฐ์šฉํ•˜๊ณ , Whisper Metal๊ณผ Ollama๋ฅผ ํ†ตํ•ฉ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉฐ, NVIDIA ๋“œ๋ผ์ด๋ฒ„ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

1๋‹จ๊ณ„: ์Œ์„ฑ ์ธ์‹ ์„ค์ •

Apple Silicon ๋ฐ ์ž„๋ฒ ๋””๋“œ ํ•˜๋“œ์›จ์–ด์—๋Š” whisper.cpp๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. NVIDIA GPU ์„ค์ •์—๋Š” faster-whisper๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • whisper.cpp ์„ค์น˜: git clone https://github.com/ggerganov/whisper.cpp && cd whisper.cpp && make -j4
  • ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ: bash ./models/download-ggml-model.sh small (small = 3.4% WER, ์†๋„์™€ ์ •ํ™•๋„์˜ ์ข‹์€ ๊ท ํ˜•)
  • ์ „์‚ฌ ํ…Œ์ŠคํŠธ: ./main -m models/ggml-small.bin -f test.wav โ€” ์ •ํ™•ํ•œ ํ…์ŠคํŠธ ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Mac์—์„œ Metal ํ™œ์„ฑํ™”: make -j4 WHISPER_COREML=1 ํ›„ bash models/generate-coreml-model.sh small
  • Whisper ๋ชจ๋ธ ์„ ํƒ: Raspberry Pi์—๋Š” base(1 GB RAM, ๋‚ฎ์€ ์ง€์—ฐ์‹œ๊ฐ„), ์ตœ์  ๊ท ํ˜•์—๋Š” small(2 GB RAM, 3.4% WER), ์ตœ๋Œ€ ์ •ํ™•๋„์—๋Š” large-v3(10 GB VRAM/RAM).
  • ์นจ๋ฌต ์–ต์ œ ์„ค์ •: ์นจ๋ฌต์„ ํ™˜๊ฐ ํ…์ŠคํŠธ๋กœ ์ „์‚ฌํ•˜์ง€ ์•Š๋„๋ก --no-speech-threshold 0.6 --suppress-blank ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • 10์ดˆ ๋…น์Œ์œผ๋กœ ํ…Œ์ŠคํŠธ: ํ…Œ์ŠคํŠธ ๊ตฌ๋ฌธ์„ ๋…น์Œํ•˜๊ณ  Whisper๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „์‚ฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Œ ํ™˜๊ฒฝ๊ณผ ์กฐ์šฉํ•œ ์Œ์„ฑ ๋ชจ๋‘์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

2๋‹จ๊ณ„: ๋กœ์ปฌ LLM ์„ค์ •

Ollama๋ฅผ ์„ค์น˜ํ•˜๊ณ  LLM ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ ๋™์ž‘์„ ์œ„ํ•œ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค โ€” ๋” ์งง์€ ์‘๋‹ต, ๋งˆํฌ๋‹ค์šด ์—†์Œ, ์ ์ ˆํ•œ ๊ฐœ์„ฑ.

  • Ollama ์„ค์น˜: ollama.com์—์„œ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. macOS, Linux, Windows์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 2๋ถ„ ๋ฏธ๋งŒ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ: ollama pull llama3.1:8b(๊ถŒ์žฅ) ๋˜๋Š” ollama pull phi4(16 GB RAM ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•œ ๋” ๊ฐ€๋ฒผ์šด ๋ชจ๋ธ).
  • ํ…Œ์ŠคํŠธ: ollama run llama3.1:8b "What is the capital of France?" โ€” ์‘๋‹ต์ด ์ •ํ™•ํ•˜๊ณ  ๋น ๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์Œ์„ฑ์šฉ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ: ์งง๊ณ  ์ง€์‹œ์ ์ธ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: "๋‹น์‹ ์€ ์œ ์šฉํ•œ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ์ž…๋‹ˆ๋‹ค. ์‘๋‹ต์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š” โ€” ์ตœ๋Œ€ 1โ€“3๋ฌธ์žฅ. ๋ชฉ๋ก, ๋งˆํฌ๋‹ค์šด, ์„œ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋Œ€ํ™”์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งํ•˜์„ธ์š”."
  • ์˜จ๋„: ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ์‹ค์ ์ธ ์‘๋‹ต์„ ์œ„ํ•ด ์˜จ๋„๋ฅผ 0.3โ€“0.5๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ์˜จ๋„๋Š” ์Œ์„ฑ ์‘๋‹ต์—์„œ ํ™˜๊ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€ ํ† ํฐ: --num-predict 150์œผ๋กœ ์‘๋‹ต ๊ธธ์ด๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค โ€” ๊ธด ์‘๋‹ต์€ TTS ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์Œ์„ฑ ์ƒํ˜ธ์ž‘์šฉ์—์„œ ๋ถ€์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

3๋‹จ๊ณ„: ์Œ์„ฑ ํ•ฉ์„ฑ ์„ค์ •

๋ชจ๋“  ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€์— Piper๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. Raspberry Pi๋ฅผ ํฌํ•จํ•œ CPU์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, 20๊ฐœ ์ด์ƒ์˜ ์–ธ์–ด ์Œ์„ฑ ํŒฉ์„ ๋ณด์œ ํ•˜๊ณ , GPU๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

  • Piper ์„ค์น˜: pip install piper-tts
  • ์Œ์„ฑ ๋‹ค์šด๋กœ๋“œ: piper --download-dir voices --update-voices --voice en_US-lessac-medium (๋˜๋Š” Hugging Face์˜ Piper ์Œ์„ฑ ํŽ˜์ด์ง€์—์„œ ์›ํ•˜๋Š” ์Œ์„ฑ).
  • ํ…Œ์ŠคํŠธ: echo "Hello, how can I help you today?" | piper --model voices/en_US-lessac-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -c 1
  • ์˜ค๋””์˜ค ์ถœ๋ ฅ: Piper๋Š” ์›์‹œ PCM ๋˜๋Š” WAV๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. aplay(Linux), afplay(Mac)๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ฑฐ๋‚˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์žฌ์ƒ์„ ์œ„ํ•ด Python sounddevice ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์•ˆ(๋” ์ข‹์€ ํ’ˆ์งˆ): Coqui VITS ๋ฐฑ์—”๋“œ โ€” pip install TTS ์„ค์น˜, tts --model_name tts_models/en/vctk/vits ์‚ฌ์šฉ. ~2 GB VRAM ํ•„์š”; Piper๋ณด๋‹ค 2โ€“3ร— ๋А๋ฆฌ์ง€๋งŒ ๋ˆˆ์— ๋„๊ฒŒ ๋” ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
  • ์Œ์„ฑ ์„ ํƒ: ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ์˜ ๊ฒฝ์šฐ ๊ณ ํ’ˆ์งˆ๋ณด๋‹ค ์ค‘๊ฐ„ ํ’ˆ์งˆ ์Œ์„ฑ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค โ€” ์ค‘๊ฐ„ ์Œ์„ฑ์ด ๋” ๋น ๋ฅด๊ณ  ์Šคํ”ผ์ปค๋ฅผ ํ†ตํ•œ ์ฐจ์ด๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๋‹จ๊ณ„: ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๊ฒฐ

Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ STT โ†’ LLM โ†’ TTS๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ๋งˆ์ดํฌ ์˜ค๋””์˜ค๋ฅผ ์บก์ฒ˜ํ•˜๊ณ , Whisper๋กœ ์ „์‚ฌํ•˜๊ณ , ์ „์‚ฌ๋ณธ์„ Ollama์— ๋ณด๋‚ด๊ณ , Piper๋กœ ์‘๋‹ต์„ ์Œ์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

python
#!/usr/bin/env python3
"""Minimal offline voice assistant: Whisper STT + Ollama LLM + Piper TTS."""

import subprocess
import tempfile
import sounddevice as sd
import soundfile as sf
import numpy as np
import requests
import json

SAMPLE_RATE = 16000
RECORD_SECONDS = 5
OLLAMA_URL = "http://localhost:11434/api/generate"
WHISPER_BIN = "./whisper.cpp/main"
WHISPER_MODEL = "./whisper.cpp/models/ggml-small.bin"
PIPER_BIN = "piper"
PIPER_VOICE = "voices/en_US-lessac-medium.onnx"
SYSTEM_PROMPT = (
    "You are a helpful voice assistant. Keep responses to 1-3 sentences. "
    "Never use markdown, bullet points, or formatting. Speak naturally."
)

conversation_history = []

def record_audio(seconds: int = RECORD_SECONDS) -> np.ndarray:
    print("Listening...")
    audio = sd.rec(int(seconds * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype="int16")
    sd.wait()
    return audio

def transcribe(audio: np.ndarray) -> str:
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        sf.write(f.name, audio, SAMPLE_RATE)
        result = subprocess.run(
            [WHISPER_BIN, "-m", WHISPER_MODEL, "-f", f.name, "--no-timestamps", "--no-prints"],
            capture_output=True, text=True
        )
    return result.stdout.strip()

def ask_llm(text: str) -> str:
    conversation_history.append({"role": "user", "content": text})
    response = requests.post(OLLAMA_URL, json={
        "model": "llama3.1:8b",
        "system": SYSTEM_PROMPT,
        "messages": conversation_history,
        "stream": False,
    })
    reply = response.json()["message"]["content"]
    conversation_history.append({"role": "assistant", "content": reply})
    return reply

def speak(text: str) -> None:
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        subprocess.run(
            f'echo "{text}" | {PIPER_BIN} --model {PIPER_VOICE} --output_file {f.name}',
            shell=True, check=True
        )
        data, sr = sf.read(f.name)
        sd.play(data, sr)
        sd.wait()

def main():
    print("Voice assistant ready. Press Ctrl+C to stop.")
    while True:
        audio = record_audio()
        transcript = transcribe(audio)
        if not transcript or len(transcript) < 3:
            continue
        print(f"You: {transcript}")
        response = ask_llm(transcript)
        print(f"Assistant: {response}")
        speak(response)

if __name__ == "__main__":
    main()

๐Ÿ“ŒNote: ์ด๊ฒƒ์€ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค โ€” ๊ณ ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์˜ค๋””์˜ค๋ฅผ ๋…น์Œํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๊ณ ์ • ์‹œ๊ฐ„ ๋Œ€์‹  ๋ง์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋…น์Œํ•˜๋Š” VAD(์Œ์„ฑ ํ™œ๋™ ๊ฐ์ง€)๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. faster-whisper์—๋Š” Silero VAD๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. whisper.cpp์˜ ๊ฒฝ์šฐ --stream ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Python webrtcvad ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ WebRTC VAD๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

5๋‹จ๊ณ„: ์›จ์ดํฌ ์›Œ๋“œ ๊ฐ์ง€

์›จ์ดํฌ ์›Œ๋“œ ๊ฐ์ง€๊ธฐ๋Š” ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ์„ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์„ ํƒํ•œ ๊ตฌ๋ฌธ์ด ๊ฐ์ง€๋  ๋•Œ๋งŒ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์—†์ด๋Š” Whisper๊ฐ€ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ๋” ๋งŽ์€ CPU/GPU๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ๋ฐฐ๊ฒฝ ์†Œ์Œ์—์„œ ๋” ๋งŽ์€ ์˜คํƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • OpenWakeWord(MIT ๋ผ์ด์„ ์Šค): ์™„์ „ ์˜คํ”ˆ์†Œ์Šค, CPU์—์„œ ์ž‘๋™, ์ž์ฒด ๊ตฌ๋ฌธ์œผ๋กœ ํŒŒ์ธํŠœ๋‹์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์›จ์ดํฌ ์›Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜: pip install openwakeword. Raspberry Pi์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ ์˜คํ”„๋ผ์ธ ์˜คํ”ˆ์†Œ์Šค ์„ค์ •์˜ ์ตœ์„  ์„ ํƒ.
  • Porcupine(Picovoice): ๋…์ ์ด์ง€๋งŒ ๊ฐœ์ธ ์‚ฌ์šฉ์— ๋ฌด๋ฃŒ ํ‹ฐ์–ด ์ œ๊ณต. ๋ฏธ๋ฆฌ ์ •์˜๋œ ์›จ์ดํฌ ์›Œ๋“œ์—๋Š” "Alexa", "Hey Siri", "Ok Google" ๋ฐ "Hey Jarvis" ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ต์…˜์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ์˜คํƒ์œจ๋กœ ๋งค์šฐ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜: pip install pvporcupine.
  • ํ†ตํ•ฉ ํŒจํ„ด: OpenWakeWord/Porcupine์„ ๋ฃจํ”„์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์›จ์ดํฌ ์›Œ๋“œ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด "๋”ฉ" ์†Œ๋ฆฌ๋ฅผ ์žฌ์ƒํ•˜๊ณ (์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ), ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด Whisper + LLM + TTS ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , TTS ์žฌ์ƒ ํ›„ ์›จ์ดํฌ ์›Œ๋“œ ๋“ฃ๊ธฐ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ์ง€์† ์ž‘๋™ ์ „๋ ฅ ์†Œ๋น„: ์›จ์ดํฌ ์›Œ๋“œ ๊ฐ์ง€๋Š” Raspberry Pi 5์—์„œ CPU์˜ ~2โ€“5%๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค โ€” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€. ์ตœ์†Œ ์ „๋ ฅ์œผ๋กœ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ 24/7 ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ์›จ์ดํฌ ์›Œ๋“œ(OpenWakeWord): ํ…์ŠคํŠธ ์Œ์„ฑ ํ•ฉ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑํ™” ๊ตฌ๋ฌธ์˜ ์–‘์„ฑ ์˜ค๋””์˜ค ์˜ˆ์ œ 500๊ฐœ์™€ ์Œ์„ฑ ์˜ค๋””์˜ค ์˜ˆ์ œ 500๊ฐœ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ CPU์—์„œ 30๋ถ„ ๋ฏธ๋งŒ์— OpenWakeWord๋ฅผ ํŒŒ์ธํŠœ๋‹ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•๋„๋Š” ์ผ๋ฐ˜ ์˜์–ด ๋‹จ์–ด์—์„œ Porcupine๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ์‹œ๊ฐ„ ์ตœ์ ํ™”

1โ€“2์ดˆ ๋ชฉํ‘œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์„ค์ •์œผ๋กœ ๋ฐ์Šคํฌํ†ฑ ํ•˜๋“œ์›จ์–ด์—์„œ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ์‹œ๊ฐ„์€ ์„ธ ๋ ˆ์ด์–ด์— ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค:

๐Ÿ“ ํ•œ ๋ฌธ์žฅ์œผ๋กœ

STT๊ฐ€ 0.2โ€“0.5์ดˆ, LLM ์ฒซ ํ† ํฐ ์ง€์—ฐ์‹œ๊ฐ„์ด 0.5โ€“1.5์ดˆ, TTS๊ฐ€ 0.1โ€“0.3์ดˆ โ€” ๋ฐ์Šคํฌํ†ฑ GPU์—์„œ ์ด 1โ€“2์ดˆ.

๐Ÿ’ฌ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด

LLM์ด ๊ฐ€์žฅ ํฐ ๋ณ‘๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์ตœ์ ํ™”๋Š” LLM์ด ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ TTS ์ถœ๋ ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€” LLM์ด ์“ฐ๊ธฐ๋ฅผ ๋งˆ์น˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ์‘๋‹ต์„ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • STT ์ตœ์ ํ™”(~0.2โ€“0.5์ดˆ): large-v3 ๋Œ€์‹  Whisper small์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. VAD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Whisper์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์นจ๋ฌต์„ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค โ€” ์˜ค๋””์˜ค๊ฐ€ ์งง์„์ˆ˜๋ก ์ „์‚ฌ๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • LLM ์ตœ์ ํ™”(~0.5โ€“1.5์ดˆ ์ฒซ ํ† ํฐ): ์‹œ์ž‘ ์‹œ ๋ชจ๋ธ์„ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค(Ollama๊ฐ€ ์ž๋™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ์†๋„์™€ ํ’ˆ์งˆ ์‚ฌ์ด์˜ ์ตœ์  ๊ท ํ˜•์„ ์œ„ํ•ด Q4_K_M ์–‘์žํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด --num-predict 100โ€“150์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • LLM โ†’ TTS ์ŠคํŠธ๋ฆฌ๋ฐ: LLM ์ถœ๋ ฅ์„ ํ† ํฐ ๋‹จ์œ„๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์™„์ „ํ•œ ๋ฌธ์žฅ์—์„œ(๋งˆ์นจํ‘œ ๋˜๋Š” ๋ฌผ์Œํ‘œ๋กœ ๊ฐ์ง€) TTS๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธ์ง€๋œ ์ง€์—ฐ์‹œ๊ฐ„์„ 0.3โ€“0.7์ดˆ ์ค„์ž…๋‹ˆ๋‹ค โ€” LLM์ด ๋๋ถ€๋ถ„์„ ๊ณ„์† ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์‘๋‹ต์˜ ์‹œ์ž‘์„ ๋“ฃ์Šต๋‹ˆ๋‹ค.
  • TTS ์ตœ์ ํ™”(~0.1โ€“0.3์ดˆ): Piper๋Š” 50ms์— ์ฒซ ์˜ค๋””์˜ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ Piper๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํŒŒ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์˜ค๋””์˜ค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด --output-raw๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€: Ollama๋Š” ์ž๋™์œผ๋กœ ๋ชจ๋ธ์„ VRAM์—์„œ ๋”ฐ๋œปํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ๋ชจ๋“œ์—์„œ ๋กœ๋“œ๋œ whisper.cpp๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๊ฐ„์— ๋ชจ๋ธ ์žฌ๋กœ๋“œ๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€๋ณ„ ๋ชฉํ‘œ ์ง€์—ฐ์‹œ๊ฐ„: Pi 5: 5โ€“8์ดˆ(๋น„๋Œ€ํ™”์  ์‚ฌ์šฉ์— ํ—ˆ์šฉ). ๋ฏธ๋‹ˆ PC CPU: 3โ€“5์ดˆ(๋Œ€ํ™” ํ•œ๊ณ„). ๋ฐ์Šคํฌํ†ฑ GPU: 1โ€“2์ดˆ(์ž์—ฐ์Šค๋Ÿฌ์›€). Mac M5: 1โ€“1.5์ดˆ(์šฐ์ˆ˜).

ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์กฐ๋ฆฝ๋œ ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ์ž‘๋™ ์ค‘์— ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋””์˜ค ์บก์ฒ˜, ์Œ์„ฑ ์ธ์‹, LLM ์ถ”๋ก , TTS๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ์ž์ฒด ํ•˜๋“œ์›จ์–ด์—์„œ ์™„์ „ํžˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Wireshark๋กœ ํ™•์ธ: ์–ด์‹œ์Šคํ„ดํŠธ์™€ ๋Œ€ํ™”ํ•˜๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ Wireshark๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์–ด์‹œ์Šคํ„ดํŠธ ํ”„๋กœ์„ธ์Šค์—์„œ ํŒจํ‚ท์ด ๋‚˜์˜ค์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํŠธ๋ž˜ํ”ฝ์€ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค โ€” ๊ณต์ธ IP๊ฐ€ ์žˆ๋‹ค๋ฉด Ollama ์™ธ๋ถ€ API๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ์˜ค๋””์˜ค ์ €์žฅ ์—†์Œ: whisper.cpp์™€ faster-whisper ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์˜ Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” whisper.cpp๋ฅผ ์œ„ํ•ด ์ž„์‹œ WAV ํŒŒ์ผ์„ ์”๋‹ˆ๋‹ค. ์ „์‚ฌ ํ›„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€ํ™” ๊ธฐ๋ก ์ €์žฅ ์—†์Œ: ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ์˜ ๋Œ€ํ™” ๊ธฐ๋ก์€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์žˆ์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ ์žฌ์‹œ์ž‘ ์‹œ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ ๊ธฐ๋ก์„ ์œ„ํ•ด์„œ๋Š” ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ €์žฅ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…์‹œ์ ์ธ ์ €์žฅ์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
  • GDPR ์ค€์ˆ˜: ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋กœ์ปฌ์ด๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋– ๋‚˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณ„์•ฝ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ œ3์ž์™€์˜ ์ปจํŠธ๋กค๋Ÿฌ/ํ”„๋กœ์„ธ์„œ ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ: ์ตœ๋Œ€ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ„ํ•ด ์–ด์‹œ์Šคํ„ดํŠธ ํ”„๋กœ์„ธ์Šค์˜ ์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Ollama์™€ whisper.cpp๋Š” ๋ชจ๋ธ์ด ๋‹ค์šด๋กœ๋“œ๋œ ํ›„ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ์Šค๋งˆํŠธ ํ™ˆ ์ œ์–ด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ์— ๋กœ์ปฌ API๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Home Assistant(HASS)๋Š” ํ›Œ๋ฅญํ•œ ๋กœ์ปฌ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค โ€” LLM์ด ๋ช…๋ น์„ ํ•ด์„ํ•œ ํ›„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์—์„œ HASS REST API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LLM์€ ์˜๋„ ํŒŒ์„œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค: "๊ฑฐ์‹ค ์กฐ๋ช… ์ผœ์ค˜" โ†’ ๊ตฌ์กฐํ™”๋œ JSON โ†’ HASS API ํ˜ธ์ถœ. ๋กœ์ปฌ API ์ง€์› ์—†์ด ๋…์  ํด๋ผ์šฐ๋“œ ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ(Ring, Nest, ํด๋ผ์šฐ๋“œ Philips Hue)์€ ์ธํ„ฐ๋„ท ์—†์ด ๋กœ์ปฌ๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ๋ช‡ ๊ฐœ์˜ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

Whisper๋Š” ์Œ์„ฑ ์ธ์‹์—์„œ 99๊ฐœ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Piper๋Š” TTS์—์„œ 20๊ฐœ ์ด์ƒ์˜ ์Œ์„ฑ ํŒฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. LLM ์–ธ์–ด ์ง€์›์€ ๋ชจ๋ธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค โ€” Llama 3.3 8B๋Š” ์˜์–ด, ํ”„๋ž‘์Šค์–ด, ๋…์ผ์–ด, ์ŠคํŽ˜์ธ์–ด, ์ดํƒˆ๋ฆฌ์•„์–ด, ํฌ๋ฅดํˆฌ๊ฐˆ์–ด์™€ ์•ฝ๊ฐ„์˜ ์ผ๋ณธ์–ด/์ค‘๊ตญ์–ด๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋œ ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์–ธ์–ด๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค(์˜ˆ: Mistral Small์€ ์œ ๋Ÿฝ ์–ธ์–ด๋ฅผ ์ž˜ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค).

2์ดˆ ๋ฏธ๋งŒ์˜ ์ง€์—ฐ์‹œ๊ฐ„์„ ์œ„ํ•œ ์ตœ์†Œ ํ•˜๋“œ์›จ์–ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Mac Mini M5(24 GB, ~$600) ๋˜๋Š” NVIDIA RTX 3060 12 GB๊ฐ€ ์žˆ๋Š” ๋ฐ์Šคํฌํ†ฑ(GPU ~$400, ์ด ~$800) ๋ชจ๋‘ 1โ€“2์ดˆ์˜ ์ง€์—ฐ์‹œ๊ฐ„์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์š”๊ตฌ์‚ฌํ•ญ์€: Llama 3.3 8B Q4๋ฅผ ์œ„ํ•œ GPU์— 8+ GB VRAM, Whisper๋ฅผ ์œ„ํ•œ Metal ๋˜๋Š” CUDA ๊ฐ€์†. CPU๋งŒ ์žˆ๋Š” 16 GB RAM ์„ค์ •(๋ฏธ๋‹ˆ PC, ~$300)์€ 3โ€“5์ดˆ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค โ€” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ "์ž์—ฐ์Šค๋Ÿฌ์šด ๋А๋‚Œ" ์ž„๊ณ„๊ฐ’ ๋ฏธ๋งŒ.

Whisper + LLM + Piper ํŒŒ์ดํ”„๋ผ์ธ์ด Windows์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. whisper.cpp์—๋Š” cmake์™€ Visual Studio๋ฅผ ์‚ฌ์šฉํ•œ Windows ๋นŒ๋“œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Ollama๋Š” NVIDIA GPU ์ง€์›๊ณผ ํ•จ๊ป˜ Windows 10/11์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Piper์—๋Š” Windows์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Python ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ์˜ค๋””์˜ค ์บก์ฒ˜๋ฅผ ์œ„ํ•ด sounddevice๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Windows์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Windows์˜ ์ฃผ์š” ๋ณต์žก์„ฑ์€ ์†Œ์Šค์—์„œ whisper.cpp๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€” ๋Œ€์•ˆ์œผ๋กœ Windows์—์„œ NVIDIA GPU์™€ ํ•จ๊ป˜ faster-whisper(pip install, ์ปดํŒŒ์ผ ๋ถˆํ•„์š”)๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ์— ์›น ๊ฒ€์ƒ‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์— ๋กœ์ปฌ ๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์›น ๊ฒ€์ƒ‰์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜: (1) ์ผ๋ฐ˜ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด DuckDuckGo API(๋ฌด๋ฃŒ, ๊ณ„์ • ์—†์Œ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค โ€” ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  LLM ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. (2) ํ˜„์žฌ ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•ด ๋กœ์ปฌ ๋‰ด์Šค RSS ํ”ผ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (3) ๋„๋ฉ”์ธ๋ณ„ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์ž์ฒด ๋ฌธ์„œ ์ปฌ๋ ‰์…˜๊ณผ ํ•จ๊ป˜ ๋กœ์ปฌ RAG ์‹œ์Šคํ…œ(AnythingLLM, PrivateGPT)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. LLM์€ ๊ฒ€์ƒ‰๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์ง€์—ฐ์‹œ๊ฐ„์ด 0.5โ€“2์ดˆ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜

  • GitHub์˜ whisper.cpp โ€” ์†Œ์Šค ์ฝ”๋“œ, ๋นŒ๋“œ ์ง€์นจ, ์ŠคํŠธ๋ฆผ ๋ชจ๋“œ ๋ฌธ์„œ.
  • ollama.com์˜ Ollama โ€” ์„ค์น˜, ๋ชจ๋ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, API ์ฐธ์กฐ.
  • GitHub์˜ Piper TTS โ€” ์†Œ์Šค ์ฝ”๋“œ, ์Œ์„ฑ ํŒฉ ๋‹ค์šด๋กœ๋“œ, Raspberry Pi ์„ค์ • ๊ฐ€์ด๋“œ.
  • GitHub์˜ OpenWakeWord โ€” ์†Œ์Šค ์ฝ”๋“œ, ์‚ฌ์šฉ์ž ์ •์˜ ์›จ์ดํฌ ์›Œ๋“œ ํ›ˆ๋ จ ๊ฐ€์ด๋“œ, ์ง€์›๋˜๋Š” ์•„ํ‚คํ…์ฒ˜.
  • Picovoice์˜ Porcupine โ€” ์›จ์ดํฌ ์›Œ๋“œ SDK, ๋ฌด๋ฃŒ ํ‹ฐ์–ด ์กฐ๊ฑด, Python SDK ๋ฌธ์„œ.
  • Picovoice Console โ€” ๊ฐœ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•œ Porcupine ๋ฌด๋ฃŒ API ํ‚ค ์ƒ์„ฑ.

โ† ๊ณ ๊ธ‰ ๋กœ์ปฌ LLM์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

2026๋…„ ๋กœ์ปฌ ์Œ์„ฑ ์–ด์‹œ์Šคํ„ดํŠธ: Whisper + LLM + Piper TTS | PromptQuorum