docs(readme): tighten latency budget to <=1s, STT via Discord voice, Korean human-like TTS
This commit is contained in:
57
README.md
57
README.md
@@ -7,15 +7,16 @@ STT → 두뇌 → TTS부터 완성**하는 단계다.
|
||||
- 실행 위치: 이 리눅스 호스트(.9, RTX 5050 8GB / ffmpeg / node v22 있음)
|
||||
- 현재 상태: 음성 루프 뼈대 동작 — 파이프라인이 **눈 없이(화면공유 없이)** 돌아간다
|
||||
(`python -m wsai --voice`). STT/TTS/두뇌는 아직 mock이며, 실제 엔진 연결이 다음 목표.
|
||||
- 보류 중: 화면공유 수신(눈). E2EE 합류 관문은 이미 통과해 두었고(아래 8장), 음성 루프가
|
||||
자리 잡으면 다시 붙인다.
|
||||
- 보류 중: 화면공유 **비디오** 수신(눈). 단, STT 입력은 **디스코드 보이스로 유저 음성을
|
||||
수신**하므로 셀프봇의 보이스 접속 자체는 지금도 쓴다(비디오만 미룸). E2EE 합류 관문은
|
||||
이미 통과해 두었다(아래 8장).
|
||||
|
||||
---
|
||||
|
||||
## 1. 설계 원칙
|
||||
|
||||
1. **지연이 전부다.** 음성 대화형이라 "정확하지만 느린" 답은 실패다. 전 구간을
|
||||
스트리밍으로 잇고, 목표는 사용자가 말 끝낸 뒤 **첫 소리까지 ~1.5초 이내**.
|
||||
스트리밍으로 잇고, 목표는 사용자가 말 끝낸 뒤 **첫 소리까지 1초 이내**.
|
||||
2. **싼 것부터, 필요할 때만 비싸게.** 로컬(GPU)에서 처리할 수 있는 건 로컬에서,
|
||||
정말 필요한 것만 클라우드로 올린다.
|
||||
3. **부품은 교체 가능해야 한다.** 귀/두뇌/입(그리고 나중의 눈)이 전부
|
||||
@@ -51,29 +52,43 @@ STT → 두뇌 → TTS부터 완성**하는 단계다.
|
||||
|
||||
## 3. 귀 / 두뇌 / 입 — 지금 만드는 음성 루프
|
||||
|
||||
### 귀 (STT)
|
||||
- `faster-whisper` 스트리밍/부분 전사. 마이크는 `sounddevice`.
|
||||
- 발화 종료 판정(endpointing)으로 사용자가 말을 멈춘 시점을 빠르게 잡는다.
|
||||
### 귀 (STT) — 디스코드 보이스 수신
|
||||
- 로컬 마이크가 아니라 **디스코드 보이스에서 유저가 말하는 음성을 수신**한다. 셀프봇이
|
||||
보이스 채널에 접속해(이미 통과한 DAVE/MLS E2EE 경로) 유저의 Opus 오디오 RTP를 받고,
|
||||
복호 → Opus 디코드 → PCM으로 만들어 STT에 흘려보낸다.
|
||||
- `faster-whisper`로 실시간 부분 전사를 계속 돌리고, VAD로 발화 종료(endpointing)를 잡는다.
|
||||
종료 판정 시점엔 전사가 거의 끝나 있게 해, 판정 후 추가 지연을 최소화한다.
|
||||
- 디스코드 수신 특성상 지속 스트림 + 지터버퍼(수십 ms)가 붙는다 — 아래 지연 예산에 반영.
|
||||
|
||||
### 두뇌 (Brain)
|
||||
- Claude(OAuth, Haiku 계열)로 대화 응답 생성. 저비용·빠른 모델을 기본으로 한다.
|
||||
- 입력은 "대화이력 + (있으면) 최신 화면 맥락 1건"만 넣어 토큰을 작게 유지한다.
|
||||
- 눈이 없는 지금은 화면 맥락이 비어 있고, 두뇌는 그 사실을 솔직히 말한다.
|
||||
|
||||
### 입 (TTS)
|
||||
- MeloTTS 등(이 호스트에 기존 자산 있음). 문장 단위로 스트리밍 재생.
|
||||
### 입 (TTS) — 한국어 고정, 사람처럼
|
||||
- **한국어 전용**으로, 최대한 자연스러운(사람 같은) 음성을 목표로 한다. 문장 단위 스트리밍 재생.
|
||||
- 인터럽트: 사용자가 말하기 시작하면 재생 중인 TTS를 즉시 멈춘다(barge-in).
|
||||
- 트레이드오프: 가장 사람 같은 합성(예: XTTS 계열)은 느려서 1초 예산과 충돌한다. 그래서
|
||||
빠른 한국어 엔진(MeloTTS, 이 호스트에 자산 있음)으로 첫 문장 지연부터 확보하고,
|
||||
자연스러움이 부족하면 GPU + 문장 스트리밍으로 더 무거운 엔진을 검토한다(품질 vs 지연).
|
||||
|
||||
### 지연 예산(목표)
|
||||
사용자 발화 종료 → 첫 소리까지:
|
||||
### 지연 예산 (목표 ≤ 1초)
|
||||
유저가 디스코드 보이스에서 말을 멈춘 순간 → 첫 소리까지:
|
||||
|
||||
| 구간 | 목표 |
|
||||
|------|------|
|
||||
| STT 종료 판정(endpointing) | ~200 ms |
|
||||
| Brain 첫 토큰 | ~500 ms |
|
||||
| TTS 첫 문장 합성·재생 시작 | ~400 ms |
|
||||
| 여유 | ~400 ms |
|
||||
| **합계** | **~1.5 s** |
|
||||
| 디스코드 보이스 수신 + Opus 디코드(지속 스트림·지터버퍼) | ~80 ms |
|
||||
| STT 종료 판정(VAD) + 마지막 청크 전사 | ~250 ms |
|
||||
| Brain 첫 토큰(Claude Haiku 스트리밍) | ~350 ms |
|
||||
| TTS 첫 문장 합성·재생 시작(한국어) | ~250 ms |
|
||||
| 여유 | ~70 ms |
|
||||
| **합계** | **~1.0 s** |
|
||||
|
||||
- Brain·TTS는 문장 단위 스트리밍이라, 응답 전체 완성이 아니라 "첫 문장"만 준비되면 소리가 난다.
|
||||
- 가장 빡빡한 구간은 **Brain 첫 토큰(네트워크 TTFT)**이다. Haiku로도 300ms대가 목표라,
|
||||
안 되면 로컬 소형 LLM 선응답이나 프롬프트 워밍 등을 검토한다.
|
||||
- 나중에 눈(화면 이해)을 붙여도, 화면 이해는 별도 인지 루프에서 미리 끝나 있어 응답 시점에
|
||||
비전 지연이 끼어들지 않는다.
|
||||
|
||||
---
|
||||
|
||||
@@ -144,11 +159,11 @@ ffmpeg 디코드 → 프레임. DAVE는 `@snazzah/davey`(Rust NAPI), 수신은 `
|
||||
- [ ] **V1 · 진짜 TTS(입).** MeloTTS로 두뇌 응답을 실제 음성으로 합성.
|
||||
· 검증: 응답 텍스트가 .wav로 합성돼 들린다.
|
||||
- [ ] **V2 · 진짜 STT(귀).** faster-whisper로 오디오를 텍스트로 전사.
|
||||
· 검증: 오디오 파일/마이크 입력이 텍스트로 나온다.
|
||||
· 검증: 오디오 파일 입력이 텍스트로 나온다(이후 디스코드 보이스 수신 오디오로 연결).
|
||||
- [ ] **V3 · 진짜 두뇌.** Claude OAuth(Haiku)로 대화 응답 생성.
|
||||
· 검증: 실제 발화에 자연스러운 답이 나온다.
|
||||
- [ ] **V4 · 음성 왕복 + barge-in.** STT→Brain→TTS 스트리밍, 말 끊기, 지연 예산 측정.
|
||||
· 검증: 말로 묻고 말로 답을 듣는다, 첫 소리까지 ~1.5s 근처.
|
||||
- [ ] **V4 · 음성 왕복 + barge-in.** 디스코드 보이스 수신→STT→Brain→TTS 스트리밍, 말 끊기, 지연 측정.
|
||||
· 검증: 디스코드에서 말로 묻고 말로 답을 듣는다, 첫 소리까지 **1초 이내**.
|
||||
- [ ] **(나중) 눈 재개.** 트랙 A/B로 화면공유 수신 → 화면 맥락을 두뇌에 연결.
|
||||
|
||||
---
|
||||
@@ -160,5 +175,9 @@ ffmpeg 디코드 → 프레임. DAVE는 `@snazzah/davey`(Rust NAPI), 수신은 `
|
||||
- **GPU 사용 동의** — RTX 5050으로 STT/TTS를 돌리면 빠르다(규칙상 GPU는 먼저 확인 필요).
|
||||
- **파이썬 버전** — 이 venv는 3.14인데 faster-whisper·MeloTTS는 3.11대가 안전하다.
|
||||
호스트에 이미 MeloTTS용 3.11 자산이 있어, 별도 3.11 venv + subprocess 연결을 제안.
|
||||
- **엔진 선택** — STT는 faster-whisper, TTS는 MeloTTS(한국어) 기본안.
|
||||
- **엔진 선택** — STT는 faster-whisper, TTS는 한국어 고정. 자연스러움 최우선이면 무거운
|
||||
엔진(XTTS 계열)이 필요하지만 1초 예산과 상충 → 우선 빠른 MeloTTS로 시작할지, 처음부터
|
||||
더 사람 같은 엔진을 GPU로 감수할지 결정 필요.
|
||||
- **두뇌** — Claude OAuth(Haiku 계열)로 연결(지금 코드는 API키 기반이라 OAuth 전환 필요).
|
||||
- **STT 입력 경로** — 디스코드 보이스 수신(셀프봇)으로 확정. 유저 음성 Opus RTP를 받아
|
||||
복호·디코드해 STT에 넣는다(로컬 마이크 아님).
|
||||
|
||||
Reference in New Issue
Block a user