From fb66d766a823fd1d402c1e77c5b51e73807082ab Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 19 Mar 2026 11:38:43 -0500 Subject: [PATCH] Ensure STT metadata enums are passed (#165220) --- homeassistant/components/stt/__init__.py | 10 +++--- homeassistant/components/stt/models.py | 6 ---- tests/components/stt/test_init.py | 41 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/stt/__init__.py b/homeassistant/components/stt/__init__.py index 25ed29d3071..abc828dac3f 100644 --- a/homeassistant/components/stt/__init__.py +++ b/homeassistant/components/stt/__init__.py @@ -397,11 +397,11 @@ def _metadata_from_header(request: web.Request) -> SpeechMetadata: try: return SpeechMetadata( language=args["language"], - format=args["format"], - codec=args["codec"], - bit_rate=args["bit_rate"], - sample_rate=args["sample_rate"], - channel=args["channel"], + format=AudioFormats(args["format"]), + codec=AudioCodecs(args["codec"]), + bit_rate=AudioBitRates(int(args["bit_rate"])), + sample_rate=AudioSampleRates(int(args["sample_rate"])), + channel=AudioChannels(int(args["channel"])), ) except ValueError as err: raise ValueError(f"Wrong format of X-Speech-Content: {err}") from err diff --git a/homeassistant/components/stt/models.py b/homeassistant/components/stt/models.py index 9471316dc8e..40b43109778 100644 --- a/homeassistant/components/stt/models.py +++ b/homeassistant/components/stt/models.py @@ -23,12 +23,6 @@ class SpeechMetadata: sample_rate: AudioSampleRates channel: AudioChannels - def __post_init__(self) -> None: - """Finish initializing the metadata.""" - self.bit_rate = AudioBitRates(int(self.bit_rate)) - self.sample_rate = AudioSampleRates(int(self.sample_rate)) - self.channel = AudioChannels(int(self.channel)) - @dataclass class SpeechResult: diff --git a/tests/components/stt/test_init.py b/tests/components/stt/test_init.py index 98a4117293e..687a6b56e66 100644 --- a/tests/components/stt/test_init.py +++ b/tests/components/stt/test_init.py @@ -10,6 +10,11 @@ import pytest from homeassistant.components.stt import ( DOMAIN, + AudioBitRates, + AudioChannels, + AudioCodecs, + AudioFormats, + AudioSampleRates, async_default_engine, async_get_provider, async_get_speech_to_text_engine, @@ -233,6 +238,42 @@ async def test_stream_audio( assert await response.json() == {"text": "test_result", "result": "success"} +@pytest.mark.parametrize( + "setup", ["mock_setup", "mock_config_entry_setup"], indirect=True +) +async def test_stream_audio_uses_enum_values( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + setup: MockSTTProvider | MockSTTProviderEntity, +) -> None: + """Test that HTTP API passes enum values to async_process_audio_stream.""" + client = await hass_client() + response = await client.post( + f"/api/stt/{setup.url_path}", + headers={ + "X-Speech-Content": ( + "format=wav; codec=pcm; sample_rate=16000; bit_rate=16; channel=1;" + " language=en" + ) + }, + ) + assert response.status == HTTPStatus.OK + + assert len(setup.calls) == 1 + metadata, _ = setup.calls[0] + + assert isinstance(metadata.format, AudioFormats) + assert metadata.format == AudioFormats.WAV + assert isinstance(metadata.codec, AudioCodecs) + assert metadata.codec == AudioCodecs.PCM + assert isinstance(metadata.bit_rate, AudioBitRates) + assert metadata.bit_rate == AudioBitRates.BITRATE_16 + assert isinstance(metadata.sample_rate, AudioSampleRates) + assert metadata.sample_rate == AudioSampleRates.SAMPLERATE_16000 + assert isinstance(metadata.channel, AudioChannels) + assert metadata.channel == AudioChannels.CHANNEL_MONO + + @pytest.mark.parametrize( "setup", ["mock_setup", "mock_config_entry_setup"], indirect=True )