마지막 업데이트 2026-07-22
STT 배치 서버(#4)의 하위 모듈 — 오디오 처리(filter/limiter/VAD/PCM)와 세션 상태(turn 버퍼·history·debounce). #4가 "흐름"이라면 본 문서는 그 흐름이 쓰는 "부품".
| 모듈 | 역할 |
|---|---|
pcm.go | PCM int16 ↔ float64 변환, WAV 인코딩/디코딩, AudioDuration(bytes, sr) |
filter.go | Biquad(2nd) + 6th-order HPF / 4th-order LPF Butterworth |
limiter.go | 다이내믹 레인지 제한(ceiling), ProcessWithGain |
processor.go | 파이프라인: HPF 195Hz(6th) → LPF 13kHz(4th) → Limiter 89% |
vad.go | RMS 기반 무음 trim·VAD |
TrimLeadingSilencePCM(pcm, threshold, keepMS, sampleRate) TrimTrailingSilencePCM(...) // RMS < threshold(int16, 예 200) = 무음 CalculateRMS(pcm) // 무음 판정 기준
#4의 handleBatchFinalize가 user leading/trailing·AI 무음을 이 함수들로 잘라낸다(keepMS만큼 보존).
| 구조/함수 | 역할 |
|---|---|
Session.CurrentTurn | 현재 턴 {AIAudio, UserAudio} bytes.Buffer (mutex 보호) |
WriteAudioChunk(speaker, data) | 바이너리 수신분을 current turn 버퍼에 append |
SnapshotAndResetCurrentTurn | API 호출 전 원자 스냅샷+리셋(#4 핵심) |
AddTurnToHistory | 턴을 history에 추가, MaxBatchTurns 초과분 앞에서 제거(슬라이딩) |
BuildCombinedAudioWithCurrent | history(AI+User 순) + 현재 턴 결합, MaxBatchBytes 초과 시 뒤쪽만 보존 |
ConversationHistory | 화자별 텍스트 히스토리(HistorySizePerSpeaker, 화자분리 컨텍스트) |
BatchDebounceState | finalize requestID 발급·최신성(IsLatest) |
BuildCombinedAudioWithCurrent가 각 턴을 AIAudio → UserAudio 순으로 쓴다. 이 순서가 화자분리 First-Speaker Rule(첫 화자=AI, #4)의 전제.
data[len-max:]로 최신만 남김(앞쪽 오래된 컨텍스트 절삭).| 파일/심볼 | 역할 |
|---|---|
| internal/audio/processor.go (DefaultProcessorConfig) | HPF/LPF/Limiter 파이프라인 |
| internal/audio/vad.go (TrimLeading/Trailing L42/119) | 무음 trim·RMS |
| internal/audio/pcm.go | PCM/WAV 변환·duration |
| internal/session/session.go (Snapshot/AddTurn/BuildCombined) | 턴 버퍼·history·debounce |
| internal/session/history.go | 화자별 텍스트 히스토리 |