From 5c3f4180b9bee2cc30f7ec91411f23f7303e5ae2 Mon Sep 17 00:00:00 2001 From: Filipi Fuchter Date: Fri, 11 Jul 2025 10:59:32 -0300 Subject: [PATCH] Refactored VAD analyzer to process multiple audio frames in a single iteration if needed. --- src/pipecat/audio/vad/vad_analyzer.py | 53 ++++++++++++++------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/pipecat/audio/vad/vad_analyzer.py b/src/pipecat/audio/vad/vad_analyzer.py index 5c92d390c..4560aa8cc 100644 --- a/src/pipecat/audio/vad/vad_analyzer.py +++ b/src/pipecat/audio/vad/vad_analyzer.py @@ -183,36 +183,37 @@ class VADAnalyzer(ABC): if len(self._vad_buffer) < num_required_bytes: return self._vad_state - audio_frames = self._vad_buffer[:num_required_bytes] - self._vad_buffer = self._vad_buffer[num_required_bytes:] + while len(self._vad_buffer) >= num_required_bytes: + audio_frames = self._vad_buffer[:num_required_bytes] + self._vad_buffer = self._vad_buffer[num_required_bytes:] - confidence = self.voice_confidence(audio_frames) + confidence = self.voice_confidence(audio_frames) - volume = self._get_smoothed_volume(audio_frames) - self._prev_volume = volume + volume = self._get_smoothed_volume(audio_frames) + self._prev_volume = volume - speaking = confidence >= self._params.confidence and volume >= self._params.min_volume + speaking = confidence >= self._params.confidence and volume >= self._params.min_volume - if speaking: - match self._vad_state: - case VADState.QUIET: - self._vad_state = VADState.STARTING - self._vad_starting_count = 1 - case VADState.STARTING: - self._vad_starting_count += 1 - case VADState.STOPPING: - self._vad_state = VADState.SPEAKING - self._vad_stopping_count = 0 - else: - match self._vad_state: - case VADState.STARTING: - self._vad_state = VADState.QUIET - self._vad_starting_count = 0 - case VADState.SPEAKING: - self._vad_state = VADState.STOPPING - self._vad_stopping_count = 1 - case VADState.STOPPING: - self._vad_stopping_count += 1 + if speaking: + match self._vad_state: + case VADState.QUIET: + self._vad_state = VADState.STARTING + self._vad_starting_count = 1 + case VADState.STARTING: + self._vad_starting_count += 1 + case VADState.STOPPING: + self._vad_state = VADState.SPEAKING + self._vad_stopping_count = 0 + else: + match self._vad_state: + case VADState.STARTING: + self._vad_state = VADState.QUIET + self._vad_starting_count = 0 + case VADState.SPEAKING: + self._vad_state = VADState.STOPPING + self._vad_stopping_count = 1 + case VADState.STOPPING: + self._vad_stopping_count += 1 if ( self._vad_state == VADState.STARTING