ํต์ฌ ์์
- ์คํ๋ผ์ธ ์์ฑ ์ด์์คํดํธ ์คํ์: 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 Q4 | Piper (CPU) | ~$100 | 5โ8์ด |
| ๋ฏธ๋ PC (16 GB RAM) | Whisper small (CPU) | Llama 3.3 8B Q4 (CPU) | Piper (CPU) | ~$300 | 3โ5์ด |
| ๋ฐ์คํฌํฑ (RTX 3060 12 GB) | Whisper large-v3 (GPU) | Llama 3.3 8B Q4 (GPU) | Piper ๋๋ Coqui (CPU/GPU) | ~$800 | 1โ2์ด |
| Mac Mini M5 (24 GB) | Whisper large-v3 (Metal) | Llama 3.3 8B (Metal) | Piper (CPU) | ~$600 | 1โ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)๋ก ๋ฆฌ๋๋ ์ ํ๊ฑฐ๋ ํฌ๋ก์ค ํ๋ซํผ ์ฌ์์ ์ํด Pythonsounddevice๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ๋์(๋ ์ข์ ํ์ง): 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๋ก ์๋ต์ ์์ฑ์ผ๋ก ๋ณํํ๊ณ , ์ฌ์ํฉ๋๋ค.
#!/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 ํค ์์ฑ.