Home Assistant Unofficial Reference 2024.12.1
tts.py
Go to the documentation of this file.
1 """Support for the yandex speechkit tts service."""
2 
3 import asyncio
4 from http import HTTPStatus
5 import logging
6 
7 import aiohttp
8 import voluptuous as vol
9 
10 from homeassistant.components.tts import (
11  CONF_LANG,
12  PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA,
13  Provider,
14 )
15 from homeassistant.const import CONF_API_KEY
16 from homeassistant.helpers.aiohttp_client import async_get_clientsession
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 YANDEX_API_URL = "https://tts.voicetech.yandex.net/generate?"
22 
23 SUPPORT_LANGUAGES = ["ru-RU", "en-US", "tr-TR", "uk-UK"]
24 
25 SUPPORT_CODECS = ["mp3", "wav", "opus"]
26 
27 SUPPORT_VOICES = [
28  "jane",
29  "oksana",
30  "alyss",
31  "omazh",
32  "zahar",
33  "ermil",
34  "levitan",
35  "ermilov",
36  "silaerkan",
37  "kolya",
38  "kostya",
39  "nastya",
40  "sasha",
41  "nick",
42  "erkanyavas",
43  "zhenya",
44  "tanya",
45  "anton_samokhvalov",
46  "tatyana_abramova",
47  "voicesearch",
48  "ermil_with_tuning",
49  "robot",
50  "dude",
51  "zombie",
52  "smoky",
53 ]
54 
55 SUPPORTED_EMOTION = ["good", "evil", "neutral"]
56 
57 MIN_SPEED = 0.1
58 MAX_SPEED = 3
59 
60 CONF_CODEC = "codec"
61 CONF_VOICE = "voice"
62 CONF_EMOTION = "emotion"
63 CONF_SPEED = "speed"
64 
65 DEFAULT_LANG = "en-US"
66 DEFAULT_CODEC = "mp3"
67 DEFAULT_VOICE = "zahar"
68 DEFAULT_EMOTION = "neutral"
69 DEFAULT_SPEED = 1
70 
71 PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend(
72  {
73  vol.Required(CONF_API_KEY): cv.string,
74  vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES),
75  vol.Optional(CONF_CODEC, default=DEFAULT_CODEC): vol.In(SUPPORT_CODECS),
76  vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORT_VOICES),
77  vol.Optional(CONF_EMOTION, default=DEFAULT_EMOTION): vol.In(SUPPORTED_EMOTION),
78  vol.Optional(CONF_SPEED, default=DEFAULT_SPEED): vol.Range(
79  min=MIN_SPEED, max=MAX_SPEED
80  ),
81  }
82 )
83 
84 SUPPORTED_OPTIONS = [CONF_CODEC, CONF_VOICE, CONF_EMOTION, CONF_SPEED]
85 
86 
87 async def async_get_engine(hass, config, discovery_info=None):
88  """Set up VoiceRSS speech component."""
89  return YandexSpeechKitProvider(hass, config)
90 
91 
93  """VoiceRSS speech api provider."""
94 
95  def __init__(self, hass, conf):
96  """Init VoiceRSS TTS service."""
97  self.hasshass = hass
98  self._codec_codec = conf.get(CONF_CODEC)
99  self._key_key = conf.get(CONF_API_KEY)
100  self._speaker_speaker = conf.get(CONF_VOICE)
101  self._language_language = conf.get(CONF_LANG)
102  self._emotion_emotion = conf.get(CONF_EMOTION)
103  self._speed_speed = str(conf.get(CONF_SPEED))
104  self.namename = "YandexTTS"
105 
106  @property
107  def default_language(self):
108  """Return the default language."""
109  return self._language_language
110 
111  @property
113  """Return list of supported languages."""
114  return SUPPORT_LANGUAGES
115 
116  @property
117  def supported_options(self):
118  """Return list of supported options."""
119  return SUPPORTED_OPTIONS
120 
121  async def async_get_tts_audio(self, message, language, options):
122  """Load TTS from yandex."""
123  websession = async_get_clientsession(self.hasshass)
124  actual_language = language
125 
126  try:
127  async with asyncio.timeout(10):
128  url_param = {
129  "text": message,
130  "lang": actual_language,
131  "key": self._key_key,
132  "speaker": options.get(CONF_VOICE, self._speaker_speaker),
133  "format": options.get(CONF_CODEC, self._codec_codec),
134  "emotion": options.get(CONF_EMOTION, self._emotion_emotion),
135  "speed": options.get(CONF_SPEED, self._speed_speed),
136  }
137 
138  request = await websession.get(YANDEX_API_URL, params=url_param)
139 
140  if request.status != HTTPStatus.OK:
141  _LOGGER.error(
142  "Error %d on load URL %s", request.status, request.url
143  )
144  return (None, None)
145  data = await request.read()
146 
147  except (TimeoutError, aiohttp.ClientError):
148  _LOGGER.error("Timeout for yandex speech kit API")
149  return (None, None)
150 
151  return (self._codec_codec, data)
def async_get_tts_audio(self, message, language, options)
Definition: tts.py:121
def async_get_engine(hass, config, discovery_info=None)
Definition: tts.py:87
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)