feat: switch llm to local ollama qwen3

This commit is contained in:
2026-04-30 02:53:00 +09:00
parent 23bc534b23
commit 24aa58fc42
12 changed files with 136 additions and 91 deletions

View File

@@ -1,6 +1,6 @@
# realtime_voice_bot
디스코드 음성 채널 또는 로컬 PC 마이크/스피커에서 한국어 음성을 인식하고, LLM 응답을 생성한 뒤 ElevenLabs TTS로 다시 읽어주는 최소 프로토타입입니다.
디스코드 음성 채널 또는 로컬 PC 마이크/스피커에서 한국어 음성을 인식하고, 로컬 LLM 응답을 생성한 뒤 ElevenLabs TTS로 다시 읽어주는 최소 프로토타입입니다.
## 현재 구현 범위
@@ -10,7 +10,7 @@
- 48k stereo PCM을 16k mono로 내려서 유저별 VAD 처리
- Silero 계열 VAD(`avr-vad`)로 발화 시작/종료 감지
- ElevenLabs Scribe Realtime WebSocket으로 발화 단위 STT
- OpenAI Responses API로 짧은 한국어 답변 생성
- Ollama 로컬 LLM으로 짧은 한국어 답변 생성
- ElevenLabs Flash v2.5 스트리밍 TTS
- 채널 단위 단일 재생 큐
- 사용자 발화 시작 시 현재 TTS와 대기열 중단(barge-in)
@@ -19,9 +19,9 @@
- Bun `1.3+`
- Node.js `22.12+`
- Ollama
- Discord bot with Voice permissions
- ElevenLabs API key + 사용할 Voice ID
- OpenAI API key
## 환경 변수
@@ -29,7 +29,6 @@
필수:
- `OPENAI_API_KEY`
- `ELEVENLABS_API_KEY`
- `ELEVENLABS_VOICE_ID`
@@ -42,14 +41,21 @@ Discord 모드에서만 필수:
- `DISCORD_COMMAND_GUILD_ID`
- 테스트 서버에만 slash command를 즉시 반영하려면 설정
- `OLLAMA_BASE_URL`
- 기본값: `http://localhost:11434`
- `OLLAMA_MODEL`
- 기본값: `qwen3:0.6b`
- 가장 빠른 무료 오픈웨이트 로컬 기본값
- `OLLAMA_KEEP_ALIVE`
- 기본값: `5m`
- `OLLAMA_NUM_CTX`
- 기본값: `4096`
- `LOCAL_AUDIO_SOURCE`
- `pw-record --target` 에 넣을 PipeWire source id 또는 node name
- `LOCAL_AUDIO_SINK`
- `pw-play --target` 에 넣을 PipeWire sink id 또는 node name
- `LOCAL_SPEAKER_NAME`
- 로컬 테스트에서 프롬프트에 넣을 화자 이름
- `OPENAI_MODEL`
- 기본값: `gpt-5.4-mini`
- `ELEVENLABS_STT_MODEL`
- 기본값: `scribe_v2_realtime`
- `ELEVENLABS_TTS_MODEL`
@@ -63,6 +69,20 @@ Discord 모드에서만 필수:
bun install
```
Ollama 준비:
```bash
ollama pull qwen3:0.6b
```
속도보다 품질이 더 중요하면:
```bash
ollama pull qwen3:1.7b
# 또는
ollama pull qwen3:4b
```
디스코드 모드:
```bash
@@ -98,7 +118,8 @@ bun run check
로컬 테스트:
1. `bun run audio:devices` 로 source/sink id 또는 이름 확인
2. 필요하면 `.env``LOCAL_AUDIO_SOURCE`, `LOCAL_AUDIO_SINK` 설정
2. `ollama pull qwen3:0.6b`
3. 필요하면 `.env``LOCAL_AUDIO_SOURCE`, `LOCAL_AUDIO_SINK`, `OLLAMA_MODEL` 설정
3. `bun run start:local`
4. 마이크로 바로 말해서 응답 확인
@@ -108,4 +129,5 @@ bun run check
- 출력은 길드 세션당 단일 큐
- 로컬 모드는 단일 화자 입력 기준
- 화자 구분은 `speaker_id`, `speaker_name`을 LLM 프롬프트에 항상 포함
- 최소 프로토타입이므로 Deepgram 대체 STT, 장기 메모리, 고급 명령 라우팅은 아직 포함하지 않았습니다.
- 현재 기본 LLM은 `qwen3:0.6b` 이며 속도 우선 설정이라 답변 품질이 약하면 `qwen3:1.7b` 또는 `qwen3:4b` 로 올리는 것을 권장합니다.
- STT/TTS는 아직 ElevenLabs API를 사용하므로 프로젝트 전체가 완전 무과금은 아닙니다.