Fixed KrispVivaTurn to properly release the Krisp SDK.

This commit is contained in:
filipi87
2026-01-09 10:31:17 -03:00
parent 311da30802
commit de5de0b162
3 changed files with 10 additions and 18 deletions

View File

@@ -120,3 +120,7 @@ class BaseTurnAnalyzer(ABC):
def clear(self):
"""Reset the turn analyzer to its initial state."""
pass
async def cleanup(self):
"""Cleanup the turn analyzer."""
pass

View File

@@ -133,7 +133,7 @@ class KrispVivaTurn(BaseTurnAnalyzer):
self._sdk_acquired = False
raise
def __del__(self):
async def cleanup(self):
"""Release SDK reference when analyzer is destroyed."""
if self._sdk_acquired:
try:
@@ -192,8 +192,7 @@ class KrispVivaTurn(BaseTurnAnalyzer):
# Create session when sample rate is set
try:
self._tt_session = self._create_tt_session(self._sample_rate)
# Clear buffer when sample rate changes
self._audio_buffer.clear()
self.clear()
except Exception as e:
logger.error(f"Failed to create turn detection session: {e}", exc_info=True)
self._tt_session = None
@@ -310,7 +309,7 @@ class KrispVivaTurn(BaseTurnAnalyzer):
# confirms with sufficient confidence
if self._speech_triggered and prob >= self._params.threshold:
state = EndOfTurnState.COMPLETE
self._clear(state)
self.clear()
break
# Store the last state for analyze_end_of_turn()
@@ -336,18 +335,6 @@ class KrispVivaTurn(BaseTurnAnalyzer):
def clear(self):
"""Reset the turn analyzer to its initial state."""
self._clear(EndOfTurnState.COMPLETE)
def _clear(self, turn_state: EndOfTurnState):
"""Clear internal state based on turn completion status.
Args:
turn_state: The end-of-turn state to use for clearing.
"""
# If the state is still incomplete, keep the _speech_triggered as True
self._speech_triggered = turn_state == EndOfTurnState.INCOMPLETE
# Clear audio buffer on turn completion
if turn_state == EndOfTurnState.COMPLETE:
self._audio_buffer.clear()
# Reset last state when clearing
self._speech_triggered = False
self._audio_buffer.clear()
self._last_state = EndOfTurnState.INCOMPLETE

View File

@@ -72,6 +72,7 @@ class TurnAnalyzerUserTurnStopStrategy(BaseUserTurnStopStrategy):
async def cleanup(self):
"""Cleanup the strategy."""
await super().cleanup()
await self._turn_analyzer.cleanup()
if self._task:
await self.task_manager.cancel_task(self._task)
self._task = None