Added two new lifecycle callbacks to AudioContextTTSService: on_audio_context_interrupted() and on_audio_context_completed()
This commit is contained in:
@@ -1190,6 +1190,7 @@ class AudioContextTTSService(WebsocketTTSService):
|
|||||||
async def _handle_interruption(self, frame: InterruptionFrame, direction: FrameDirection):
|
async def _handle_interruption(self, frame: InterruptionFrame, direction: FrameDirection):
|
||||||
await super()._handle_interruption(frame, direction)
|
await super()._handle_interruption(frame, direction)
|
||||||
await self._stop_audio_context_task()
|
await self._stop_audio_context_task()
|
||||||
|
await self.on_audio_context_interrupted(context_id=self._context_id)
|
||||||
self.reset_active_audio_context()
|
self.reset_active_audio_context()
|
||||||
self._create_audio_context_task()
|
self._create_audio_context_task()
|
||||||
|
|
||||||
@@ -1218,6 +1219,7 @@ class AudioContextTTSService(WebsocketTTSService):
|
|||||||
|
|
||||||
# We just finished processing the context, so we can safely remove it.
|
# We just finished processing the context, so we can safely remove it.
|
||||||
del self._contexts[context_id]
|
del self._contexts[context_id]
|
||||||
|
await self.on_audio_context_completed(context_id=context_id)
|
||||||
self.reset_active_audio_context()
|
self.reset_active_audio_context()
|
||||||
|
|
||||||
# Append some silence between sentences.
|
# Append some silence between sentences.
|
||||||
@@ -1254,6 +1256,35 @@ class AudioContextTTSService(WebsocketTTSService):
|
|||||||
logger.trace(f"{self} time out on audio context {context_id}")
|
logger.trace(f"{self} time out on audio context {context_id}")
|
||||||
break
|
break
|
||||||
|
|
||||||
|
async def on_audio_context_interrupted(self, context_id: str):
|
||||||
|
"""Called when an audio context is cancelled due to an interruption.
|
||||||
|
|
||||||
|
Override this in a subclass to perform provider-specific cleanup (e.g.
|
||||||
|
sending a cancel/close message over the WebSocket) when the bot is
|
||||||
|
interrupted mid-speech. The audio context task has already been stopped
|
||||||
|
and the active context has **not** yet been reset when this is called,
|
||||||
|
so ``context_id`` reflects the context that was cut short.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
context_id: The ID of the audio context that was interrupted, or
|
||||||
|
``None`` if no context was active at the time.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def on_audio_context_completed(self, context_id: str):
|
||||||
|
"""Called after an audio context has finished playing all of its audio.
|
||||||
|
|
||||||
|
Override this in a subclass to perform provider-specific cleanup (e.g.
|
||||||
|
sending a close-context message to free server-side resources) once an
|
||||||
|
audio context has been fully processed. The context entry has already
|
||||||
|
been removed from the internal context map, and the active context has
|
||||||
|
**not** yet been reset when this is called.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
context_id: The ID of the audio context that finished processing.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class AudioContextWordTTSService(AudioContextTTSService):
|
class AudioContextWordTTSService(AudioContextTTSService):
|
||||||
"""Deprecated. Use AudioContextTTSService with supports_word_timestamps=True instead.
|
"""Deprecated. Use AudioContextTTSService with supports_word_timestamps=True instead.
|
||||||
|
|||||||
Reference in New Issue
Block a user