d3ro-voice/docs/re-findings/voice-pipeline-patterns.md
Yun Chan e24bb8378c 초기 프로젝트 설정: 하네스 시스템 + 설계서 + RE 노하우
- CLAUDE.md: 프로젝트 규칙, 기술 스택, 코딩 규칙, 페이즈 로드맵
- .claude/settings.json: 권한, 강제 훅 (매 프롬프트 설계서 규칙 주입)
- .claude/skills/: implement-phase, review-phase, scaffold, test-commit, debug
- .claude/agents/: electron-architect, voice-pipeline-expert, ui-specialist
- docs/design/00-09: 마스터 아키텍처, 서비스 명세(16개), IPC(113채널),
  DB스키마, UI컴포넌트, 검증리포트, 외부엔진연동, 갭분석,
  VoiceMode패턴, 디자인시스템, 히스토리팝업
- docs/phases/1-7+3.5: 전체 구현 페이즈 문서
- docs/re-findings/: Speakly RE 노하우 5개 문서
2026-04-05 01:03:03 +09:00

44 lines
1.5 KiB
Markdown

# 음성 파이프라인 핵심 패턴
## 1. 상태 머신 (RecognitionState)
```
IDLE → PREPARING → CONNECTING → READY → RECOGNIZING → COMPLETED/CANCELLED/ERROR/DESTROYED
```
- AudioState는 별도: IDLE → INITIALIZING → STREAMING → STOPPED
- 모든 진입점에 `_isInTerminalState()` 가드
- `errorEmitted` 플래그: error 이벤트 후 finish 중복 방지
- `settled` boolean: Promise 이중 resolve/reject 방지
## 2. 이중 조건 플러시 (가장 영리한 패턴)
```
_connect() ← 비동기 (모델 로딩 대체)
_captureContextInBackground() ← 비동기 (오디오 버퍼링 대체)
각 완료 시 → _tryFlushAll() 호출
if (isReady AND isConnected):
flushMessageQueue() // 설정 먼저
flushAudioBuffer() // 오디오 후
```
- 오디오 손실 방지가 최우선
## 3. 재연결 3계층
```
_connect (고수준, 리포팅)
→ _connectWithRetry (1초 간격, 60초 제한)
→ _connectOnce (5초 하드 타임아웃, DNS/TCP/TLS 계측)
```
- 403 인증 실패: 즉시 포기
- 오프라인: 즉시 포기
- 기타: 1초 후 재시도
## 4. 타이밍 상수
- 하트비트: 5초 ping, 15초 타임아웃 (3x 규칙)
- 녹음 후 대기: 4초 (버퍼 있으면 6초)
- 완료 아이들 타임아웃: 30초
- 절대 최대 대기: 120초
- 최소 오디오: 700ms (이하 취소)
- 더블프레스: 300ms 이내
## 5. 오디오 포맷
- Speakly: 24kHz mono, Opus 24kbps, 60ms 프레임
- D3RO-VOICE: 16kHz mono, PCM16 (Whisper 기본, Opus 불필요)