Home Assistant Unofficial Reference 2024.12.1
tts.py
Go to the documentation of this file.
1 """Support for the Google speech service."""
2 
3 from __future__ import annotations
4 
5 from io import BytesIO
6 import logging
7 from typing import Any
8 
9 from gtts import gTTS, gTTSError
10 import voluptuous as vol
11 
12 from homeassistant.components.tts import (
13  CONF_LANG,
14  PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA,
15  Provider,
16  TextToSpeechEntity,
17  TtsAudioType,
18 )
19 from homeassistant.config_entries import ConfigEntry
20 from homeassistant.core import HomeAssistant
21 from homeassistant.exceptions import HomeAssistantError
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
24 
25 from .const import (
26  CONF_TLD,
27  DEFAULT_LANG,
28  DEFAULT_TLD,
29  MAP_LANG_TLD,
30  SUPPORT_LANGUAGES,
31  SUPPORT_TLD,
32 )
33 
34 _LOGGER = logging.getLogger(__name__)
35 
36 SUPPORT_OPTIONS = ["tld"]
37 
38 PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend(
39  {
40  vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES),
41  vol.Optional(CONF_TLD, default=DEFAULT_TLD): vol.In(SUPPORT_TLD),
42  }
43 )
44 
45 
46 async def async_get_engine(
47  hass: HomeAssistant,
48  config: ConfigType,
49  discovery_info: DiscoveryInfoType | None = None,
50 ) -> GoogleProvider:
51  """Set up Google speech component."""
52  return GoogleProvider(hass, config[CONF_LANG], config[CONF_TLD])
53 
54 
56  hass: HomeAssistant,
57  config_entry: ConfigEntry,
58  async_add_entities: AddEntitiesCallback,
59 ) -> None:
60  """Set up Google Translate speech platform via config entry."""
61  default_language = config_entry.data[CONF_LANG]
62  default_tld = config_entry.data[CONF_TLD]
63  async_add_entities([GoogleTTSEntity(config_entry, default_language, default_tld)])
64 
65 
67  """The Google speech API entity."""
68 
69  def __init__(self, config_entry: ConfigEntry, lang: str, tld: str) -> None:
70  """Init Google TTS service."""
71  if lang in MAP_LANG_TLD:
72  self._lang_lang = MAP_LANG_TLD[lang].lang
73  self._tld_tld = MAP_LANG_TLD[lang].tld
74  else:
75  self._lang_lang = lang
76  self._tld_tld = tld
77  self._attr_name_attr_name = f"Google Translate {self._lang} {self._tld}"
78  self._attr_unique_id_attr_unique_id = config_entry.entry_id
79 
80  @property
81  def default_language(self) -> str:
82  """Return the default language."""
83  return self._lang_lang
84 
85  @property
86  def supported_languages(self) -> list[str]:
87  """Return list of supported languages."""
88  return SUPPORT_LANGUAGES
89 
90  @property
91  def supported_options(self) -> list[str]:
92  """Return a list of supported options."""
93  return SUPPORT_OPTIONS
94 
96  self, message: str, language: str, options: dict[str, Any] | None = None
97  ) -> TtsAudioType:
98  """Load TTS from google."""
99  tld = self._tld_tld
100  if language in MAP_LANG_TLD:
101  tld_language = MAP_LANG_TLD[language]
102  tld = tld_language.tld
103  language = tld_language.lang
104  if options is not None and "tld" in options:
105  tld = options["tld"]
106 
107  tts = gTTS(text=message, lang=language, tld=tld)
108  mp3_data = BytesIO()
109 
110  try:
111  tts.write_to_fp(mp3_data)
112  except gTTSError as exc:
113  _LOGGER.debug(
114  "Error during processing of TTS request %s", exc, exc_info=True
115  )
116  raise HomeAssistantError(exc) from exc
117 
118  return "mp3", mp3_data.getvalue()
119 
120 
121 class GoogleProvider(Provider):
122  """The Google speech API provider."""
123 
124  def __init__(self, hass: HomeAssistant, lang: str, tld: str) -> None:
125  """Init Google TTS service."""
126  self.hasshass = hass
127  if lang in MAP_LANG_TLD:
128  self._lang_lang = MAP_LANG_TLD[lang].lang
129  self._tld_tld = MAP_LANG_TLD[lang].tld
130  else:
131  self._lang_lang = lang
132  self._tld_tld = tld
133  self.namename = "Google Translate"
134 
135  @property
136  def default_language(self) -> str:
137  """Return the default language."""
138  return self._lang_lang
139 
140  @property
141  def supported_languages(self) -> list[str]:
142  """Return list of supported languages."""
143  return SUPPORT_LANGUAGES
144 
145  @property
146  def supported_options(self) -> list[str]:
147  """Return a list of supported options."""
148  return SUPPORT_OPTIONS
149 
151  self, message: str, language: str, options: dict[str, Any]
152  ) -> TtsAudioType:
153  """Load TTS from google."""
154  tld = self._tld_tld
155  if language in MAP_LANG_TLD:
156  tld = MAP_LANG_TLD[language].tld
157  language = MAP_LANG_TLD[language].lang
158  if "tld" in options:
159  tld = options["tld"]
160  tts = gTTS(text=message, lang=language, tld=tld)
161  mp3_data = BytesIO()
162 
163  try:
164  tts.write_to_fp(mp3_data)
165  except gTTSError:
166  _LOGGER.exception("Error during processing of TTS request")
167  return None, None
168 
169  return "mp3", mp3_data.getvalue()
None __init__(self, HomeAssistant hass, str lang, str tld)
Definition: tts.py:124
TtsAudioType get_tts_audio(self, str message, str language, dict[str, Any] options)
Definition: tts.py:152
None __init__(self, ConfigEntry config_entry, str lang, str tld)
Definition: tts.py:69
TtsAudioType get_tts_audio(self, str message, str language, dict[str, Any]|None options=None)
Definition: tts.py:97
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: tts.py:59
GoogleProvider async_get_engine(HomeAssistant hass, ConfigType config, DiscoveryInfoType|None discovery_info=None)
Definition: tts.py:50