Count semantic tool-call events separately from pipeline frame observations

Count semantic tool-call events separately from pipeline frame observations. A bidirectional broadcast can create two frame objects with fresh IDs for one intent, so deduplicating by frame ID still inflates counts. Record the service event, preserve raw broadcasts separately, and verify against handler execution. Do not suppress every repeated tool ID globally: an actual repeated service event must remain visible. Event receipt also does not prove handler success or spoken readiness.

For reconstructed TTS text, respect whether each part already contains spaces and use the native concatenation helper. Joining timed words with an empty separator can make correct speech fail text assertions.

Applies when: A voice benchmark counts tool calls or reconstructs speech from low-level pipeline frames. Keywords: Pipecat tool calls broadcast duplicate frame recorder TTS spacing benchmark