Replace the user-token selfbot voice path with an official Discord bot using discord.js 14 + @discordjs/voice 0.19. The bot logs in with the stored testbot token, joins the target voice channel, passes the DAVE/MLS E2EE handshake, and receives per-user Opus audio via VoiceReceiver (the STT input path). ToS-safe. Live-verified: bot joined guild "사지방" / channel "일반" and reached Ready. Selfbot (gate.mjs/join.mjs) kept only for the deferred screenshare-video track, which official bots cannot receive. Docs updated (README/PLAN); M1 done on bot path. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
6.4 KiB
6.4 KiB
watch_sceen_ai — 착수 계획 (확정본)
디스코드 화면공유를 실시간으로 함께 보며 음성으로 대화하는 AI.
방향 전환 (2026-08-11)
- 화면공유(눈) 부분은 일단 보류하고, 먼저 음성 대화 루프 STT → 두뇌 → TTS를 완성한다.
- 파이프라인은 이제 눈 없이(source/vision = None) 돌아간다:
python -m wsai --voice. - 화면공유 관문 1(DAVE) 성과는 아래에 보존. 나중에 눈을 다시 붙일 때 재사용한다.
공식 봇 전환 (2026-08-16)
- 보이스 접속(=STT 입력 경로)을 셀프봇(유저 토큰) → 공식 Discord 봇으로 마이그레이션 완료.
dave/bot.mjs(discord.js 14 + @discordjs/voice 0.19)가 봇 토큰으로 대상 채널 join → DAVE/MLS E2EE Ready → 유저별 Opus 수신까지 라이브 검증됨. ToS-safe. - 셀프봇은 공식 봇이 막는 화면공유 비디오 수신 트랙용으로만 남기고, 그건 보류 상태다. 아래 1단계(눈) 셀프봇 서술은 그 보류된 비디오 트랙 기준이다.
확정된 결정 (2026-08-09)
- 캡처 방식 (눈) — 사용자 요구: 스크린샷/브라우저 캡처 ❌,
실제 실시간 화면공유 스트림 자체를 진짜 클라이언트처럼 수신해야 함.
→ 셀프봇(유저 토큰)으로 프로토콜 레벨에서 비디오 RTP 스트림을 수신·디코딩한다.
- 근거(원문 확인): Discord 공식 봇은 비디오를 완전 차단 → 봇으로는 불가. 반드시 유저 토큰(셀프봇) 필요.
discord.js-selfbot-v13(werift-rtp 사용)이 수신 노출:VoiceReceiver(수신 스트림 레코딩),StreamConnection(스크린셰어),receiverData이벤트(ssrcData: userId, hasVideo, RtpPacket). → 남의 화면공유 수신 기술적으로 가능.- 수신 파이프: 셀프봇 join + Go Live "watch stream" 시그널링으로 비디오 SSRC 구독 → 암호화 RTP 비디오 수신 → 복호화(xsalsa20_poly1305/libsodium) → depayload(VP8/H264) → ffmpeg 디코드 → 프레임.
- 위험/제약: (a) 유저 토큰 = Discord ToS 위반, 계정 밴 위험 → 반드시 버리는 계정 사용. (b) 완성형 "수신→프레임" 라이브러리는 없음, 조립 필요. (c) 주력 셀프봇 라이브러리는 2025-10 아카이브(read-only) → 프로토콜 변경 시 깨질 수 있음.
- ❌ 폐기: Xvfb + 브라우저 캡처(스크린샷) 방식 — 사용자가 명시적으로 거부.
poc/는 참고용 폴백으로만 남김.
- 대화 방식 — 음성 실시간. STT→LLM→TTS 스트리밍으로 지연 최소화, 사용자 인터럽트 지원.
- 두뇌 — Claude OAuth로 가장 싸고 빠른 모델(Haiku 계열).
- .9의 RTX 5050으로 소형 로컬 VLM을 돌려 매 프레임 1차 이해·화면 변화 감지를 값싸게 처리, 어려운 화면만 Haiku로 에스컬레이션 (하이브리드).
- 실행 위치 — 이 리눅스 호스트(.9).
단계별 착수 목록
1단계 · 눈: 화면공유 스트림 수신 ← 지금
- 호스트 도구 확인 (Node 22/ffmpeg/libsodium 가능)
- 수신 방법 조사 확정: 셀프봇 프로토콜 레벨 비디오 RTP 수신
- 버리는 디스코드 유저 계정 + 토큰 확보, ToS/밴 위험 수용 확인 (
.env, burner tkrmagid_bot) - [관문 1 통과] DAVE/MLS(E2EE) 게이트웨이 4017 검증 — 아래 참조
- 셀프봇으로 음성채널 join → 상대 Go Live 스트림 watch/구독 (비디오 SSRC 획득)
- 들어오는 비디오 RTP 수신 → DAVE 복호화(daveSession.decrypt) → depayload(VP8/H264)
- ffmpeg로 디코드 → 프레임(JPEG/PNG) 추출 PoC (진짜 공유화면 수신 검증)
- 프레임 변화 감지(동일 화면 반복 전송 방지) + 소스 인터페이스
관문 1 (arbiter 지정 fail-fast) — 통과 확정 2026-08-09
DAVE(MLS) E2EE가 전면 강제라 "토큰만 꽂으면 됨"이 깨졌다는 게 핵심 리스크였음.
dave/gate.mjs 로 실측 검증 → 통과:
- 셀프봇 유저토큰으로 메인 GW IDENTIFY → 음성채널 join → 보이스 GW v8 IDENTIFY(
max_dave_protocol_version=1). - 결과: close 4017 없음.
SESSION_DESCRIPTION에서dave_protocol_version=1협상됨(= 해당 채널 E2EE 활성). @snazzah/davey(Rust NAPI, DAVE 구현)로 MLS 멤버십 핸드셰이크 완주: op25 external_sender 수신 → op26 key_package 송신 → op27 proposals 처리(commit+welcome 생성) → op28 commit_welcome 송신 → op29 announce_commit →processCommit→ MLS session ready=true.- 5초간 서버 disconnect 없이 멤버십 유지, voicePrivacyCode 산출됨(실제 E2EE 그룹 참여 증명).
- 결론: 셀프봇이 DAVE E2EE 보이스 그룹에 정식 멤버로 합류 가능. 옵션 A(직접 수신) 실현 가능 확정.
- 바이너리 프레이밍 확정: 수신
[u16 seq][u8 op][payload]; op29/30 payload는[u16 transition_id][blob]; op27 payload는[u8 op_type][proposals]; 송신 op26/28은[u8 op][blob(+welcome)]. processProposals에는 채널 내 인식 유저ID(op11 clients_connect)를 넘겨야 함(안 넘기면 UnexpectedUser).
다음 (관문 통과 후 A 강행)
- 상대의 Go Live 스트림 구독: op video 스트림 SSRC 확보(스트림 시청 시그널링) — Go Live 중인 소스 필요.
- UDP로 들어오는 SRTP 비디오 패킷 수신 → RTP 헤더 파싱 →
daveSession.decrypt(userId, VIDEO, packet)E2EE 복호화 → 전송암호(aead_aes256_gcm_rtpsize) 복호 → VP8/H264 depayload → ffmpeg 디코드 → 프레임.
3단계 · 두뇌 (하이브리드 비전)
- 로컬 VLM(예: moondream2 / Qwen2-VL-2B) 프레임 1차 이해 + 변화 감지
- Claude OAuth(Haiku)로 어려운 프레임 에스컬레이션
- 최신 화면 맥락 저장소
4단계 · 음성 대화
- STT (faster-whisper, 스트리밍/부분전사)
- 대화 브레인 (화면맥락 + 대화이력)
- TTS (MeloTTS 등, 이 호스트에 자산 있음)
- 말 끊기 인터럽트 + 지연 최적화
5단계 · 통합·운영
- 인지 루프 + 대화 루프 동시 실행
- proactive(화면 크게 바뀌면 먼저 말 걸기)
- 끊김 복구, 비용 모니터링, 서비스화
주의
- 캡처용 디스코드 계정은 메인 말고 별도 계정 권장(자동화 회색지대, 밴 위험 최소화).
- 로컬 GPU 8GB VRAM 제약 → 소형 VLM만. 큰 이해는 클라우드.