Refactored VAD analyzer to process multiple audio frames in a single iteration if needed.

This commit is contained in:
Filipi Fuchter
2025-07-11 10:59:32 -03:00
parent 1a146c2a64
commit 5c3f4180b9

View File

@@ -183,36 +183,37 @@ class VADAnalyzer(ABC):
if len(self._vad_buffer) < num_required_bytes: if len(self._vad_buffer) < num_required_bytes:
return self._vad_state return self._vad_state
audio_frames = self._vad_buffer[:num_required_bytes] while len(self._vad_buffer) >= num_required_bytes:
self._vad_buffer = 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) volume = self._get_smoothed_volume(audio_frames)
self._prev_volume = volume 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: if speaking:
match self._vad_state: match self._vad_state:
case VADState.QUIET: case VADState.QUIET:
self._vad_state = VADState.STARTING self._vad_state = VADState.STARTING
self._vad_starting_count = 1 self._vad_starting_count = 1
case VADState.STARTING: case VADState.STARTING:
self._vad_starting_count += 1 self._vad_starting_count += 1
case VADState.STOPPING: case VADState.STOPPING:
self._vad_state = VADState.SPEAKING self._vad_state = VADState.SPEAKING
self._vad_stopping_count = 0 self._vad_stopping_count = 0
else: else:
match self._vad_state: match self._vad_state:
case VADState.STARTING: case VADState.STARTING:
self._vad_state = VADState.QUIET self._vad_state = VADState.QUIET
self._vad_starting_count = 0 self._vad_starting_count = 0
case VADState.SPEAKING: case VADState.SPEAKING:
self._vad_state = VADState.STOPPING self._vad_state = VADState.STOPPING
self._vad_stopping_count = 1 self._vad_stopping_count = 1
case VADState.STOPPING: case VADState.STOPPING:
self._vad_stopping_count += 1 self._vad_stopping_count += 1
if ( if (
self._vad_state == VADState.STARTING self._vad_state == VADState.STARTING