feat: allow no audio input while robot is speaking
The VAD agent will discard its current buffer and retry receiving data. ref: N25B-213
This commit is contained in:
@@ -53,20 +53,14 @@ class Streaming(CyclicBehaviour):
|
|||||||
self.audio_out_socket = audio_out_socket
|
self.audio_out_socket = audio_out_socket
|
||||||
|
|
||||||
self.audio_buffer = np.array([], dtype=np.float32)
|
self.audio_buffer = np.array([], dtype=np.float32)
|
||||||
self.i_since_data = 0 # Used to avoid logging every cycle if audio input stops
|
|
||||||
self.i_since_speech = 100 # Used to allow small pauses in speech
|
self.i_since_speech = 100 # Used to allow small pauses in speech
|
||||||
|
|
||||||
async def run(self) -> None:
|
async def run(self) -> None:
|
||||||
data = await self.audio_in_poller.poll()
|
data = await self.audio_in_poller.poll()
|
||||||
if data is None:
|
if data is None:
|
||||||
if self.i_since_data % 10 == 0:
|
logger.debug("No audio data received. Discarding buffer until new data arrives.")
|
||||||
logger.debug(
|
self.audio_buffer = np.array([], dtype=np.float32)
|
||||||
"Failed to receive audio from socket for %d ms.",
|
|
||||||
self.audio_in_poller.timeout_ms * (self.i_since_data + 1),
|
|
||||||
)
|
|
||||||
self.i_since_data += 1
|
|
||||||
return
|
return
|
||||||
self.i_since_data = 0
|
|
||||||
|
|
||||||
# copy otherwise Torch will be sad that it's immutable
|
# copy otherwise Torch will be sad that it's immutable
|
||||||
chunk = np.frombuffer(data, dtype=np.float32).copy()
|
chunk = np.frombuffer(data, dtype=np.float32).copy()
|
||||||
|
|||||||
@@ -86,9 +86,7 @@ async def test_no_data(audio_in_socket, audio_out_socket, streaming):
|
|||||||
audio_in_poller.poll.return_value = None
|
audio_in_poller.poll.return_value = None
|
||||||
streaming.audio_in_poller = audio_in_poller
|
streaming.audio_in_poller = audio_in_poller
|
||||||
|
|
||||||
assert streaming.i_since_data == 0
|
|
||||||
|
|
||||||
await streaming.run()
|
await streaming.run()
|
||||||
|
|
||||||
audio_out_socket.send.assert_not_called()
|
audio_out_socket.send.assert_not_called()
|
||||||
assert streaming.i_since_data == 1
|
assert len(streaming.audio_buffer) == 0
|
||||||
|
|||||||
Reference in New Issue
Block a user