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

1.5 KiB

음성 파이프라인 핵심 패턴

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 불필요)