Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/agents/voice/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ def _transform_audio_buffer(
# np.int16 needs 2-byte alignment; pad odd-length chunks safely.
combined_buffer += b"\x00"

np_array = np.frombuffer(combined_buffer, dtype=np.int16)
# Provider PCM16 is little-endian regardless of host byte order. Decode it
# explicitly, then normalize to native int16 before exposing it to callers.
np_array = np.frombuffer(combined_buffer, dtype=np.dtype("<i2")).astype(np.int16, copy=False)

if output_dtype == np.int16:
return np_array
Expand Down
27 changes: 27 additions & 0 deletions tests/voice/test_pcm16_endianness.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import numpy as np

from agents.voice.result import StreamedAudioResult


def test_transform_audio_buffer_decodes_pcm16_as_little_endian() -> None:
result = StreamedAudioResult.__new__(StreamedAudioResult)

raw = b"\x01\x02\x03\x04"
transformed = result._transform_audio_buffer([raw], np.int16)

assert transformed.dtype == np.dtype(np.int16)
assert transformed.tolist() == [0x0201, 0x0403]


def test_transform_audio_buffer_float32_uses_little_endian_samples() -> None:
result = StreamedAudioResult.__new__(StreamedAudioResult)

raw = b"\x01\x02\x03\x04"
transformed = result._transform_audio_buffer([raw], np.float32)

assert transformed.dtype == np.dtype(np.float32)
assert transformed.shape == (2, 1)
np.testing.assert_allclose(
transformed[:, 0],
np.asarray([0x0201, 0x0403], dtype=np.float32) / 32767.0,
)