Wait for transport playout before moving participants or stopping hold audio

A "speech stopped" event says the synthesizer finished, not that the caller heard it. Pipecat emits BotStoppedSpeakingFrame when TTS signals completion, while the transport can still hold up to about a second of queued audio. A LiveKit handoff that moved the participant a few hundred milliseconds later cut off the end of the announcement. Hold audio that was "stopped" by queueing a frame, but never cleared or unpublished, played to the arriving human. Before a participant move, await playout completion, or failing that add a measured post-stop buffer. Clear and unpublish hold audio before the transfer. On Daily, stop hold music on the dial-out answered event, not on connected. Do not treat "no publish errors" as proof of playback, because some SDK publish calls return false silently when disconnected.

Applies when: a voice pipeline acts on the end of speech by moving, muting or removing participants. Keywords: Pipecat BotStoppedSpeakingFrame playout buffer LiveKit audio source truncated speech hold music unpublish Daily dialout answered