마지막 업데이트 2026-07-22
아동 마이크 입력을 OpenAI로 보내기 전에 가공하는 Web Audio 기반 DSP 체인. 노이즈 게이트로 무음 구간을 닫고, EQ로 음성 대역을 다듬고, 컴프레서/리미터로 레벨을 고르게 만든다. 파라미터는 사운드 엔지니어 자문값으로 코드에 하드코딩되어 있다.
createMediaStream에서 항상 적용된다. getUserMedia(또는 증폭기 #17 출력) → audioProcessingChain.processMediaStream(stream) → 반환된 stream이 pc.addTrack으로 OpenAI에 송출. 세션 시작 후 startProcessing()으로 게이트 모니터링 루프 가동.
destination.stream이 반환값. analyser는 source에서 별도 분기(terminal)라 재생 경로에 영향 없음 — RMS 측정 전용.
DynamicsCompressor가 아니라 GainNode + JS 모니터링 루프로 직접 구현한 히스테리시스 게이트. 20ms마다 analyser의 time-domain RMS(dBFS)를 재서 게인을 토글한다.
// 20ms 간격(MONITOR_INTERVAL_MS) analyser.getFloatTimeDomainData(buffer); levelDb = calculateRMSDb(buffer); if (levelDb > -40) // OPEN 임계 초과 → 게이트 열기 gateGain.gain.setTargetAtTime(1.0, t, 0.0035); // 3.5ms attack else if (levelDb < -55) // CLOSE 임계 미만 → 게이트 닫기 gateGain.gain.setTargetAtTime(0.001, t, 0.25); // 250ms release, noise floor
0.001(거의 무음) — 완전 차단이 아니라 noise floor로 낮춤.gateClosed, lastLevelDb)는 onStatusChange 콜백으로 외부에 통지(UI/로그).| 밴드 | type | 설정 | 목적 |
|---|---|---|---|
| High-pass | highpass | 155Hz, Q 0.5 | 저역 험/진동 제거 |
| Peaking | peaking | 210Hz, -4.5dB, Q 1.30 | 저중역 부밍 감쇠 |
| Low-pass | lowpass | 13kHz, Q 0.67 | 고역 노이즈/치찰음 제거 |
| 노드 | threshold | ratio | attack/release | knee |
|---|---|---|---|---|
| Compressor | -14dB | 8:1 | 9ms / 100ms | 0 (hard) |
| Limiter | -12dB | 20:1 | 1ms / 10ms | 0 (hard) |
DynamicsCompressorNode. 리미터는 높은 ratio(20:1) + 빠른 attack(1ms)로 사실상 천장 역할.outputGain = 0.891 (= -1dB). 리미터 뒤에서 최종 피크를 -1dB로 억제.| 메서드 | 역할 |
|---|---|
processMediaStream(stream) | 기존 컨텍스트 정리 → 새 AudioContext + 노드 그래프 구성 → processedStream 반환. 실패 시 원본 stream 그대로 반환(graceful) |
startProcessing() | 20ms 게이트 모니터링 루프 시작(중복 시작 방지) |
stopProcessing() | 모니터링 루프 중지 |
cleanup() | 루프 중지 + AudioContext close + 모든 ref null |
getStatus / setOnStatusChange | 게이트 상태 조회/콜백 등록 |
startProcessing의 전제(analyser/gateGain 필요).| 파일 | 역할 |
|---|---|
| hooks/use-audio-processing-chain.ts | DSP 체인 본체(그래프·게이트 루프·라이프사이클) |
| hooks/use-session-manager.ts:996–1034 | createMediaStream에서 호출(항상 적용) |
| hooks/use-volume-amplifier.ts | 이 체인 앞단(내장 마이크 한정, #17) |