no longer necessary to call AIService super().start/stop/cancel(frame)

This commit is contained in:
Aleix Conchillo Flaqué
2024-12-12 14:45:20 -08:00
parent 10f854aeba
commit 3f3a853d71
10 changed files with 16 additions and 29 deletions

View File

@@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- It's no longer necessary to call `super().start/stop/cancel(frame)` if you
subclass and implement `AIService.start/stop/cancel()`. This is all now done
internally and will avoid possible issues if you forget to add it.
- It's no longer necessary to call `super().process_frame(frame, direction)` if - It's no longer necessary to call `super().process_frame(frame, direction)` if
you subclass and implement `FrameProcessor.process_frame()`. This is all now you subclass and implement `FrameProcessor.process_frame()`. This is all now
done internally and will avoid possible issues if you forget to add it. done internally and will avoid possible issues if you forget to add it.

View File

@@ -111,11 +111,11 @@ class AIService(FrameProcessor):
async def process_frame(self, frame: Frame, direction: FrameDirection): async def process_frame(self, frame: Frame, direction: FrameDirection):
if isinstance(frame, StartFrame): if isinstance(frame, StartFrame):
await self.start(frame) await self._start(frame)
elif isinstance(frame, CancelFrame): elif isinstance(frame, CancelFrame):
await self.cancel(frame) await self._cancel(frame)
elif isinstance(frame, EndFrame): elif isinstance(frame, EndFrame):
await self.stop(frame) await self._stop(frame)
async def process_generator(self, generator: AsyncGenerator[Frame | None, None]): async def process_generator(self, generator: AsyncGenerator[Frame | None, None]):
async for f in generator: async for f in generator:
@@ -125,6 +125,15 @@ class AIService(FrameProcessor):
else: else:
await self.push_frame(f) await self.push_frame(f)
async def _start(self, frame: StartFrame):
await self.start(frame)
async def _stop(self, frame: EndFrame):
await self.stop(frame)
async def _cancel(self, frame: CancelFrame):
await self.cancel(frame)
class LLMService(AIService): class LLMService(AIService):
"""This class is a no-op but serves as a base class for LLM services.""" """This class is a no-op but serves as a base class for LLM services."""
@@ -248,19 +257,16 @@ class TTSService(AIService):
pass pass
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
if self._push_stop_frames: if self._push_stop_frames:
self._stop_frame_task = self.get_event_loop().create_task(self._stop_frame_handler()) self._stop_frame_task = self.get_event_loop().create_task(self._stop_frame_handler())
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
if self._stop_frame_task: if self._stop_frame_task:
self._stop_frame_task.cancel() self._stop_frame_task.cancel()
await self._stop_frame_task await self._stop_frame_task
self._stop_frame_task = None self._stop_frame_task = None
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
if self._stop_frame_task: if self._stop_frame_task:
self._stop_frame_task.cancel() self._stop_frame_task.cancel()
await self._stop_frame_task await self._stop_frame_task

View File

@@ -61,15 +61,12 @@ class AssemblyAISTTService(STTService):
self._settings["language"] = language self._settings["language"] = language
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
await self._connect() await self._connect()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._disconnect() await self._disconnect()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._disconnect() await self._disconnect()
async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]: async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]:

View File

@@ -676,16 +676,13 @@ class AzureSTTService(STTService):
yield None yield None
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
self._speech_recognizer.start_continuous_recognition_async() self._speech_recognizer.start_continuous_recognition_async()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
self._speech_recognizer.stop_continuous_recognition_async() self._speech_recognizer.stop_continuous_recognition_async()
self._audio_stream.close() self._audio_stream.close()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
self._speech_recognizer.stop_continuous_recognition_async() self._speech_recognizer.stop_continuous_recognition_async()
self._audio_stream.close() self._audio_stream.close()

View File

@@ -84,11 +84,9 @@ class CanonicalMetricsService(AIService):
self._output_dir = output_dir self._output_dir = output_dir
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._process_audio() await self._process_audio()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._process_audio() await self._process_audio()
async def process_frame(self, frame: Frame, direction: FrameDirection): async def process_frame(self, frame: Frame, direction: FrameDirection):

View File

@@ -176,15 +176,12 @@ class DeepgramSTTService(STTService):
await self._connect() await self._connect()
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
await self._connect() await self._connect()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._disconnect() await self._disconnect()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._disconnect() await self._disconnect()
async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]: async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]:

View File

@@ -229,15 +229,12 @@ class GeminiMultimodalLiveLLMService(LLMService):
# #
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
await self._connect() await self._connect()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._disconnect() await self._disconnect()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._disconnect() await self._disconnect()
# #

View File

@@ -177,18 +177,15 @@ class GladiaSTTService(STTService):
return language_to_gladia_language(language) return language_to_gladia_language(language)
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
response = await self._setup_gladia() response = await self._setup_gladia()
self._websocket = await websockets.connect(response["url"]) self._websocket = await websockets.connect(response["url"])
self._receive_task = self.get_event_loop().create_task(self._receive_task_handler()) self._receive_task = self.get_event_loop().create_task(self._receive_task_handler())
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._send_stop_recording() await self._send_stop_recording()
await self._websocket.close() await self._websocket.close()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._websocket.close() await self._websocket.close()
async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]: async def run_stt(self, audio: bytes) -> AsyncGenerator[Frame, None]:

View File

@@ -112,15 +112,12 @@ class OpenAIRealtimeBetaLLMService(LLMService):
# #
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
await self._connect() await self._connect()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._disconnect() await self._disconnect()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._disconnect() await self._disconnect()
# #

View File

@@ -187,17 +187,14 @@ class ParakeetSTTService(STTService):
return False return False
async def start(self, frame: StartFrame): async def start(self, frame: StartFrame):
await super().start(frame)
self._thread_task = self.get_event_loop().create_task(self._thread_task_handler()) self._thread_task = self.get_event_loop().create_task(self._thread_task_handler())
self._response_task = self.get_event_loop().create_task(self._response_task_handler()) self._response_task = self.get_event_loop().create_task(self._response_task_handler())
self._response_queue = asyncio.Queue() self._response_queue = asyncio.Queue()
async def stop(self, frame: EndFrame): async def stop(self, frame: EndFrame):
await super().stop(frame)
await self._stop_tasks() await self._stop_tasks()
async def cancel(self, frame: CancelFrame): async def cancel(self, frame: CancelFrame):
await super().cancel(frame)
await self._stop_tasks() await self._stop_tasks()
async def _stop_tasks(self): async def _stop_tasks(self):