Home Assistant Unofficial Reference 2024.12.1
legacy.py
Go to the documentation of this file.
1 """Handle legacy speech-to-text platforms."""
2 
3 from __future__ import annotations
4 
5 from abc import ABC, abstractmethod
6 from collections.abc import AsyncIterable, Coroutine
7 import logging
8 from typing import Any
9 
10 from homeassistant.config import config_per_platform
11 from homeassistant.core import HomeAssistant, callback
12 from homeassistant.helpers import discovery
13 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
14 from homeassistant.setup import (
15  SetupPhases,
16  async_prepare_setup_platform,
17  async_start_setup,
18 )
19 
20 from .const import (
21  DATA_PROVIDERS,
22  DOMAIN,
23  AudioBitRates,
24  AudioChannels,
25  AudioCodecs,
26  AudioFormats,
27  AudioSampleRates,
28 )
29 from .models import SpeechMetadata, SpeechResult
30 
31 _LOGGER = logging.getLogger(__name__)
32 
33 
34 @callback
35 def async_default_provider(hass: HomeAssistant) -> str | None:
36  """Return the domain of the default provider."""
37  providers = hass.data[DATA_PROVIDERS]
38  return next(iter(providers), None)
39 
40 
41 @callback
43  hass: HomeAssistant, domain: str | None = None
44 ) -> Provider | None:
45  """Return provider."""
46  providers = hass.data[DATA_PROVIDERS]
47  if domain:
48  return providers.get(domain)
49 
50  provider = async_default_provider(hass)
51  return providers[provider] if provider is not None else None
52 
53 
54 @callback
56  hass: HomeAssistant, config: ConfigType
57 ) -> list[Coroutine[Any, Any, None]]:
58  """Set up legacy speech-to-text providers."""
59  providers = hass.data[DATA_PROVIDERS] = {}
60 
61  async def async_setup_platform(
62  p_type: str,
63  p_config: ConfigType | None = None,
64  discovery_info: DiscoveryInfoType | None = None,
65  ) -> None:
66  """Set up an STT platform."""
67  if p_config is None:
68  p_config = {}
69 
70  platform = await async_prepare_setup_platform(hass, config, DOMAIN, p_type)
71  if platform is None:
72  _LOGGER.error("Unknown speech-to-text platform specified")
73  return
74 
75  try:
76  with async_start_setup(
77  hass,
78  integration=p_type,
79  group=str(id(p_config)),
80  phase=SetupPhases.PLATFORM_SETUP,
81  ):
82  provider = await platform.async_get_engine(
83  hass, p_config, discovery_info
84  )
85 
86  provider.name = p_type
87  provider.hass = hass
88 
89  providers[provider.name] = provider
90  except Exception:
91  _LOGGER.exception("Error setting up platform: %s", p_type)
92  return
93 
94  # Add discovery support
95  async def async_platform_discovered(
96  platform: str, info: DiscoveryInfoType | None
97  ) -> None:
98  """Handle for discovered platform."""
99  await async_setup_platform(platform, discovery_info=info)
100 
101  discovery.async_listen_platform(hass, DOMAIN, async_platform_discovered)
102 
103  return [
104  async_setup_platform(p_type, p_config)
105  for p_type, p_config in config_per_platform(config, DOMAIN)
106  if p_type
107  ]
108 
109 
110 class Provider(ABC):
111  """Represent a single STT provider."""
112 
113  hass: HomeAssistant | None = None
114  name: str | None = None
115 
116  @property
117  @abstractmethod
118  def supported_languages(self) -> list[str]:
119  """Return a list of supported languages."""
120 
121  @property
122  @abstractmethod
123  def supported_formats(self) -> list[AudioFormats]:
124  """Return a list of supported formats."""
125 
126  @property
127  @abstractmethod
128  def supported_codecs(self) -> list[AudioCodecs]:
129  """Return a list of supported codecs."""
130 
131  @property
132  @abstractmethod
133  def supported_bit_rates(self) -> list[AudioBitRates]:
134  """Return a list of supported bit rates."""
135 
136  @property
137  @abstractmethod
138  def supported_sample_rates(self) -> list[AudioSampleRates]:
139  """Return a list of supported sample rates."""
140 
141  @property
142  @abstractmethod
143  def supported_channels(self) -> list[AudioChannels]:
144  """Return a list of supported channels."""
145 
146  @abstractmethod
148  self, metadata: SpeechMetadata, stream: AsyncIterable[bytes]
149  ) -> SpeechResult:
150  """Process an audio stream to STT service.
151 
152  Only streaming of content are allow!
153  """
154 
155  @callback
156  def check_metadata(self, metadata: SpeechMetadata) -> bool:
157  """Check if given metadata supported by this provider."""
158  if (
159  metadata.language not in self.supported_languagessupported_languages
160  or metadata.format not in self.supported_formatssupported_formats
161  or metadata.codec not in self.supported_codecssupported_codecs
162  or metadata.bit_rate not in self.supported_bit_ratessupported_bit_rates
163  or metadata.sample_rate not in self.supported_sample_ratessupported_sample_rates
164  or metadata.channel not in self.supported_channelssupported_channels
165  ):
166  return False
167  return True
bool check_metadata(self, SpeechMetadata metadata)
Definition: legacy.py:156
list[AudioBitRates] supported_bit_rates(self)
Definition: legacy.py:133
list[AudioSampleRates] supported_sample_rates(self)
Definition: legacy.py:138
list[AudioChannels] supported_channels(self)
Definition: legacy.py:143
list[AudioFormats] supported_formats(self)
Definition: legacy.py:123
list[AudioCodecs] supported_codecs(self)
Definition: legacy.py:128
SpeechResult async_process_audio_stream(self, SpeechMetadata metadata, AsyncIterable[bytes] stream)
Definition: legacy.py:149
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
list[Coroutine[Any, Any, None]] async_setup_legacy(HomeAssistant hass, ConfigType config)
Definition: legacy.py:57
str|None async_default_provider(HomeAssistant hass)
Definition: legacy.py:35
Provider|None async_get_provider(HomeAssistant hass, str|None domain=None)
Definition: legacy.py:44
Iterable[tuple[str|None, ConfigType]] config_per_platform(ConfigType config, str domain)
Definition: config.py:969
ModuleType|None async_prepare_setup_platform(core.HomeAssistant hass, ConfigType hass_config, str domain, str platform_name)
Definition: setup.py:487
Generator[None] async_start_setup(core.HomeAssistant hass, str integration, SetupPhases phase, str|None group=None)
Definition: setup.py:739