diff --git a/src/pipecat/services/stt_service.py b/src/pipecat/services/stt_service.py index 62d72da53..a02619e44 100644 --- a/src/pipecat/services/stt_service.py +++ b/src/pipecat/services/stt_service.py @@ -15,6 +15,7 @@ from loguru import logger from pipecat.frames.frames import ( AudioRawFrame, + ErrorFrame, Frame, StartFrame, STTMuteFrame, @@ -24,6 +25,7 @@ from pipecat.frames.frames import ( ) from pipecat.processors.frame_processor import FrameDirection from pipecat.services.ai_service import AIService +from pipecat.services.websocket_service import WebsocketService from pipecat.transcriptions.language import Language @@ -283,3 +285,35 @@ class SegmentedSTTService(STTService): if not self._user_speaking and len(self._audio_buffer) > self._audio_buffer_size_1s: discarded = len(self._audio_buffer) - self._audio_buffer_size_1s self._audio_buffer = self._audio_buffer[discarded:] + + +class WebsocketSTTService(STTService, WebsocketService): + """Base class for websocket-based STT services. + + Combines STT functionality with websocket connectivity, providing automatic + error handling and reconnection capabilities. + + Event handlers: + on_connection_error: Called when a websocket connection error occurs. + + Example:: + + @stt.event_handler("on_connection_error") + async def on_connection_error(stt: STTService, error: str): + logger.error(f"STT connection error: {error}") + """ + + def __init__(self, *, reconnect_on_error: bool = True, **kwargs): + """Initialize the Websocket STT service. + + Args: + reconnect_on_error: Whether to automatically reconnect on websocket errors. + **kwargs: Additional arguments passed to parent classes. + """ + STTService.__init__(self, **kwargs) + WebsocketService.__init__(self, reconnect_on_error=reconnect_on_error, **kwargs) + self._register_event_handler("on_connection_error") + + async def _report_error(self, error: ErrorFrame): + await self._call_event_handler("on_connection_error", error.error) + await self.push_error(error)