verbalcoding 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/docs/RELEASE.md +4 -2
- package/docs/i18n/CONFIGURATION.ko.md +191 -0
- package/docs/i18n/FRESH_INSTALL.ko.md +193 -0
- package/docs/i18n/MULTI_INSTANCE.ko.md +179 -0
- package/docs/i18n/README.ko.md +68 -32
- package/docs/i18n/RELEASE.ko.md +72 -0
- package/docs/i18n/USAGE.ko.md +119 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -107,6 +107,7 @@ flowchart LR
|
|
|
107
107
|
| [Configuration](docs/CONFIGURATION.md) | `.env`, agent backends, MCP, TTS backends, operational notes |
|
|
108
108
|
| [Multi-Instance](docs/MULTI_INSTANCE.md) | One permanent Discord voice room per project |
|
|
109
109
|
| [Release Notes](docs/RELEASE.md) | Current capabilities and pre-release checklist |
|
|
110
|
+
| [한국어 문서](docs/i18n/README.ko.md) | npm 설치, 사용법, 설정, 멀티 인스턴스 한국어 가이드 |
|
|
110
111
|
|
|
111
112
|
## Tiny Command Map
|
|
112
113
|
|
|
@@ -154,4 +155,4 @@ vc doctor
|
|
|
154
155
|
|
|
155
156
|
## Status
|
|
156
157
|
|
|
157
|
-
VerbalCoding is public-release oriented but still early. Demo video/GIF, broader Linux
|
|
158
|
+
VerbalCoding is public-release oriented but still early. Demo video/GIF, broader Linux validation, CI, and deeper security review are still TODOs.
|
package/docs/RELEASE.md
CHANGED
|
@@ -22,6 +22,7 @@ VerbalCoding is a Discord voice bridge for controlling CLI-based coding agents b
|
|
|
22
22
|
- Diff/code/log guardrails so large technical output is not read aloud.
|
|
23
23
|
- Normal and conservative sensitivity modes for indoor vs. noisy/outdoor use.
|
|
24
24
|
- Setup wizard, `.env.example`, `vc doctor` prerequisite checker, and `./scripts/install.sh --yes` bootstrap for OS packages, npm dependencies, Edge TTS helper, and the default whisper.cpp model.
|
|
25
|
+
- npm package install path: `npm install -g verbalcoding`, `vc setup --yes`, and `vc start`.
|
|
25
26
|
- Optional verbose progress mode for text-only middle-step updates during long agent work.
|
|
26
27
|
- Always-on JSONL latency metrics plus `!latency` / `!metrics` summary for pipeline optimization.
|
|
27
28
|
- Lower default utterance idle wait (`UTTERANCE_IDLE_MS=2000`) so STT starts about 0.6s sooner after speech ends.
|
|
@@ -38,14 +39,15 @@ node --check app-node/main.mjs app-node/agent_adapters.mjs app-node/install_conf
|
|
|
38
39
|
npm test
|
|
39
40
|
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q || [ $? -eq 5 ] # ok when no Python tests exist
|
|
40
41
|
bash -n run.sh scripts/install.sh scripts/bootstrap_prereqs.sh scripts/docker_ubuntu_smoke.sh
|
|
42
|
+
npm pack --dry-run
|
|
41
43
|
vc doctor
|
|
42
44
|
git diff --check
|
|
43
45
|
```
|
|
44
46
|
|
|
45
47
|
Manual smoke test:
|
|
46
48
|
|
|
47
|
-
1. Start the bridge with `./run.sh`.
|
|
48
|
-
2. Verify log contains `Logged in as
|
|
49
|
+
1. Start the bridge with `vc start` or `./run.sh`.
|
|
50
|
+
2. Verify log contains `Logged in as <bot-name>`.
|
|
49
51
|
3. Verify log contains `Listening in voice channel ... / 일반` or the configured default channel.
|
|
50
52
|
4. In Discord, run `!ping`.
|
|
51
53
|
5. In Discord voice, say a short Korean request.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# VerbalCoding 설정 가이드
|
|
2
|
+
|
|
3
|
+
## 설정 마법사
|
|
4
|
+
|
|
5
|
+
npm으로 설치한 경우:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
vc setup --yes
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
GitHub 클론에서 직접 실행하는 경우:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
./scripts/install.sh --yes
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
설치기는 Discord 토큰, 허용 사용자, 자동 입장 음성 채널 이름, transcript 채널/스레드, CLI 하네스 백엔드, 기본 음성 언어, TTS 설정, wake word 동작을 묻습니다. 결과는 권한 `0600`의 `.env`에 저장되며, `.env`는 git에서 무시됩니다. 클론 설치에서는 짧은 셸 명령 `vc`도 연결합니다.
|
|
18
|
+
|
|
19
|
+
수동 설치 후 셸 명령만 연결하려면:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm link
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 지원 에이전트 백엔드
|
|
26
|
+
|
|
27
|
+
`.env`에서 `AGENT_BACKEND`를 설정합니다.
|
|
28
|
+
|
|
29
|
+
| 백엔드 | 기본 명령 | 메모 |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `hermes` | `hermes chat -Q -q` | 기본값. `.verbalcoding-session` resume 동작을 유지합니다. |
|
|
32
|
+
| `claude-code` / `claude` | `claude -p` | `CLAUDE_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
|
|
33
|
+
| `codex` | `codex exec` | `CODEX_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
|
|
34
|
+
| `gemini` | `gemini -p` | `GEMINI_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
|
|
35
|
+
| `opencode` | `opencode run` | `OPENCODE_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
|
|
36
|
+
| `openclaw` | `openclaw run` | `OPENCLAW_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
|
|
37
|
+
| `custom` | `AGENT_COMMAND` 필수 | 사용자 prompt가 마지막 argv 인자로 붙습니다. |
|
|
38
|
+
|
|
39
|
+
공통 override 예시:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
AGENT_BACKEND=custom
|
|
43
|
+
AGENT_LABEL="My Harness"
|
|
44
|
+
AGENT_COMMAND="my-harness run --non-interactive"
|
|
45
|
+
AGENT_TASK_TIMEOUT_MS=0
|
|
46
|
+
AGENT_CHAT_TIMEOUT_MS=45000
|
|
47
|
+
AGENT_VERBOSE_PROGRESS=0
|
|
48
|
+
UTTERANCE_IDLE_MS=2000
|
|
49
|
+
LATENCY_LOG_PATH=./.logs/latency.jsonl
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 에이전트 어댑터 계약
|
|
53
|
+
|
|
54
|
+
음성 브릿지는 모든 백엔드와 하나의 어댑터 계약으로 통신합니다.
|
|
55
|
+
|
|
56
|
+
- `run({ text }, signal, plan)`은 상태, 최종 답변 텍스트, 백엔드 라벨, elapsed time, 선택적 세션 metadata를 반환합니다.
|
|
57
|
+
- `ask(text, signal, plan)`은 호환용 단축 함수이며 최종 답변 텍스트만 반환합니다.
|
|
58
|
+
- `capabilities`는 해당 백엔드가 session resume, streaming progress, cancellation을 지원하는지 선언합니다.
|
|
59
|
+
- Hermes는 기준 어댑터입니다. resume, verbose progress streaming, cancellation, Hermes 세션 파일에서 최종 답변 복구를 지원합니다.
|
|
60
|
+
|
|
61
|
+
새 백엔드는 같은 계약을 구현하고, voice/STT/TTS 동작은 어댑터 밖에 유지하는 것이 좋습니다.
|
|
62
|
+
|
|
63
|
+
## 예시 `.env`
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
DISCORD_BOT_TOKEN="***"
|
|
67
|
+
DISCORD_ALLOWED_USERS="123456789012345678"
|
|
68
|
+
AUTO_JOIN_VOICE_CHANNELS="일반,General,general"
|
|
69
|
+
TRANSCRIPT_CHANNEL_ID="123456789012345678"
|
|
70
|
+
|
|
71
|
+
AGENT_BACKEND="hermes"
|
|
72
|
+
STT_ENGINE="whisper_cpp"
|
|
73
|
+
WHISPER_CPP_BIN="whisper-cli"
|
|
74
|
+
WHISPER_CPP_MODEL="./models/ggml-small-q5_1.bin"
|
|
75
|
+
|
|
76
|
+
TTS_BACKEND="edge"
|
|
77
|
+
TTS_VOICE="ko-KR-SunHiNeural"
|
|
78
|
+
TTS_RATE="+10%"
|
|
79
|
+
TTS_MAX_CHARS="495"
|
|
80
|
+
TTS_VOLUME="1.0"
|
|
81
|
+
|
|
82
|
+
REQUIRE_WAKE_WORD="0"
|
|
83
|
+
MIN_UTTERANCE_SECONDS="1.0"
|
|
84
|
+
UTTERANCE_IDLE_MS="2000"
|
|
85
|
+
HERMES_TASK_TIMEOUT_MS="0"
|
|
86
|
+
HERMES_CHAT_TIMEOUT_MS="45000"
|
|
87
|
+
AGENT_VERBOSE_PROGRESS="0"
|
|
88
|
+
LATENCY_LOG_PATH="./.logs/latency.jsonl"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## MCP 서버
|
|
92
|
+
|
|
93
|
+
VerbalCoding은 stdio MCP 서버를 포함합니다. Hermes Agent 또는 MCP client는 자유 형식 shell 명령 대신 도구로 브릿지를 제어할 수 있습니다.
|
|
94
|
+
|
|
95
|
+
Hermes 설정 예시:
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
mcp_servers:
|
|
99
|
+
verbalcoding:
|
|
100
|
+
command: "node"
|
|
101
|
+
args: ["/path/to/VerbalCoding/scripts/mcp-server.mjs"]
|
|
102
|
+
timeout: 120
|
|
103
|
+
connect_timeout: 30
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
노출되는 MCP 도구:
|
|
107
|
+
|
|
108
|
+
| 도구 | 용도 |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `status` | 비밀값 없이 브릿지/설정 상태 보고 |
|
|
111
|
+
| `doctor` | 비밀값을 숨긴 doctor 점검 실행 |
|
|
112
|
+
| `set_auto_restart` | 커밋 시 음성 봇 자동 재시작 켜기/끄기 |
|
|
113
|
+
| `set_language` | STT/진행/TTS 언어를 함께 변경 |
|
|
114
|
+
| `start`, `stop`, `restart` | Discord 음성 브릿지 제어 |
|
|
115
|
+
|
|
116
|
+
## 선택: OpenVoice TTS
|
|
117
|
+
|
|
118
|
+
Edge TTS가 기본값이자 fallback입니다. OpenVoice V2로 로컬 음성 복제를 시험하려면:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
./scripts/setup_openvoice.sh
|
|
122
|
+
# OpenVoice 문서에서 checkpoints_v2_0417.zip을 받아 vendor/OpenVoice/checkpoints_v2/ 아래에 풉니다.
|
|
123
|
+
mkdir -p voice-samples
|
|
124
|
+
# 허가된 기준 샘플을 voice-samples/user-reference.wav에 넣거나,
|
|
125
|
+
# Discord에서 !voice-clone capture로 샘플을 캡처합니다.
|
|
126
|
+
python3 scripts/openvoice_smoke.py
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
그 뒤 설정:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
TTS_BACKEND="openvoice"
|
|
133
|
+
OPENVOICE_REF_AUDIO="./voice-samples/user-reference.wav"
|
|
134
|
+
OPENVOICE_PROGRESS="0"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
본인 소유이거나 사용 허가를 받은 목소리만 복제하세요. OpenVoice가 실패하거나 timeout되면 VerbalCoding은 Edge TTS로 fallback합니다.
|
|
138
|
+
|
|
139
|
+
## 선택: Supertonic TTS
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
./scripts/setup_supertonic.sh
|
|
143
|
+
supertonic tts '안녕하세요. 수퍼토닉 테스트입니다.' --lang ko --voice M1 --steps 2 --speed 1.0 -o /tmp/verbalcoding-supertonic.wav
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
그 뒤 설정:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
TTS_BACKEND="supertonic"
|
|
150
|
+
SUPERTONIC_COMMAND="./.venv-supertonic/bin/supertonic"
|
|
151
|
+
SUPERTONIC_VOICE="M1"
|
|
152
|
+
SUPERTONIC_LANGUAGE="ko"
|
|
153
|
+
SUPERTONIC_STEPS="2"
|
|
154
|
+
SUPERTONIC_SPEED="1.0"
|
|
155
|
+
SUPERTONIC_PROGRESS="0"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Supertonic이 없거나 실패하거나 timeout되면 VerbalCoding은 Edge TTS로 fallback합니다.
|
|
159
|
+
|
|
160
|
+
## 선택: SpeechSwift / CosyVoice TTS
|
|
161
|
+
|
|
162
|
+
Apple Silicon에서는 `speech-swift`가 MLX-native CosyVoice/Qwen3-TTS 기반 한국어 음성 복제용 로컬 백엔드로 동작할 수 있습니다.
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
brew tap soniqo/speech https://github.com/soniqo/speech-swift
|
|
166
|
+
brew install speech
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
권장 env:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
TTS_BACKEND="speechswift"
|
|
173
|
+
SPEECHSWIFT_MODE="server"
|
|
174
|
+
SPEECHSWIFT_ENGINE="cosyvoice"
|
|
175
|
+
SPEECHSWIFT_LANGUAGE="korean"
|
|
176
|
+
SPEECHSWIFT_REF_AUDIO="./voice-samples/user-reference.wav"
|
|
177
|
+
SPEECHSWIFT_SERVER_HOST="127.0.0.1"
|
|
178
|
+
SPEECHSWIFT_SERVER_PORT="18080"
|
|
179
|
+
SPEECHSWIFT_SERVER_URL="http://127.0.0.1:18080"
|
|
180
|
+
SPEECHSWIFT_PROGRESS="0"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
빠른 진행/짧은 backchannel prompt는 Edge를 유지하는 편이 안전합니다.
|
|
184
|
+
|
|
185
|
+
## 운영 메모
|
|
186
|
+
|
|
187
|
+
- 텍스트 명령을 쓰려면 Discord bot의 privileged Message Content intent가 켜져 있어야 합니다.
|
|
188
|
+
- 봇에는 음성 채널 connect/speak 권한이 필요합니다.
|
|
189
|
+
- Hermes Agent를 쓴다면 기본 프로필에서 Hermes를 정상 설정/인증하세요. 예: `hermes setup`, `hermes login` 등.
|
|
190
|
+
- Claude Code, Codex, Gemini, OpenCode, OpenClaw를 쓰려면 해당 CLI를 별도로 설치하고 인증하세요.
|
|
191
|
+
- CLI가 timeout 또는 signal 실패 중 diff/code를 출력하면 브릿지는 그 내용을 음성으로 읽지 않고 자세한 텍스트로만 보냅니다.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# VerbalCoding 새 설치 가이드
|
|
2
|
+
|
|
3
|
+
이 문서는 공개 npm 패키지 또는 깨끗한 GitHub 클론에서 처음 설치하는 흐름을 설명합니다. 로컬 전용 가정을 피하고, 설치 스크립트가 가능한 한 많은 준비 작업을 자동화하도록 구성돼 있습니다.
|
|
4
|
+
|
|
5
|
+
## 1. CLI 설치
|
|
6
|
+
|
|
7
|
+
권장 npm 설치:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g verbalcoding
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
전역 설치 없이 바로 실행하려면:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx verbalcoding setup --yes
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
전역 설치를 했다면 이어서:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
vc setup --yes
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
기여자용 GitHub 클론 경로:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
git clone https://github.com/ca1773130n/VerbalCoding.git
|
|
29
|
+
cd VerbalCoding
|
|
30
|
+
./scripts/install.sh --yes
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 2. 의존성 부트스트랩과 설정 마법사
|
|
34
|
+
|
|
35
|
+
npm 명령은 클론 설치와 같은 부트스트래퍼를 실행합니다. 클론에서는 다음을 실행합니다.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
./scripts/install.sh --yes
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
이 명령이 하는 일:
|
|
42
|
+
|
|
43
|
+
- `node_modules/`가 없으면 npm 의존성을 설치합니다.
|
|
44
|
+
- 클론 설치에서는 짧은 `vc` 셸 명령을 `npm link`로 연결합니다.
|
|
45
|
+
- OS 패키지 매니저가 지원되면 `ffmpeg`, Node/npm, `whisper-cli`를 설치합니다.
|
|
46
|
+
- 기본 모델 `models/ggml-small-q5_1.bin`을 다운로드합니다.
|
|
47
|
+
- `edge-tts`가 PATH에 없으면 `.venv-tts`를 만들고 Edge TTS helper를 설치합니다.
|
|
48
|
+
- 대화형 `.env` 설정 마법사를 실행합니다.
|
|
49
|
+
|
|
50
|
+
지원되는 시스템 부트스트랩 경로:
|
|
51
|
+
|
|
52
|
+
| OS | 시스템 의존성 경로 |
|
|
53
|
+
|---|---|
|
|
54
|
+
| macOS | Homebrew: 필요 시 `brew install node ffmpeg whisper-cpp` |
|
|
55
|
+
| Debian/Ubuntu | `apt-get`으로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
|
|
56
|
+
| Fedora/RHEL | `dnf`로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
|
|
57
|
+
| Arch | `pacman`으로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
|
|
58
|
+
|
|
59
|
+
유용한 설치 변형:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
vc setup --yes --no-wizard # npm 설치에서 의존성만 준비
|
|
63
|
+
./scripts/install.sh --yes --no-wizard # 클론에서 의존성만 준비
|
|
64
|
+
./scripts/install.sh --skip-system # OS 패키지는 직접 설치
|
|
65
|
+
./scripts/install.sh --skip-model # 기본 STT 모델 다운로드 생략
|
|
66
|
+
./scripts/install.sh --skip-edge-tts # .venv-tts 생성 생략
|
|
67
|
+
VERBALCODING_SKIP_CLI_LINK=1 ./scripts/install.sh --yes
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
OS가 지원되지 않으면 아래를 직접 설치한 뒤 다시 실행하세요.
|
|
71
|
+
|
|
72
|
+
- Node.js 20+ 및 npm
|
|
73
|
+
- ffmpeg
|
|
74
|
+
- venv/pip가 포함된 Python 3
|
|
75
|
+
- whisper.cpp `whisper-cli`
|
|
76
|
+
- 인증된 CLI 에이전트 백엔드 하나 이상; 기본은 Hermes Agent
|
|
77
|
+
|
|
78
|
+
## 3. Discord 애플리케이션 설정
|
|
79
|
+
|
|
80
|
+
1. Discord Developer Portal에서 애플리케이션과 봇을 만듭니다.
|
|
81
|
+
2. Message Content privileged intent를 켭니다.
|
|
82
|
+
3. 봇 토큰을 설치 프롬프트 또는 `.env`의 `DISCORD_BOT_TOKEN`에 넣습니다.
|
|
83
|
+
4. 초대 URL을 생성합니다.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
vc bot invite <discord-client-id>
|
|
87
|
+
# 특정 서버로 고정하려면:
|
|
88
|
+
vc bot invite <discord-client-id> --guild <guild-id>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
초대 URL에는 VerbalCoding이 쓰는 bot/application command scope와 텍스트/음성 권한이 포함됩니다.
|
|
92
|
+
|
|
93
|
+
## 4. 검증
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
vc doctor
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`vc doctor`는 토큰을 숨깁니다. 필요한 토큰, 명령, 모델이 있는지만 보여주고 비밀값은 출력하지 않습니다. 모든 `✗` 항목을 고친 뒤 다시 실행하세요.
|
|
100
|
+
|
|
101
|
+
성공 예시는 다음과 같습니다.
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
✓ Node.js
|
|
105
|
+
✓ npm
|
|
106
|
+
✓ ffmpeg
|
|
107
|
+
✓ whisper-cli
|
|
108
|
+
✓ whisper.cpp model
|
|
109
|
+
✓ Discord bot token configured — [REDACTED]
|
|
110
|
+
✓ edge-tts
|
|
111
|
+
✓ hermes CLI
|
|
112
|
+
Doctor passed. Run vc start to start VerbalCoding.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
설치기가 로컬 Edge TTS helper를 만들었다면 `.env`에는 `.venv-tts/bin/edge-tts`를 가리키는 `EDGE_TTS_COMMAND` 경로가 들어갑니다.
|
|
116
|
+
|
|
117
|
+
## 5. 기본 단일 봇 실행
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
vc start
|
|
121
|
+
# 또는 GitHub 클론에서:
|
|
122
|
+
./run.sh
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
성공한 시작 로그에는 다음 줄이 보입니다.
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
Logged in as <bot-name>
|
|
129
|
+
Listening in voice channel <server> / <channel>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Discord에서:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
!ping
|
|
136
|
+
!join
|
|
137
|
+
!ask say hello briefly
|
|
138
|
+
!verbose on
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
그 다음 설정된 음성 채널에서 말해 보세요. STT 텍스트, verbose 모드의 진행 텍스트, 최종 텍스트 답변, TTS 재생을 확인할 수 있어야 합니다.
|
|
142
|
+
|
|
143
|
+
## 6. 프로젝트별 음성방 설정
|
|
144
|
+
|
|
145
|
+
프로젝트 음성방마다 영구 봇 하나를 두려면 프로젝트마다 Discord 애플리케이션을 만든 뒤:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
vc instance setup my-project
|
|
149
|
+
vc bot invite <that-project-client-id>
|
|
150
|
+
vc instance start my-project
|
|
151
|
+
vc instance status my-project
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
각 인스턴스는 무시되는 `instances/<name>.env`를 작성합니다. 이 파일에는 해당 봇의 토큰, 음성 채널, transcript 대상, 로그 경로, Hermes 세션 파일, 선택적 Hermes 프로필 정보가 들어갑니다.
|
|
155
|
+
|
|
156
|
+
## 7. 선택: OpenVoice 설정
|
|
157
|
+
|
|
158
|
+
OpenVoice 음성 복제는 선택 기능입니다. 공개 설치 직후에는 `TTS_BACKEND=edge`를 유지하세요. 나중에 OpenVoice를 켜려면:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
./scripts/setup_openvoice.sh
|
|
162
|
+
# OpenVoice V2 체크포인트를 vendor/OpenVoice/checkpoints_v2/ 아래에 넣습니다.
|
|
163
|
+
# 허가된 로컬 샘플을 voice-samples/user-reference.wav에 두거나,
|
|
164
|
+
# 봇 실행 후 “목소리 샘플 녹음 시작해”라고 말하고 10~30초 발화합니다.
|
|
165
|
+
python3 scripts/openvoice_smoke.py
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
그 뒤 `TTS_BACKEND=openvoice`로 설정하고 `vc doctor`, Discord의 `!voice-test <text>`로 테스트합니다.
|
|
169
|
+
|
|
170
|
+
## 8. 유지보수자용 클린 설치 스모크 테스트
|
|
171
|
+
|
|
172
|
+
빠른 호스트 스모크 테스트:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
TMPDIR=$(mktemp -d)
|
|
176
|
+
git clone https://github.com/ca1773130n/VerbalCoding.git "$TMPDIR/VerbalCoding"
|
|
177
|
+
cd "$TMPDIR/VerbalCoding"
|
|
178
|
+
./scripts/install.sh --yes --no-wizard
|
|
179
|
+
npm pack --dry-run
|
|
180
|
+
cp .env.example .env
|
|
181
|
+
chmod 600 .env
|
|
182
|
+
vc doctor || true
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
이 시점에서 예상되는 실패는 로컬 비밀값 누락 또는 인증되지 않은 에이전트 CLI입니다. 토큰 노출이나 설치 스크립트 누락이 나오면 안 됩니다.
|
|
186
|
+
|
|
187
|
+
Docker 기반 Ubuntu 클린 설치 스모크 테스트:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
./scripts/docker_ubuntu_smoke.sh
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
이 스크립트는 `ubuntu:24.04`에서 추적된 저장소 트리를 깨끗한 컨테이너로 복사하고, `./scripts/install.sh --yes --no-wizard`를 실행하고, 비밀값 없는 smoke `.env`를 만든 뒤 `vc`, Node 테스트, `vc doctor`를 확인합니다. Discord 음성 연결까지는 하지 않습니다. 실제 end-to-end 음성 테스트는 Ubuntu VM 또는 WSL2에서 별도로 진행하세요.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# VerbalCoding 멀티 인스턴스
|
|
2
|
+
|
|
3
|
+
VerbalCoding은 여러 개의 독립적인 Discord 음성 브릿지 프로세스를 실행할 수 있습니다. 각 프로세스는 같은 단일 인스턴스 Node 브릿지를 사용하지만, 서로 다른 `instances/<name>.env` 파일과 서로 다른 Discord bot token을 로드합니다.
|
|
4
|
+
|
|
5
|
+
프로젝트마다 자기 Discord 음성 채널에 항상 붙어 있고, 자기 transcript 채널/스레드에 기록해야 할 때 사용하세요.
|
|
6
|
+
|
|
7
|
+
## 왜 여러 봇 토큰이 필요한가
|
|
8
|
+
|
|
9
|
+
Discord 음성 상주 방식은 사실상 길드마다 봇 계정 하나가 동시에 하나의 음성 연결만 유지하는 구조입니다. 같은 봇 토큰이 같은 길드의 다른 음성 채널에 들어가면 이전 채널에도 계속 남아 있을 수 없습니다. 동시에 여러 프로젝트 방을 유지하려면 프로젝트마다 Discord 애플리케이션/봇을 하나씩 만들어야 합니다.
|
|
10
|
+
|
|
11
|
+
## 파일 구조
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
instances/
|
|
15
|
+
README.md
|
|
16
|
+
example.env
|
|
17
|
+
llm-wiki.env # 로컬 전용, git에서 무시
|
|
18
|
+
verbalcoding.env # 로컬 전용, git에서 무시
|
|
19
|
+
.run/instances/
|
|
20
|
+
llm-wiki.pid # 런타임 전용, git에서 무시
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
실제 `instances/*.env` 파일에는 Discord 토큰이 들어갈 수 있으므로 git에서 무시됩니다. `instances/example.env`만 템플릿으로 커밋됩니다.
|
|
24
|
+
|
|
25
|
+
## 인스턴스 설정 마법사
|
|
26
|
+
|
|
27
|
+
일반 사용자는 env 파일을 복사해서 직접 편집하지 않는 편이 좋습니다. 마법사를 실행하세요.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
vc instance setup llm-wiki
|
|
31
|
+
# 또는 프로젝트 설정 스크립트에서:
|
|
32
|
+
./scripts/install.sh --instance llm-wiki
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
마법사는 봇 토큰, Discord Application/Client ID, 음성 채널, transcript 대상, 작업 디렉터리, 프로젝트 컨텍스트, 격리된 런타임 경로를 묻습니다. `instances/<name>.env`를 권한 `0600`으로 작성하고, 기존 파일이 있으면 덮어쓰기 전에 백업하며, 다음 start/status 명령을 출력합니다.
|
|
36
|
+
|
|
37
|
+
설정 중 Discord Application/Client ID를 입력하면 요약에 해당 봇 초대 URL도 출력됩니다. 같은 URL은 언제든지 다시 만들 수 있습니다.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
vc bot invite <client-id>
|
|
41
|
+
vc bot invite <client-id> --guild <guild-id>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Discord는 동시에 여러 음성방에 상주하려면 여전히 방마다 Developer Portal 애플리케이션/봇 하나가 필요합니다. 대신 VerbalCoding이 OAuth URL이나 permission integer를 직접 조립할 필요를 없애 줍니다.
|
|
45
|
+
|
|
46
|
+
### Hermes 프로필 격리
|
|
47
|
+
|
|
48
|
+
각 인스턴스는 `~/.hermes/profiles/<name>` 아래에 자기 Hermes home을 갖습니다. 이렇게 하면 memory, MEMORY.md, SOUL.md, 학습된 skills가 프로젝트 사이에 섞이지 않습니다.
|
|
49
|
+
|
|
50
|
+
`vc instance setup <name>`은 자동으로 다음을 수행합니다.
|
|
51
|
+
|
|
52
|
+
- `hermes profile create <name> --clone-from default` 실행: 현재 `~/.hermes`의 API key와 모델 설정은 가져오지만, 세션과 메모리는 새로 시작합니다.
|
|
53
|
+
- 새 프로필의 `terminal.cwd`를 인스턴스 작업 디렉터리로 설정합니다.
|
|
54
|
+
- 마법사에서 입력한 project context로 `<profile>/SOUL.md`를 초기화합니다.
|
|
55
|
+
- `instances/<name>.env`에 `HERMES_HOME=...`을 씁니다.
|
|
56
|
+
|
|
57
|
+
`vc instance start <name>`은 self-heal을 수행합니다. env가 가리키는 Hermes profile directory가 사라졌다면 시작 전에 다시 만듭니다.
|
|
58
|
+
|
|
59
|
+
인스턴스 이름은 Hermes가 디렉터리와 config key로 쓰기 때문에 `^[a-z0-9][a-z0-9_-]{0,63}$` 형식이어야 합니다.
|
|
60
|
+
|
|
61
|
+
## 생성되는 최소 인스턴스 env 예시
|
|
62
|
+
|
|
63
|
+
```env
|
|
64
|
+
INSTANCE_NAME=my-project
|
|
65
|
+
DISCORD_TOKEN=replac...oken
|
|
66
|
+
DISCORD_CLIENT_ID=123456789012345678
|
|
67
|
+
AUTO_JOIN_VOICE_CHANNELS=Project Room
|
|
68
|
+
TRANSCRIPT_CHANNEL_ID=123456789012345678
|
|
69
|
+
PROJECT_SESSIONS_FILE=config/project-sessions.my-project.json
|
|
70
|
+
BRIDGE_LOG_PATH=/tmp/verbalcoding-my-project.log
|
|
71
|
+
NODE_AUDIO_DEBUG_DIR=/tmp/verbalcoding-my-project-debug
|
|
72
|
+
HERMES_SESSION_FILE=.agent-sessions/hermes/my-project.session
|
|
73
|
+
HERMES_HOME=/home/you/.hermes/profiles/my-project
|
|
74
|
+
AGENT_LABEL=VerbalCoding · My Project
|
|
75
|
+
AGENT_CWD=/path/to/my-project
|
|
76
|
+
AGENT_PROJECT_CONTEXT=Project session: My Project
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
모든 인스턴스는 log/debug/session 파일 경로가 고유해야 합니다. `HERMES_HOME`과 대응하는 `~/.hermes/profiles/<name>` 디렉터리는 `vc instance setup`이 자동 생성합니다. `vc doctor`는 비밀값을 출력하지 않고 중복 토큰, 충돌하는 런타임 경로, 누락된 profile directory, profile과 instance의 `terminal.cwd` 불일치를 검사합니다.
|
|
80
|
+
|
|
81
|
+
## 명령
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
vc instance list
|
|
85
|
+
vc instance status
|
|
86
|
+
vc instance status my-project
|
|
87
|
+
vc instance start my-project
|
|
88
|
+
vc instance stop my-project
|
|
89
|
+
vc instance restart my-project
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`start`는 `./run.sh instances/<name>.env`를 detached로 실행하고 `.run/instances/<name>.pid`를 씁니다.
|
|
93
|
+
|
|
94
|
+
`stop`은 `SIGTERM`을 보내고 최대 10초 기다린 뒤, 필요하면 `SIGKILL`로 fallback하고 pid 파일을 제거합니다.
|
|
95
|
+
|
|
96
|
+
## 예시: 영구 음성방 두 개
|
|
97
|
+
|
|
98
|
+
1. Discord 애플리케이션/봇 두 개를 만듭니다.
|
|
99
|
+
- VerbalCoding bot
|
|
100
|
+
- LLM-Wiki bot
|
|
101
|
+
|
|
102
|
+
2. 둘 다 서버에 초대하고 텍스트/음성 권한을 줍니다.
|
|
103
|
+
- View Channel
|
|
104
|
+
- Send Messages
|
|
105
|
+
- Send Messages in Threads
|
|
106
|
+
- Read Message History
|
|
107
|
+
- Use Application Commands
|
|
108
|
+
- Connect
|
|
109
|
+
- Speak
|
|
110
|
+
|
|
111
|
+
각 Discord 애플리케이션을 만든 뒤 `vc bot invite <client-id>`를 실행하면 필요한 권한이 포함된 정확한 초대 URL을 출력합니다.
|
|
112
|
+
|
|
113
|
+
3. 각 로컬 인스턴스 설정 마법사를 실행합니다.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
vc instance setup verbalcoding
|
|
117
|
+
vc instance setup llm-wiki
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
마법사는 git에서 무시되는 `instances/verbalcoding.env`, `instances/llm-wiki.env`를 권한 `0600`으로 작성하고, 기존 env가 있으면 백업합니다. 각 실행은 기본 Hermes home에서 clone한 `~/.hermes/profiles/<name>`도 생성하므로 두 인스턴스는 같은 인증/모델 설정으로 시작하지만, 프로젝트를 학습하면서 서로 독립적인 memory와 skills를 쌓습니다.
|
|
121
|
+
|
|
122
|
+
4. 설정을 확인합니다.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
vc doctor
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
5. 둘 다 시작합니다.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
vc instance start verbalcoding
|
|
132
|
+
vc instance start llm-wiki
|
|
133
|
+
vc instance status
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
6. 로그를 확인합니다.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
tail -n 50 /tmp/verbalcoding-verbalcoding.log
|
|
140
|
+
tail -n 50 /tmp/verbalcoding-llm-wiki.log
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
예상 로그:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
Listening in voice channel ... / VerbalCoding
|
|
147
|
+
Listening in voice channel ... / LLM-Wiki
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
7. 둘 다 중지합니다.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
vc instance stop verbalcoding
|
|
154
|
+
vc instance stop llm-wiki
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 단기: 단일 봇 텍스트/음성 바인딩
|
|
158
|
+
|
|
159
|
+
봇 토큰이 하나뿐이라면 동시 다중 채널 상주 대신 project-session voice binding을 쓰세요.
|
|
160
|
+
|
|
161
|
+
대상 텍스트 채널/스레드에서:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
!session attach-voice --voice "LLM-Wiki"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
동작:
|
|
168
|
+
|
|
169
|
+
- 선택된 음성 채널을 현재 텍스트 채널/스레드에 연결합니다.
|
|
170
|
+
- 현재 텍스트 채널에 project session이 없으면 ad-hoc 격리 세션을 만듭니다.
|
|
171
|
+
- 음성 STT/result/progress/final-answer 텍스트가 해당 project transcript 대상으로 라우팅됩니다.
|
|
172
|
+
|
|
173
|
+
기존 named project session을 연결하려면:
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
!session voice llm-wiki --voice "LLM-Wiki"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
이 방식은 라우팅에는 편하지만, 봇 하나를 동시에 두 음성 채널에 머물게 하지는 않습니다. 동시에 여러 프로젝트 방에 영구 상주하려면 여러 봇 토큰/프로세스를 사용하세요.
|
package/docs/i18n/README.ko.md
CHANGED
|
@@ -19,15 +19,16 @@
|
|
|
19
19
|
<img alt="Discord" src="https://img.shields.io/badge/Discord-voice%20bridge-5865F2?logo=discord&logoColor=white">
|
|
20
20
|
<img alt="STT" src="https://img.shields.io/badge/STT-whisper.cpp-7C3AED">
|
|
21
21
|
<img alt="TTS" src="https://img.shields.io/badge/TTS-Edge%20%7C%20OpenVoice%20%7C%20Supertonic%20%7C%20SpeechSwift-0EA5E9">
|
|
22
|
+
<img alt="Agents" src="https://img.shields.io/badge/Agents-Hermes%20%7C%20Claude%20%7C%20Codex%20%7C%20Gemini%20%7C%20OpenCode-111827">
|
|
22
23
|
</p>
|
|
23
24
|
|
|
24
25
|
<p align="center">
|
|
25
26
|
<img src="../assets/figures/verbalcoding-flow.svg" alt="VerbalCoding voice-to-agent flow" width="860">
|
|
26
27
|
</p>
|
|
27
28
|
|
|
28
|
-
##
|
|
29
|
+
## 왜 필요한가
|
|
29
30
|
|
|
30
|
-
VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조작면으로 바꿉니다. 말로 요청하고, CLI 에이전트가 작업하게 두고, 핵심 답변을 음성으로 다시 들을 수
|
|
31
|
+
VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조작면으로 바꿉니다. 말로 요청하고, CLI 에이전트가 작업하게 두고, 핵심 답변을 음성으로 다시 들을 수 있습니다. 텍스트 기록, 진행 이벤트, 코드/로그 낭독 방지 장치도 함께 제공합니다.
|
|
31
32
|
|
|
32
33
|
## 핵심 기능
|
|
33
34
|
|
|
@@ -36,20 +37,41 @@ VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조
|
|
|
36
37
|
| 음성 우선 에이전트 제어 | Hermes Agent, Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw 또는 커스텀 CLI를 말로 제어합니다. |
|
|
37
38
|
| 로컬 우선 음성 루프 | Discord 음성 캡처 → `whisper.cpp` STT → 에이전트 → 분할 TTS 재생. |
|
|
38
39
|
| 음성 + 텍스트 컨텍스트 공유 | 지원되는 에이전트에서는 음성 턴과 `!ask` 텍스트 명령이 같은 세션을 재사용합니다. |
|
|
39
|
-
|
|
|
40
|
+
| 끼어들기와 감도 모드 | 재생 중 자연스럽게 끼어들고, 일반/보수 감도 모드를 전환합니다. |
|
|
40
41
|
| 다국어 음성 프리셋 | `vc language ko/en/auto`로 STT, 진행 언어, TTS 음성을 함께 바꿉니다. |
|
|
41
42
|
| 프로젝트별 멀티룸 격리 | 프로젝트 방마다 별도 봇과 Hermes 프로필, 세션, 메모리, 로그를 둡니다. |
|
|
42
43
|
|
|
43
44
|
## 빠른 시작
|
|
44
45
|
|
|
46
|
+
가장 쉬운 npm 설치:
|
|
47
|
+
|
|
45
48
|
```bash
|
|
46
|
-
|
|
49
|
+
npm install -g verbalcoding
|
|
50
|
+
vc setup --yes
|
|
51
|
+
vc doctor
|
|
52
|
+
vc start
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
전역 설치 없이 바로 실행:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx verbalcoding setup --yes
|
|
59
|
+
vc doctor
|
|
60
|
+
vc start
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
기여자용 GitHub 클론:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
git clone https://github.com/ca1773130n/VerbalCoding.git
|
|
47
67
|
cd VerbalCoding
|
|
48
|
-
./scripts/install.sh
|
|
68
|
+
./scripts/install.sh --yes
|
|
49
69
|
vc doctor
|
|
50
70
|
./run.sh
|
|
51
71
|
```
|
|
52
72
|
|
|
73
|
+
`vc setup --yes`와 `./scripts/install.sh --yes`는 가능한 경우 Node/npm 의존성, `ffmpeg`, `whisper-cli`, 기본 whisper.cpp 모델, 로컬 `.venv-tts` Edge TTS helper를 준비합니다. macOS/Homebrew와 일반적인 Linux 패키지 매니저(`apt`, `dnf`, `pacman`)를 지원합니다.
|
|
74
|
+
|
|
53
75
|
## 동작 방식
|
|
54
76
|
|
|
55
77
|
```mermaid
|
|
@@ -65,57 +87,71 @@ flowchart LR
|
|
|
65
87
|
|
|
66
88
|
## 지원 에이전트 백엔드
|
|
67
89
|
|
|
68
|
-
|
|
|
90
|
+
| 백엔드 | 기본 명령 | 세션 지원 |
|
|
69
91
|
|---|---:|---|
|
|
70
|
-
| Hermes Agent | `hermes chat -Q -q` |
|
|
71
|
-
| Claude Code | `claude -p` |
|
|
72
|
-
| Codex CLI | `codex exec` |
|
|
73
|
-
| Gemini CLI | `gemini -p` |
|
|
74
|
-
| OpenCode | `opencode run` |
|
|
75
|
-
| OpenClaw | `openclaw run` |
|
|
76
|
-
| Custom | `AGENT_COMMAND` |
|
|
92
|
+
| Hermes Agent | `hermes chat -Q -q` | resume, 자세한 진행, cancellation, 최종 답변 복구 |
|
|
93
|
+
| Claude Code | `claude -p` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
|
|
94
|
+
| Codex CLI | `codex exec` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
|
|
95
|
+
| Gemini CLI | `gemini -p` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
|
|
96
|
+
| OpenCode | `opencode run` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
|
|
97
|
+
| OpenClaw | `openclaw run` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
|
|
98
|
+
| Custom | `AGENT_COMMAND` | 비대화형 명령을 직접 연결 |
|
|
77
99
|
|
|
78
100
|
## 더 알아보기
|
|
79
101
|
|
|
80
|
-
|
|
|
102
|
+
| 문서 | 내용 |
|
|
81
103
|
|---|---|
|
|
82
|
-
| [
|
|
83
|
-
| [
|
|
84
|
-
| [
|
|
85
|
-
| [
|
|
86
|
-
| [
|
|
104
|
+
| [새 설치](FRESH_INSTALL.ko.md) | npm 설치, 클린 클론, 모델 다운로드, 첫 실행 |
|
|
105
|
+
| [사용 가이드](USAGE.ko.md) | CLI 명령, Discord 명령, 진행 모드, 지연 시간 지표 |
|
|
106
|
+
| [설정](CONFIGURATION.ko.md) | `.env`, 에이전트 백엔드, MCP, TTS 백엔드, 운영 메모 |
|
|
107
|
+
| [멀티 인스턴스](MULTI_INSTANCE.ko.md) | 프로젝트마다 영구 Discord 음성방 하나씩 운영 |
|
|
108
|
+
| [릴리스 노트](RELEASE.ko.md) | 현재 기능과 릴리스 전 체크리스트 |
|
|
109
|
+
| [English docs](../../README.md) | 영어 canonical README와 문서 |
|
|
87
110
|
|
|
88
111
|
## 작은 명령 지도
|
|
89
112
|
|
|
90
113
|
```bash
|
|
91
|
-
vc status
|
|
92
|
-
vc language ko|en|auto
|
|
93
|
-
vc bot invite CLIENT_ID
|
|
94
|
-
vc instance setup NAME
|
|
95
|
-
vc instance start NAME
|
|
96
|
-
vc doctor
|
|
114
|
+
vc status # 현재 언어, TTS, 브릿지 설정 보기
|
|
115
|
+
vc language ko|en|auto # STT/진행/TTS 언어 프리셋 전환
|
|
116
|
+
vc bot invite CLIENT_ID # Discord 봇 초대 URL 생성
|
|
117
|
+
vc instance setup NAME # 격리된 프로젝트 음성 봇 생성
|
|
118
|
+
vc instance start NAME # 해당 봇을 백그라운드로 실행
|
|
119
|
+
vc doctor # 비밀값을 숨긴 상태 점검
|
|
120
|
+
vc start # 기본 브릿지 시작
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Discord에서:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
!join !ask <prompt> !verbose on/off
|
|
127
|
+
!latency !sensitivity normal !sensitivity conservative
|
|
128
|
+
!session new <name> <workdir> [context] --voice <voice-channel>
|
|
97
129
|
```
|
|
98
130
|
|
|
99
131
|
## 요구 사항
|
|
100
132
|
|
|
101
|
-
|
|
|
133
|
+
| 계층 | 기본값 |
|
|
102
134
|
|---|---|
|
|
103
|
-
| Runtime | Node.js 20+, npm |
|
|
104
|
-
| Audio | `ffmpeg
|
|
105
|
-
| STT | `whisper.cpp` / `whisper-cli
|
|
135
|
+
| Runtime | Node.js 20+, npm; 설치 스크립트가 Homebrew/apt/dnf/pacman으로 설치 시도 |
|
|
136
|
+
| Audio | `ffmpeg`; 설치 스크립트가 설치 시도 |
|
|
137
|
+
| STT | `whisper.cpp` / `whisper-cli`; macOS는 Homebrew, Linux는 로컬 빌드 fallback |
|
|
138
|
+
| TTS | Edge TTS CLI; 필요하면 `.venv-tts` 생성 |
|
|
106
139
|
| Discord | Bot token, Message Content intent, voice permissions |
|
|
107
|
-
| Agent |
|
|
108
|
-
| Platform focus | macOS / Apple Silicon
|
|
140
|
+
| Agent | 인증된 CLI 하네스 하나 이상; 기본은 Hermes Agent |
|
|
141
|
+
| Platform focus | macOS / Apple Silicon을 가장 많이 테스트; Linux bootstrap은 best-effort |
|
|
109
142
|
|
|
110
143
|
## 기여
|
|
111
144
|
|
|
145
|
+
변경 전 가벼운 검증:
|
|
146
|
+
|
|
112
147
|
```bash
|
|
113
148
|
node --check app-node/main.mjs
|
|
114
149
|
npm test
|
|
115
150
|
bash -n run.sh scripts/install.sh
|
|
151
|
+
npm pack --dry-run
|
|
116
152
|
vc doctor
|
|
117
153
|
```
|
|
118
154
|
|
|
119
155
|
## 상태
|
|
120
156
|
|
|
121
|
-
VerbalCoding
|
|
157
|
+
VerbalCoding은 공개 릴리스를 지향하지만 아직 초기 단계입니다. 데모 영상/GIF, 더 넓은 Linux 검증, CI와 보안 리뷰를 계속 보강하면 좋습니다.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# VerbalCoding 릴리스 노트
|
|
2
|
+
|
|
3
|
+
## 현재 릴리스 후보
|
|
4
|
+
|
|
5
|
+
VerbalCoding은 음성으로 CLI 기반 코딩 에이전트를 제어하기 위한 Discord 음성 브릿지입니다. 공개 릴리스를 지향하며, macOS / Apple Silicon 경로가 가장 많이 테스트되어 있고, 일반적인 Linux 패키지 매니저에 대해서는 best-effort 부트스트랩을 제공합니다.
|
|
6
|
+
|
|
7
|
+
### 포함된 기능
|
|
8
|
+
|
|
9
|
+
- Node `@discordjs/voice` 기반 Discord 음성 수신.
|
|
10
|
+
- `whisper.cpp` + Metal 기반 로컬 한국어 STT.
|
|
11
|
+
- 한국어 기본 음성을 사용하는 Edge TTS 재생.
|
|
12
|
+
- 범용 CLI 하네스 어댑터 레이어:
|
|
13
|
+
- Hermes Agent
|
|
14
|
+
- Claude Code
|
|
15
|
+
- Codex CLI
|
|
16
|
+
- Gemini CLI
|
|
17
|
+
- OpenCode
|
|
18
|
+
- OpenClaw
|
|
19
|
+
- custom command
|
|
20
|
+
- Hermes 백엔드의 음성/텍스트 공유 세션 지원.
|
|
21
|
+
- 긴 답변 TTS chunking과 반응형 barge-in.
|
|
22
|
+
- 큰 diff/code/log 출력이 음성으로 읽히지 않도록 하는 guardrail.
|
|
23
|
+
- 실내와 noisy/outdoor 환경을 위한 normal/conservative 감도 모드.
|
|
24
|
+
- 설정 마법사, `.env.example`, `vc doctor` prerequisite checker, OS 패키지/npm 의존성/Edge TTS helper/기본 whisper.cpp 모델을 준비하는 `./scripts/install.sh --yes` 부트스트랩.
|
|
25
|
+
- 긴 에이전트 작업 중 텍스트 전용 중간 단계 업데이트를 위한 선택적 verbose progress mode.
|
|
26
|
+
- 파이프라인 최적화를 위한 JSONL latency metrics와 `!latency` / `!metrics` 요약.
|
|
27
|
+
- 낮아진 기본 utterance idle wait (`UTTERANCE_IDLE_MS=2000`)로 사용자가 말한 뒤 STT가 약 0.6초 더 빨리 시작.
|
|
28
|
+
- 멀티 인스턴스 Hermes 프로필 격리: `vc instance setup <name>`이 자동으로 Hermes 프로필을 `~/.hermes/profiles/<name>`에 clone하고, instance workdir을 설정하고, SOUL.md를 초기화하고, instance env에 `HERMES_HOME`을 기록합니다. `vc instance start`는 누락된 profile을 self-heal하고, `vc doctor`는 profile-dir 존재와 `terminal.cwd` 일관성을 검사합니다.
|
|
29
|
+
- npm 공개 패키지: `npm install -g verbalcoding`, `vc setup --yes`, `vc start` 경로 지원.
|
|
30
|
+
|
|
31
|
+
### 릴리스 전 체크리스트
|
|
32
|
+
|
|
33
|
+
저장소 루트에서 실행:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
./scripts/install.sh --yes --no-wizard
|
|
37
|
+
./scripts/docker_ubuntu_smoke.sh # Docker 필요; ubuntu:24.04 clean install 검증
|
|
38
|
+
node --check app-node/main.mjs app-node/agent_adapters.mjs app-node/install_config.mjs scripts/install.mjs
|
|
39
|
+
npm test
|
|
40
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q || [ $? -eq 5 ] # Python 테스트가 없으면 exit 5 허용
|
|
41
|
+
bash -n run.sh scripts/install.sh scripts/bootstrap_prereqs.sh scripts/docker_ubuntu_smoke.sh
|
|
42
|
+
npm pack --dry-run
|
|
43
|
+
vc doctor
|
|
44
|
+
git diff --check
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
수동 스모크 테스트:
|
|
48
|
+
|
|
49
|
+
1. `vc start` 또는 `./run.sh`로 브릿지를 시작합니다.
|
|
50
|
+
2. 로그에 `Logged in as <bot-name>`이 있는지 확인합니다.
|
|
51
|
+
3. 로그에 `Listening in voice channel ... / 일반` 또는 설정된 기본 채널이 있는지 확인합니다.
|
|
52
|
+
4. Discord에서 `!ping`을 실행합니다.
|
|
53
|
+
5. Discord 음성에서 짧은 한국어 요청을 말합니다.
|
|
54
|
+
6. STT transcript, agent response, TTS playback, barge-in 동작을 확인합니다.
|
|
55
|
+
|
|
56
|
+
### 알려진 요구 사항
|
|
57
|
+
|
|
58
|
+
- macOS + Homebrew 또는 Linux + `apt`, `dnf`, `pacman` best-effort bootstrap.
|
|
59
|
+
- `ffmpeg`; 설치기가 설치를 시도합니다.
|
|
60
|
+
- `whisper-cli`; macOS에서는 Homebrew를 사용하고, Linux에서는 로컬 `vendor/whisper.cpp` 빌드 fallback을 사용합니다.
|
|
61
|
+
- 기본 모델 `models/ggml-small-q5_1.bin`; `--skip-model`을 쓰지 않으면 설치기가 다운로드합니다.
|
|
62
|
+
- PATH의 Edge TTS CLI 또는 로컬 `.venv-tts/bin/edge-tts`; 필요하면 설치기가 로컬 helper를 만듭니다.
|
|
63
|
+
- `.env`, `instances/<name>.env`, `~/.zshrc`, runtime env 중 하나에 Discord bot token.
|
|
64
|
+
- 선택한 CLI 하네스가 설치되고 인증되어 있어야 합니다.
|
|
65
|
+
|
|
66
|
+
### 아직 public release 전에 보강하면 좋은 것
|
|
67
|
+
|
|
68
|
+
- GitHub Actions CI.
|
|
69
|
+
- Demo video / GIF.
|
|
70
|
+
- Discord bot setup screenshots.
|
|
71
|
+
- 스크립트 수준 검증을 넘어 실제 여러 Linux 배포판에서 더 넓은 검증.
|
|
72
|
+
- 모든 logging path 보안 리뷰.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# VerbalCoding 사용 가이드
|
|
2
|
+
|
|
3
|
+
이 문서는 README에 다 넣기에는 긴 실제 운영 방법을 모아 둔 사용 설명서입니다.
|
|
4
|
+
|
|
5
|
+
## CLI 명령
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
vc setup --yes # npm 설치 후 의존성 부트스트랩과 설정 마법사 실행
|
|
9
|
+
vc start # 기본 Discord 음성 브릿지 시작
|
|
10
|
+
vc status # STT 언어, 진행 언어, TTS 음성 상태 보기
|
|
11
|
+
vc language en # 영어 STT + 영어 진행/TTS 음성
|
|
12
|
+
vc language ko # 한국어 STT + 한국어 진행/TTS 음성
|
|
13
|
+
vc language auto # Whisper 자동 언어 감지 + 진행/TTS 음성 프리셋
|
|
14
|
+
vc restart auto status # 커밋 시 음성 봇 자동 재시작 설정 보기
|
|
15
|
+
vc restart auto on # 커밋 시 음성 봇 자동 재시작 켜기
|
|
16
|
+
vc restart auto off # 자동 재시작 끄기; 기본값
|
|
17
|
+
vc bot invite CLIENT_ID # 필요한 권한이 포함된 Discord 초대 URL 출력
|
|
18
|
+
vc instance status # 인스턴스별 설정과 프로세스 상태 목록 보기
|
|
19
|
+
vc instance setup NAME # instances/NAME.env 작성 및 Hermes 프로필 생성
|
|
20
|
+
vc instance start NAME # ./run.sh instances/NAME.env를 백그라운드로 시작
|
|
21
|
+
vc instance stop NAME # 백그라운드 인스턴스 중지 및 pid 파일 제거
|
|
22
|
+
vc doctor # 비밀값을 숨긴 상태 점검 실행
|
|
23
|
+
npm run mcp # stdio MCP 서버 실행
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
언어 변경은 `.env`를 수정합니다. 적용하려면 `vc start`, `./run.sh`, 또는 사용 중인 프로세스 매니저로 브릿지를 재시작하세요.
|
|
27
|
+
|
|
28
|
+
## 실행 모드
|
|
29
|
+
|
|
30
|
+
npm으로 설치한 기본 브릿지:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
vc start
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
GitHub 클론에서 직접 실행:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
./run.sh
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
프로젝트별 인스턴스 env로 실행:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
./run.sh instances/my-project.env
|
|
46
|
+
# 또는
|
|
47
|
+
VERBALCODING_INSTANCE_ENV=instances/my-project.env ./run.sh
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
봇은 설정된 음성 채널 이름 중 첫 번째로 자동 입장합니다. 기본값은 `일반,General,general`입니다.
|
|
51
|
+
|
|
52
|
+
## Discord 명령
|
|
53
|
+
|
|
54
|
+
| 명령 | 용도 |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `!ping` | 봇 연결 기본 확인 |
|
|
57
|
+
| `!join` / `!leave` | 음성 채널 입장/퇴장 |
|
|
58
|
+
| `!say <text>` | 텍스트를 바로 TTS로 읽기 |
|
|
59
|
+
| `!voice-test <text>` | 현재 TTS 백엔드 테스트 |
|
|
60
|
+
| `!voice-clone capture` | 다음 유효 발화를 OpenVoice 기준 샘플로 저장 |
|
|
61
|
+
| `!voice-clone status` / `!voice-clone cancel` | 샘플 캡처 상태 확인/취소 |
|
|
62
|
+
| `!ask <prompt>` | 음성과 같은 선택된 CLI 어댑터로 텍스트 요청 보내기 |
|
|
63
|
+
| `!session status` | 현재 프로젝트/default 에이전트 세션 보기 |
|
|
64
|
+
| `!session new <name> <workdir> [context] --voice <voice-channel>` | 프로젝트 단위 Hermes 세션 생성 |
|
|
65
|
+
| `!session attach-voice [sessionName] --voice <voice-channel>` | 현재 텍스트 채널/스레드를 음성 채널에 연결 |
|
|
66
|
+
| `!session list` | 설정된 프로젝트 세션 목록 보기 |
|
|
67
|
+
| `!session reset` / `!reset-session` | 현재 프로젝트/default 세션 파일 초기화 |
|
|
68
|
+
| `!verbose on/off` | 자세한 진행 업데이트 켜기/끄기 |
|
|
69
|
+
| `!latency` / `!metrics` | 최근 지연 시간 요약 보기 |
|
|
70
|
+
| `!sensitivity normal/conservative` | 끼어들기 감도 전환 |
|
|
71
|
+
|
|
72
|
+
음성으로도 “외부 모드”, “보수 모드”, “실내”, “기본 감도” 같은 감도 전환과 “잠깐”, “멈춰”, “그만” 같은 명확한 중단 표현을 처리합니다. “상세 진행 켜” / “상세 진행 꺼”처럼 말해서 verbose progress도 바꿀 수 있습니다.
|
|
73
|
+
|
|
74
|
+
## 자세한 진행 모드
|
|
75
|
+
|
|
76
|
+
자세한 진행은 기본적으로 꺼져 있습니다. `.env`에 `AGENT_VERBOSE_PROGRESS=1`을 설정하거나 Discord에서 `!verbose on`, 또는 음성으로 “상세 진행 켜”라고 말해 켤 수 있습니다.
|
|
77
|
+
|
|
78
|
+
켜져 있으면 긴 작업 중 이런 짧은 진행 줄을 텍스트로 보냅니다.
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
🤖 에이전트 호출 시작
|
|
82
|
+
📖 파일 읽기 app-node/main.mjs
|
|
83
|
+
🔎 웹 검색 실행
|
|
84
|
+
⌨️ 터미널 명령 실행
|
|
85
|
+
🤖 에이전트 응답 수신
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
이 모드는 선택된 CLI 하네스에 `VERBALCODING_PROGRESS: ...` 줄을 내보내도록 요청하고, 가능하면 stdout/stderr의 일반적인 도구 사용 흔적도 요약합니다. 비밀값처럼 보이는 필드는 숨기고, 진행 줄은 최종 음성 답변에서 제거합니다.
|
|
89
|
+
|
|
90
|
+
## 지연 시간 지표
|
|
91
|
+
|
|
92
|
+
VerbalCoding은 각 턴의 지연 시간 기록을 JSONL로 저장합니다. 기본 경로:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
./.logs/latency.jsonl
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
각 기록에는 상태, 전체 시간, 음성 캡처 시간, 발화 idle 대기, STT 시간, 에이전트 시간, TTS 합성/재생 시간, 청크 수, 발화 길이, 답변 길이, 가능한 경우 오디오 레벨이 포함됩니다.
|
|
99
|
+
|
|
100
|
+
Discord에서:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
!latency
|
|
104
|
+
!metrics
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
요약은 최근 200개 기록 기준으로 count, average, p95, max, non-OK 상태를 보여줍니다.
|
|
108
|
+
|
|
109
|
+
## 테스트
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
node --check app-node/main.mjs
|
|
113
|
+
npm test
|
|
114
|
+
bash -n run.sh scripts/install.sh
|
|
115
|
+
npm pack --dry-run
|
|
116
|
+
vc doctor
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`vc doctor`는 비밀값을 출력하지 않고 필수 값이 설정됐는지만 확인합니다. 또한 `instances/*.env`에서 중복 토큰 지문과 충돌하는 런타임 경로를 검사합니다.
|