Home Assistant Unofficial Reference 2024.12.1
tts.py
Go to the documentation of this file.
1 """Support for the Microsoft Cognitive Services text-to-speech service."""
2 
3 import logging
4 
5 from pycsspeechtts import pycsspeechtts
6 from requests.exceptions import HTTPError
7 import voluptuous as vol
8 
10  CONF_LANG,
11  PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA,
12  Provider,
13 )
14 from homeassistant.const import CONF_API_KEY, CONF_REGION, CONF_TYPE, PERCENTAGE
15 from homeassistant.generated.microsoft_tts import SUPPORTED_LANGUAGES
17 
18 CONF_GENDER = "gender"
19 CONF_OUTPUT = "output"
20 CONF_RATE = "rate"
21 CONF_VOLUME = "volume"
22 CONF_PITCH = "pitch"
23 CONF_CONTOUR = "contour"
24 _LOGGER = logging.getLogger(__name__)
25 
26 GENDERS = ["Female", "Male"]
27 
28 DEFAULT_LANG = "en-us"
29 DEFAULT_GENDER = "Female"
30 DEFAULT_TYPE = "JennyNeural"
31 DEFAULT_OUTPUT = "audio-24khz-96kbitrate-mono-mp3"
32 DEFAULT_RATE = 0
33 DEFAULT_VOLUME = 0
34 DEFAULT_PITCH = "default"
35 DEFAULT_CONTOUR = ""
36 DEFAULT_REGION = "eastus"
37 
38 PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend(
39  {
40  vol.Required(CONF_API_KEY): cv.string,
41  vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES),
42  vol.Optional(CONF_GENDER, default=DEFAULT_GENDER): vol.In(GENDERS),
43  vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string,
44  vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All(
45  vol.Coerce(int), vol.Range(-100, 100)
46  ),
47  vol.Optional(CONF_VOLUME, default=DEFAULT_VOLUME): vol.All(
48  vol.Coerce(int), vol.Range(-100, 100)
49  ),
50  vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): cv.string,
51  vol.Optional(CONF_CONTOUR, default=DEFAULT_CONTOUR): cv.string,
52  vol.Optional(CONF_REGION, default=DEFAULT_REGION): cv.string,
53  }
54 )
55 
56 
57 def get_engine(hass, config, discovery_info=None):
58  """Set up Microsoft speech component."""
59  return MicrosoftProvider(
60  config[CONF_API_KEY],
61  config[CONF_LANG],
62  config[CONF_GENDER],
63  config[CONF_TYPE],
64  config[CONF_RATE],
65  config[CONF_VOLUME],
66  config[CONF_PITCH],
67  config[CONF_CONTOUR],
68  config[CONF_REGION],
69  )
70 
71 
72 class MicrosoftProvider(Provider):
73  """The Microsoft speech API provider."""
74 
75  def __init__(
76  self, apikey, lang, gender, ttype, rate, volume, pitch, contour, region
77  ):
78  """Init Microsoft TTS service."""
79  self._apikey_apikey = apikey
80  self._lang_lang = lang
81  self._gender_gender = gender
82  self._type_type = ttype
83  self._output_output = DEFAULT_OUTPUT
84  self._rate_rate = f"{rate}{PERCENTAGE}"
85  self._volume_volume = f"{volume}{PERCENTAGE}"
86  self._pitch_pitch = pitch
87  self._contour_contour = contour
88  self._region_region = region
89  self.namename = "Microsoft"
90 
91  @property
92  def default_language(self):
93  """Return the default language."""
94  return self._lang_lang
95 
96  @property
98  """Return list of supported languages."""
99  return SUPPORTED_LANGUAGES
100 
101  @property
102  def supported_options(self):
103  """Return list of supported options like voice, emotion."""
104  return [CONF_GENDER, CONF_TYPE]
105 
106  @property
107  def default_options(self):
108  """Return a dict include default options."""
109  return {CONF_GENDER: self._gender_gender, CONF_TYPE: self._type_type}
110 
111  def get_tts_audio(self, message, language, options):
112  """Load TTS from Microsoft."""
113  if language is None:
114  language = self._lang_lang
115 
116  try:
117  trans = pycsspeechtts.TTSTranslator(self._apikey_apikey, self._region_region)
118  data = trans.speak(
119  language=language,
120  gender=options[CONF_GENDER],
121  voiceType=options[CONF_TYPE],
122  output=self._output_output,
123  rate=self._rate_rate,
124  volume=self._volume_volume,
125  pitch=self._pitch_pitch,
126  contour=self._contour_contour,
127  text=message,
128  )
129  except HTTPError as ex:
130  _LOGGER.error("Error occurred for Microsoft TTS: %s", ex)
131  return (None, None)
132  return ("mp3", data)
def __init__(self, apikey, lang, gender, ttype, rate, volume, pitch, contour, region)
Definition: tts.py:77
def get_tts_audio(self, message, language, options)
Definition: tts.py:111
def get_engine(hass, config, discovery_info=None)
Definition: tts.py:57