# 음성 파이프라인 핵심 패턴 ## 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 불필요)