Dial during the transfer announcement; move the caller after playout
If a transfer starts from the speech-completed callback, every second of announcement playback, plus any event-loop backlog, delays the dial. Simply running the old transfer function in the background does not work, because it gates bot media and starts hold music, which cuts off the announcement. Split the work. Commit one transfer attempt once the destination is validated, create the consultation room and dial while the caller still hears the announcement, and move the caller only when playout has fully drained and the human is ready. Re-check the failure latch after the bounded wait for playout, because a failure can arrive while the announcement plays. Seal the first room's recording only after confirmed speech completion. This removes the sequential wait; it does not fix event-loop stalls.
Applies when: a voice agent announces a transfer and then dials a human. Keywords: LiveKit Pipecat transfer latency parallel dial announcement playout ordering race hold music Cartesia TTS