A voice agent records ten seconds of 16 kHz PCM audio. One adapter labels those same samples as 48 kHz without actually resampling them. The ASR service thinks the buffer lasts about 3.33 seconds. Speech sounds too fast when played according to the declared rate, and word timestamps no longer line up with the call. The bytes are intact. Their interpretation is wrong.

Sample rate tells the decoder how many samples represent one second. Here there are 160,000 samples. At 16,000 samples per second, that is ten seconds. At 48,000, it is a third as long. Changing metadata is not resampling. Real resampling produces a different number of samples with an appropriate filter, and the output rate, timestamps and frame sizes must agree. FFmpeg's resampler documentation distinguishes input and output sample rates and discusses timestamps. This calculation assumes single-channel sample frames and a continuous buffer. A live stream adds packet boundaries, jitter and clock synchronization.

Trace capture, codec decode, channel conversion, resampling, VAD and ASR. Record sample count, true input rate, declared rate and duration at each handoff. Compare a known test tone against the metadata. Simply multiplying returned timestamps by three may fix the display while leaving the recognizer with time-compressed speech.

The fix is a typed audio contract: codec, channels, rate, sample count and time base. If the model expects 48 kHz, actually resample the waveform, producing about three times as many samples for the same duration. If it expects 16 kHz, pass the original buffer at its real rate. Streaming chunks still need monotonic timestamps. Test each device path with duration and transcript-alignment assertions.

For the simple whole-buffer case, timestamps are off by a factor of three. Dropped packets or resampler delay can add other errors, so compare against the capture clock. The spoken words are right. Why does the video citation point ten seconds early? handles audio and video clocks after silence removal. Here the sample-rate metadata itself is false.