From c35aabe4975f986f884fead968ef93dc43c0ba03 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Sat, 29 Apr 2023 14:24:56 -0500 Subject: [PATCH] Add VoIP error tone (#92260) * Play error tone when pipeline error occurs * Play listening tone at the start of each cycle --- homeassistant/components/voip/error.pcm | Bin 0 -> 64000 bytes homeassistant/components/voip/voip.py | 45 ++++++++++++++++++++---- tests/components/voip/test_voip.py | 4 +++ 3 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 homeassistant/components/voip/error.pcm diff --git a/homeassistant/components/voip/error.pcm b/homeassistant/components/voip/error.pcm new file mode 100644 index 0000000000000000000000000000000000000000..3d93cdb14db728632917ddb65c1ee0a591ace9e0 GIT binary patch literal 64000 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 z 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 X#|!72s?a0iC$3v6A8Qqz#MA#j*O}?@ literal 0 HcmV?d00001 diff --git a/homeassistant/components/voip/voip.py b/homeassistant/components/voip/voip.py index 2eedfcdcf9b..3fcc2336aa3 100644 --- a/homeassistant/components/voip/voip.py +++ b/homeassistant/components/voip/voip.py @@ -105,6 +105,7 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): buffered_chunks_before_speech: int = 100, listening_tone_enabled: bool = True, processing_tone_enabled: bool = True, + error_tone_enabled: bool = True, tone_delay: float = 0.2, tts_extra_timeout: float = 1.0, ) -> None: @@ -120,6 +121,7 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): self.buffered_chunks_before_speech = buffered_chunks_before_speech self.listening_tone_enabled = listening_tone_enabled self.processing_tone_enabled = processing_tone_enabled + self.error_tone_enabled = error_tone_enabled self.tone_delay = tone_delay self.tts_extra_timeout = tts_extra_timeout @@ -131,6 +133,8 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): self._session_id: str | None = None self._tone_bytes: bytes | None = None self._processing_bytes: bytes | None = None + self._error_bytes: bytes | None = None + self._pipeline_error: bool = False def connection_made(self, transport): """Server is ready.""" @@ -161,8 +165,10 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): """Forward audio to pipeline STT and handle TTS.""" if self._session_id is None: self._session_id = ulid() - if self.listening_tone_enabled: - await self._play_listening_tone() + + # Play listening tone at the start of each cycle + if self.listening_tone_enabled: + await self._play_listening_tone() try: # Wait for speech before starting pipeline @@ -221,11 +227,16 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): tts_audio_output="raw", ) - # Block until TTS is done speaking. - # - # This is set in _send_tts and has a timeout that's based on the - # length of the TTS audio. - await self._tts_done.wait() + if self._pipeline_error: + self._pipeline_error = False + if self.error_tone_enabled: + await self._play_error_tone() + else: + # Block until TTS is done speaking. + # + # This is set in _send_tts and has a timeout that's based on the + # length of the TTS audio. + await self._tts_done.wait() _LOGGER.debug("Pipeline finished") except asyncio.TimeoutError: @@ -307,6 +318,9 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): self._send_tts(media_id), "voip_pipeline_tts", ) + elif event.type == PipelineEventType.ERROR: + # Play error tone instead of wait for TTS + self._pipeline_error = True async def _send_tts(self, media_id: str) -> None: """Send TTS audio to caller via RTP.""" @@ -372,6 +386,23 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): ) ) + async def _play_error_tone(self) -> None: + """Play a tone to indicate a pipeline error occurred.""" + if self._error_bytes is None: + # Do I/O in executor + self._error_bytes = await self.hass.async_add_executor_job( + self._load_pcm, + "error.pcm", + ) + + await self.hass.async_add_executor_job( + partial( + self.send_audio, + self._error_bytes, + **RTP_AUDIO_SETTINGS, + ) + ) + def _load_pcm(self, file_name: str) -> bytes: """Load raw audio (16Khz, 16-bit mono).""" return (Path(__file__).parent / file_name).read_bytes() diff --git a/tests/components/voip/test_voip.py b/tests/components/voip/test_voip.py index 19b9806e41e..6ccfae904e8 100644 --- a/tests/components/voip/test_voip.py +++ b/tests/components/voip/test_voip.py @@ -90,6 +90,7 @@ async def test_pipeline( Context(), listening_tone_enabled=False, processing_tone_enabled=False, + error_tone_enabled=False, ) rtp_protocol.transport = Mock() @@ -140,6 +141,7 @@ async def test_pipeline_timeout(hass: HomeAssistant, voip_device: VoIPDevice) -> pipeline_timeout=0.001, listening_tone_enabled=False, processing_tone_enabled=False, + error_tone_enabled=False, ) transport = Mock(spec=["close"]) rtp_protocol.connection_made(transport) @@ -179,6 +181,7 @@ async def test_stt_stream_timeout(hass: HomeAssistant, voip_device: VoIPDevice) audio_timeout=0.001, listening_tone_enabled=False, processing_tone_enabled=False, + error_tone_enabled=False, ) transport = Mock(spec=["close"]) rtp_protocol.connection_made(transport) @@ -262,6 +265,7 @@ async def test_tts_timeout( Context(), listening_tone_enabled=False, processing_tone_enabled=False, + error_tone_enabled=False, ) rtp_protocol.transport = Mock() rtp_protocol.send_audio = Mock(side_effect=send_audio)