- 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개 문서
44 lines
1.5 KiB
Markdown
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 불필요)
|