diff --git a/src/anam/_streaming.py b/src/anam/_streaming.py index f153d19..fbe3dd2 100644 --- a/src/anam/_streaming.py +++ b/src/anam/_streaming.py @@ -41,6 +41,7 @@ def __init__( on_message: Callable[[dict[str, Any]], Awaitable[None]] | None = None, on_connection_established: Callable[[], Awaitable[None]] | None = None, on_connection_closed: Callable[[str, str | None], Awaitable[None]] | None = None, + on_session_ready: Callable[[], Awaitable[None]] | None = None, custom_ice_servers: list[dict[str, Any]] | None = None, ): """Initialize the streaming client. @@ -50,6 +51,7 @@ def __init__( on_message: Callback for data channel messages. on_connection_established: Callback when connected. on_connection_closed: Callback when disconnected. + on_session_ready: Callback when sessionready signal is received (ready to receive TTS). custom_ice_servers: Custom ICE servers (optional). """ self._session_info = session_info @@ -59,6 +61,7 @@ def __init__( self._on_message = on_message self._on_connection_established = on_connection_established self._on_connection_closed = on_connection_closed + self._on_session_ready = on_session_ready # Configuration self._ice_servers = custom_ice_servers or session_info.ice_servers @@ -145,6 +148,8 @@ async def _handle_signal_message(self, message: dict[str, Any]) -> None: elif action_type == SignalAction.SESSION_READY.value: logger.info("Session ready") + if self._on_session_ready: + await self._on_session_ready() elif action_type == SignalAction.TALK_STREAM_INTERRUPTED.value: correlation_id = payload.get("correlationId") if isinstance(payload, dict) else None diff --git a/src/anam/client.py b/src/anam/client.py index 49bf421..6b8e6ee 100644 --- a/src/anam/client.py +++ b/src/anam/client.py @@ -246,6 +246,7 @@ async def connect_async(self) -> "Session": on_message=self._handle_data_message, on_connection_established=self._handle_connection_established, on_connection_closed=self._handle_connection_closed, + on_session_ready=self._handle_session_ready, custom_ice_servers=self._options.ice_servers, ) @@ -342,6 +343,10 @@ async def _handle_connection_established(self) -> None: logger.info("Connection established") await self._emit(AnamEvent.CONNECTION_ESTABLISHED) + async def _handle_session_ready(self) -> None: + """Handle session ready (signalling: ready to receive user audio or TTS).""" + await self._emit(AnamEvent.SESSION_READY) + async def _handle_connection_closed(self, code: str, reason: str | None) -> None: """Handle connection closed.""" logger.debug("Connection closed")