1 """Provide the legacy TTS service provider interface."""
3 from __future__
import annotations
5 from abc
import abstractmethod
6 from collections.abc
import Coroutine, Mapping
7 from functools
import partial
9 from pathlib
import Path
10 from typing
import TYPE_CHECKING, Any
12 import voluptuous
as vol
16 ATTR_MEDIA_CONTENT_ID,
17 ATTR_MEDIA_CONTENT_TYPE,
36 async_prepare_setup_platform,
57 from .media_source
import generate_media_source_id
58 from .models
import Voice
60 _LOGGER = logging.getLogger(__name__)
62 CONF_SERVICE_NAME =
"service_name"
66 """Validate if platform is deprecated."""
69 "google tts service has been renamed to google_translate,"
70 " please update your configuration."
75 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend(
77 vol.Required(CONF_PLATFORM): vol.All(cv.string, _deprecated_platform),
78 vol.Optional(CONF_CACHE, default=DEFAULT_CACHE): cv.boolean,
79 vol.Optional(CONF_CACHE_DIR, default=DEFAULT_CACHE_DIR): cv.string,
80 vol.Optional(CONF_TIME_MEMORY, default=DEFAULT_TIME_MEMORY): vol.All(
81 vol.Coerce(int), vol.Range(min=60, max=57600)
83 vol.Optional(CONF_SERVICE_NAME): cv.string,
86 PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE.extend(PLATFORM_SCHEMA.schema)
90 SCHEMA_SERVICE_SAY = vol.Schema(
92 vol.Required(ATTR_MESSAGE): cv.string,
93 vol.Optional(ATTR_CACHE): cv.boolean,
94 vol.Required(ATTR_ENTITY_ID): cv.comp_entity_ids,
95 vol.Optional(ATTR_LANGUAGE): cv.string,
96 vol.Optional(ATTR_OPTIONS): dict,
102 hass: HomeAssistant, config: ConfigType
103 ) -> list[Coroutine[Any, Any,
None]]:
104 """Set up legacy text-to-speech providers."""
106 services_yaml = Path(__file__).parent /
"services.yaml"
107 services_dict = await hass.async_add_executor_job(
108 load_yaml_dict,
str(services_yaml)
113 p_config: ConfigType |
None =
None,
114 discovery_info: DiscoveryInfoType |
None =
None,
116 """Set up a TTS platform."""
122 _LOGGER.error(
"Unknown text-to-speech platform specified")
129 group=
str(id(p_config)),
130 phase=SetupPhases.PLATFORM_SETUP,
132 if hasattr(platform,
"async_get_engine"):
133 provider = await platform.async_get_engine(
134 hass, p_config, discovery_info
137 provider = await hass.async_add_executor_job(
138 platform.get_engine, hass, p_config, discovery_info
142 _LOGGER.error(
"Error setting up platform: %s", p_type)
145 hass.data[DATA_TTS_MANAGER].async_register_legacy_engine(
146 p_type, provider, p_config
149 _LOGGER.exception(
"Error setting up platform: %s", p_type)
152 async
def async_say_handle(service: ServiceCall) ->
None:
153 """Service handle for say."""
154 entity_ids = service.data[ATTR_ENTITY_ID]
156 await hass.services.async_call(
160 ATTR_ENTITY_ID: entity_ids,
164 message=service.data[ATTR_MESSAGE],
165 language=service.data.get(ATTR_LANGUAGE),
166 options=service.data.get(ATTR_OPTIONS),
167 cache=service.data.get(ATTR_CACHE),
169 ATTR_MEDIA_CONTENT_TYPE: MediaType.MUSIC,
170 ATTR_MEDIA_ANNOUNCE:
True,
173 context=service.context,
176 service_name = p_config.get(CONF_SERVICE_NAME, f
"{p_type}_{SERVICE_SAY}")
177 hass.services.async_register(
178 DOMAIN, service_name, async_say_handle, schema=SCHEMA_SERVICE_SAY
183 CONF_NAME: f
"Say a TTS message with {p_type}",
185 f
"Say something using text-to-speech on a media player with {p_type}."
187 CONF_FIELDS: services_dict[SERVICE_SAY][CONF_FIELDS],
191 async
def async_platform_discovered(
192 platform: str, info: dict[str, Any] |
None
194 """Handle for discovered platform."""
197 discovery.async_listen_platform(hass, DOMAIN, async_platform_discovered)
202 if p_type
is not None
207 """Represent a single TTS provider."""
209 hass: HomeAssistant |
None =
None
210 name: str |
None =
None
214 """Return the default language."""
220 """Return a list of supported languages."""
224 """Return a list of supported options like voice, emotions."""
229 """Return a list of supported voices for a language."""
234 """Return a mapping with the default options."""
238 self, message: str, language: str, options: dict[str, Any]
240 """Load tts audio file from provider."""
241 raise NotImplementedError
244 self, message: str, language: str, options: dict[str, Any]
246 """Load tts audio file from provider.
248 Return a tuple of file extension and data as bytes.
252 return await self.hass.async_add_executor_job(
253 partial(self.
get_tts_audioget_tts_audio, message, language, options=options)
list[Voice]|None async_get_supported_voices(self, str language)
list[str]|None supported_options(self)
Mapping[str, Any]|None default_options(self)
str|None default_language(self)
list[str] supported_languages(self)
TtsAudioType async_get_tts_audio(self, str message, str language, dict[str, Any] options)
TtsAudioType get_tts_audio(self, str message, str language, dict[str, Any] options)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
str _deprecated_platform(str value)
list[Coroutine[Any, Any, None]] async_setup_legacy(HomeAssistant hass, ConfigType config)
Iterable[tuple[str|None, ConfigType]] config_per_platform(ConfigType config, str domain)
None async_set_service_schema(HomeAssistant hass, str domain, str service, dict[str, Any] schema)
ModuleType|None async_prepare_setup_platform(core.HomeAssistant hass, ConfigType hass_config, str domain, str platform_name)
Generator[None] async_start_setup(core.HomeAssistant hass, str integration, SetupPhases phase, str|None group=None)