docs(readme): hold Brain at 350ms, trim STT 250->150 and TTS 250->170 (total ~0.85s)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
25
README.md
25
README.md
@@ -57,7 +57,8 @@ STT → 두뇌 → TTS부터 완성**하는 단계다.
|
|||||||
보이스 채널에 접속해(이미 통과한 DAVE/MLS E2EE 경로) 유저의 Opus 오디오 RTP를 받고,
|
보이스 채널에 접속해(이미 통과한 DAVE/MLS E2EE 경로) 유저의 Opus 오디오 RTP를 받고,
|
||||||
복호 → Opus 디코드 → PCM으로 만들어 STT에 흘려보낸다.
|
복호 → Opus 디코드 → PCM으로 만들어 STT에 흘려보낸다.
|
||||||
- `faster-whisper`로 실시간 부분 전사를 계속 돌리고, VAD로 발화 종료(endpointing)를 잡는다.
|
- `faster-whisper`로 실시간 부분 전사를 계속 돌리고, VAD로 발화 종료(endpointing)를 잡는다.
|
||||||
종료 판정 시점엔 전사가 거의 끝나 있게 해, 판정 후 추가 지연을 최소화한다.
|
종료 판정 시점엔 전사가 사실상 끝나 있어, 판정 후 남는 건 VAD hangover + 짧은 마지막
|
||||||
|
디코드뿐이다. 목표 종료→텍스트 확정 ~150ms.
|
||||||
- 디스코드 수신 특성상 지속 스트림 + 지터버퍼(수십 ms)가 붙는다 — 아래 지연 예산에 반영.
|
- 디스코드 수신 특성상 지속 스트림 + 지터버퍼(수십 ms)가 붙는다 — 아래 지연 예산에 반영.
|
||||||
|
|
||||||
### 두뇌 (Brain)
|
### 두뇌 (Brain)
|
||||||
@@ -66,7 +67,9 @@ STT → 두뇌 → TTS부터 완성**하는 단계다.
|
|||||||
- 눈이 없는 지금은 화면 맥락이 비어 있고, 두뇌는 그 사실을 솔직히 말한다.
|
- 눈이 없는 지금은 화면 맥락이 비어 있고, 두뇌는 그 사실을 솔직히 말한다.
|
||||||
|
|
||||||
### 입 (TTS) — 한국어 고정, 사람처럼
|
### 입 (TTS) — 한국어 고정, 사람처럼
|
||||||
- **한국어 전용**으로, 최대한 자연스러운(사람 같은) 음성을 목표로 한다. 문장 단위 스트리밍 재생.
|
- **한국어 전용**으로, 최대한 자연스러운(사람 같은) 음성을 목표로 한다.
|
||||||
|
- 지연을 줄이려고 첫 문장 전체를 기다리지 않고 **첫 짧은 구절부터 청크 스트리밍으로 재생**한다
|
||||||
|
(나머지는 재생되는 동안 이어서 합성). 목표 첫 소리 ~170ms.
|
||||||
- 인터럽트: 사용자가 말하기 시작하면 재생 중인 TTS를 즉시 멈춘다(barge-in).
|
- 인터럽트: 사용자가 말하기 시작하면 재생 중인 TTS를 즉시 멈춘다(barge-in).
|
||||||
- 트레이드오프: 가장 사람 같은 합성(예: XTTS 계열)은 느려서 1초 예산과 충돌한다. 그래서
|
- 트레이드오프: 가장 사람 같은 합성(예: XTTS 계열)은 느려서 1초 예산과 충돌한다. 그래서
|
||||||
빠른 한국어 엔진(MeloTTS, 이 호스트에 자산 있음)으로 첫 문장 지연부터 확보하고,
|
빠른 한국어 엔진(MeloTTS, 이 호스트에 자산 있음)으로 첫 문장 지연부터 확보하고,
|
||||||
@@ -78,15 +81,19 @@ STT → 두뇌 → TTS부터 완성**하는 단계다.
|
|||||||
| 구간 | 목표 |
|
| 구간 | 목표 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| 디스코드 보이스 수신 + Opus 디코드(지속 스트림·지터버퍼) | ~80 ms |
|
| 디스코드 보이스 수신 + Opus 디코드(지속 스트림·지터버퍼) | ~80 ms |
|
||||||
| STT 종료 판정(VAD) + 마지막 청크 전사 | ~250 ms |
|
| STT 종료 판정(VAD) + 마지막 청크 전사 | ~150 ms |
|
||||||
| Brain 첫 토큰(Claude Haiku 스트리밍) | ~350 ms |
|
| Brain 첫 토큰(Claude Haiku 스트리밍) | ~350 ms |
|
||||||
| TTS 첫 문장 합성·재생 시작(한국어) | ~250 ms |
|
| TTS 첫 문장 합성·재생 시작(한국어) | ~170 ms |
|
||||||
| 여유 | ~70 ms |
|
| 여유 | ~100 ms |
|
||||||
| **합계** | **~1.0 s** |
|
| **합계** | **~0.85 s** |
|
||||||
|
|
||||||
- Brain·TTS는 문장 단위 스트리밍이라, 응답 전체 완성이 아니라 "첫 문장"만 준비되면 소리가 난다.
|
- **Brain(머리)은 네트워크 TTFT라 우리가 못 줄인다 → 350ms로 고정.** 대신 우리 GPU에서
|
||||||
- 가장 빡빡한 구간은 **Brain 첫 토큰(네트워크 TTFT)**이다. Haiku로도 300ms대가 목표라,
|
도는 STT·TTS를 깎아 여유를 벌었다. 두 구간을 어떻게 줄이는지는 아래.
|
||||||
안 되면 로컬 소형 LLM 선응답이나 프롬프트 워밍 등을 검토한다.
|
- STT ~150ms: 발화 중 부분전사를 계속 돌려 종료 판정 시점엔 전사가 사실상 끝나 있게 한다.
|
||||||
|
남는 건 VAD hangover(~120ms) + 마지막 짧은 디코드(~30ms)뿐.
|
||||||
|
- TTS ~170ms: 첫 문장 전체가 아니라 **첫 짧은 구절만 먼저** 합성해 청크 스트리밍으로
|
||||||
|
바로 재생을 시작한다(나머지는 재생되는 동안 이어서 합성).
|
||||||
|
- Brain·TTS는 스트리밍이라, 응답 전체 완성이 아니라 "첫 소리"만 준비되면 재생된다.
|
||||||
- 나중에 눈(화면 이해)을 붙여도, 화면 이해는 별도 인지 루프에서 미리 끝나 있어 응답 시점에
|
- 나중에 눈(화면 이해)을 붙여도, 화면 이해는 별도 인지 루프에서 미리 끝나 있어 응답 시점에
|
||||||
비전 지연이 끼어들지 않는다.
|
비전 지연이 끼어들지 않는다.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user