| | |
| | | "traceId": trace_id, |
| | | "turnId": turn_id, |
| | | "eventName": event_name, |
| | | "eventWallTimeMs": current_time_millis(), |
| | | "result": result, |
| | | "reasonCode": reason_code, |
| | | "retryable": retryable, |
| | |
| | | rms_threshold: f64_env("CV_VAD_RMS_THRESHOLD", 0.012), |
| | | peak_threshold: f64_env("CV_VAD_PEAK_THRESHOLD", 0.08), |
| | | start_frames: u32_env("CV_VAD_START_FRAMES", 5).max(1), |
| | | end_silence_ms: u64_env("CV_VAD_END_SILENCE_MS", 700).max(100), |
| | | min_speech_ms: u64_env("CV_VAD_MIN_SPEECH_MS", 300).max(1), |
| | | end_silence_ms: u64_env("CV_VAD_END_SILENCE_MS", 400).max(100), |
| | | min_speech_ms: u64_env("CV_VAD_MIN_SPEECH_MS", 250).max(1), |
| | | max_turn_ms: u64_env("CV_VAD_MAX_TURN_MS", 10_000).max(1_000), |
| | | initial_ignore_ms: u64_env("CV_VAD_INITIAL_IGNORE_MS", 500), |
| | | } |
| | |
| | | return None; |
| | | } |
| | | |
| | | let voiced = rms >= self.config.rms_threshold || peak >= self.config.peak_threshold; |
| | | // Align with cb-sdk's energy-based segmentation: peak is diagnostic only, |
| | | // otherwise isolated spikes can keep a turn open until max_turn_ms. |
| | | let voiced = rms >= self.config.rms_threshold; |
| | | if !self.in_speech { |
| | | self.remember_pre_speech_frame(frame); |
| | | } |