Append-only ring buffer of VAD frames in stream-relative ms order.
pushFrame is O(1) amortized; framesInWindow is O(n) over kept frames,
which is fine for the per-word lookups we do (a 30 s window at 50 frames/s
per channel × 2 channels = 3000 entries, scanned once per word).
Runtime-agnostic — no DOM or Web Audio dependencies.
Append-only ring buffer of VAD frames in stream-relative ms order.
pushFrameis O(1) amortized;framesInWindowis O(n) over kept frames, which is fine for the per-word lookups we do (a 30 s window at 50 frames/s per channel × 2 channels = 3000 entries, scanned once per word).Runtime-agnostic — no DOM or Web Audio dependencies.