diff --git a/CHANGELOG.md b/CHANGELOG.md index c381ac630..f6debb3b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `VADParams` so you can control voice confidence level and others. +- `VADAnalyzer` now uses an exponential smoothing to avoid sudden changes. + ### Fixed - Fixed issues with Ctrl-C program termination. diff --git a/examples/foundational/07-interruptible.py b/examples/foundational/07-interruptible.py index c1cba90a7..67c2eddc9 100644 --- a/examples/foundational/07-interruptible.py +++ b/examples/foundational/07-interruptible.py @@ -28,7 +28,7 @@ from dotenv import load_dotenv load_dotenv(override=True) logger.remove(0) -logger.add(sys.stderr, level="TRACE") +logger.add(sys.stderr, level="DEBUG") async def main(room_url: str, token): diff --git a/src/pipecat/vad/vad_analyzer.py b/src/pipecat/vad/vad_analyzer.py index 6c4afceba..23f7263ab 100644 --- a/src/pipecat/vad/vad_analyzer.py +++ b/src/pipecat/vad/vad_analyzer.py @@ -20,7 +20,7 @@ class VADState(Enum): class VADParams(BaseModel): - confidence: float = 0.8 + confidence: float = 0.6 start_secs: float = 0.2 stop_secs: float = 0.8 @@ -43,6 +43,10 @@ class VADAnalyzer: self._vad_buffer = b"" + # Exponential smoothing + self._smoothing_factor = 0.6 + self._prev_confidence = 1 - self._smoothing_factor + @property def sample_rate(self): return self._sample_rate @@ -55,6 +59,11 @@ class VADAnalyzer: def voice_confidence(self, buffer) -> float: pass + def _smoothed_confidence(self, audio_frames, prev_confidence, factor): + confidence = self.voice_confidence(audio_frames) + smoothed = exp_smoothing(confidence, prev_confidence, factor) + return smoothed + def analyze_audio(self, buffer) -> VADState: self._vad_buffer += buffer @@ -65,7 +74,10 @@ class VADAnalyzer: 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._smoothed_confidence( + audio_frames, self._prev_confidence, self._smoothing_factor) + self._prev_confidence = confidence + speaking = confidence >= self._params.confidence if speaking: