@@ -284,9 +284,10 @@ async def event_from_server(self, event: Event) -> None:
284284 # Wake word detection started
285285 await self .trigger_detect ()
286286 elif Detection .is_type (event .type ):
287- # Wake word detected
288- _LOGGER .debug ("Wake word detected" )
289- await self .trigger_detection (Detection .from_event (event ))
287+ if not self .is_streaming :
288+ _LOGGER .info ("Conversation started by server" )
289+ await self ._handle_server_detection (Detection .from_event (event ))
290+ return # This event is for client-side control only
290291 elif VoiceStarted .is_type (event .type ):
291292 # STT start
292293 await self .trigger_stt_start ()
@@ -1223,6 +1224,15 @@ def __init__(self, settings: SatelliteSettings) -> None:
12231224 self ._wake_info_ready = asyncio .Event ()
12241225
12251226 async def event_from_server (self , event : Event ) -> None :
1227+ # ---- START MODIFICATION ----
1228+ # Handle fake Detection event from server to start a conversation
1229+ if Detection .is_type (event .type ):
1230+ if not self .is_streaming :
1231+ _LOGGER .info ("Conversation started by server" )
1232+ await self ._handle_server_detection (Detection .from_event (event ))
1233+ return # This event is for client-side control only
1234+ # ---- END MODIFICATION ----
1235+
12261236 # Only check event types once
12271237 is_run_satellite = False
12281238 is_pause_satellite = False
@@ -1274,6 +1284,33 @@ async def event_from_server(self, event: Event) -> None:
12741284 timestamp = self ._debug_recording_timestamp
12751285 )
12761286
1287+ # ---- START MODIFICATION ----
1288+ async def _handle_server_detection (self , detection : Detection ) -> None :
1289+ """Handle a fake detection event from the server to start streaming."""
1290+ if self .is_streaming or (self .server_id is None ):
1291+ return
1292+
1293+ # Don't check refractory period for server commands.
1294+
1295+ if self .wake_audio_writer is not None :
1296+ self .wake_audio_writer .stop ()
1297+
1298+ if self .stt_audio_writer is not None :
1299+ self .stt_audio_writer .start (timestamp = self ._debug_recording_timestamp )
1300+
1301+ _LOGGER .debug (detection )
1302+ self .is_streaming = True
1303+ _LOGGER .info ("Streaming audio" )
1304+
1305+ # Don't set refractory period for server commands.
1306+ # Don't forward the detection event back to the server.
1307+ # No pipeline name matching needed, the server already knows.
1308+ await self ._send_run_pipeline ()
1309+ await self .forward_event (detection .event ()) # forward to event service
1310+ await self .trigger_streaming_start ()
1311+
1312+ # ---- END MODIFICATION ----
1313+
12771314 async def trigger_server_disonnected (self ) -> None :
12781315 await super ().trigger_server_disonnected ()
12791316
0 commit comments