Home Assistant Unofficial Reference 2024.12.1
tts.py
Go to the documentation of this file.
1 """Support for Baidu speech service."""
2 
3 import logging
4 
5 from aip import AipSpeech
6 import voluptuous as vol
7 
9  CONF_LANG,
10  PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA,
11  Provider,
12 )
13 from homeassistant.const import CONF_API_KEY
15 
16 _LOGGER = logging.getLogger(__name__)
17 
18 SUPPORTED_LANGUAGES = ["zh"]
19 DEFAULT_LANG = "zh"
20 SUPPORTED_PERSON = [0, 1, 3, 4, 5, 103, 106, 110, 111, 5003, 5118]
21 
22 CONF_APP_ID = "app_id"
23 CONF_SECRET_KEY = "secret_key"
24 CONF_SPEED = "speed"
25 CONF_PITCH = "pitch"
26 CONF_VOLUME = "volume"
27 CONF_PERSON = "person"
28 
29 PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend(
30  {
31  vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES),
32  vol.Required(CONF_APP_ID): cv.string,
33  vol.Required(CONF_API_KEY): cv.string,
34  vol.Required(CONF_SECRET_KEY): cv.string,
35  vol.Optional(CONF_SPEED, default=5): vol.All(
36  vol.Coerce(int), vol.Range(min=0, max=9)
37  ),
38  vol.Optional(CONF_PITCH, default=5): vol.All(
39  vol.Coerce(int), vol.Range(min=0, max=9)
40  ),
41  vol.Optional(CONF_VOLUME, default=5): vol.All(
42  vol.Coerce(int), vol.Range(min=0, max=15)
43  ),
44  vol.Optional(CONF_PERSON, default=0): vol.In(SUPPORTED_PERSON),
45  }
46 )
47 
48 # Keys are options in the config file, and Values are options
49 # required by Baidu TTS API.
50 _OPTIONS = {
51  CONF_PERSON: "per",
52  CONF_PITCH: "pit",
53  CONF_SPEED: "spd",
54  CONF_VOLUME: "vol",
55 }
56 SUPPORTED_OPTIONS = [CONF_PERSON, CONF_PITCH, CONF_SPEED, CONF_VOLUME]
57 
58 
59 def get_engine(hass, config, discovery_info=None):
60  """Set up Baidu TTS component."""
61  return BaiduTTSProvider(hass, config)
62 
63 
64 class BaiduTTSProvider(Provider):
65  """Baidu TTS speech api provider."""
66 
67  def __init__(self, hass, conf):
68  """Init Baidu TTS service."""
69  self.hasshass = hass
70  self._lang_lang = conf[CONF_LANG]
71  self._codec_codec = "mp3"
72  self.namename = "BaiduTTS"
73 
74  self._app_data_app_data = {
75  "appid": conf[CONF_APP_ID],
76  "apikey": conf[CONF_API_KEY],
77  "secretkey": conf[CONF_SECRET_KEY],
78  }
79 
80  self._speech_conf_data_speech_conf_data = {
81  _OPTIONS[CONF_PERSON]: conf[CONF_PERSON],
82  _OPTIONS[CONF_PITCH]: conf[CONF_PITCH],
83  _OPTIONS[CONF_SPEED]: conf[CONF_SPEED],
84  _OPTIONS[CONF_VOLUME]: conf[CONF_VOLUME],
85  }
86 
87  @property
88  def default_language(self):
89  """Return the default language."""
90  return self._lang_lang
91 
92  @property
94  """Return a list of supported languages."""
95  return SUPPORTED_LANGUAGES
96 
97  @property
98  def default_options(self):
99  """Return a dict including default options."""
100  return {
101  CONF_PERSON: self._speech_conf_data_speech_conf_data[_OPTIONS[CONF_PERSON]],
102  CONF_PITCH: self._speech_conf_data_speech_conf_data[_OPTIONS[CONF_PITCH]],
103  CONF_SPEED: self._speech_conf_data_speech_conf_data[_OPTIONS[CONF_SPEED]],
104  CONF_VOLUME: self._speech_conf_data_speech_conf_data[_OPTIONS[CONF_VOLUME]],
105  }
106 
107  @property
108  def supported_options(self):
109  """Return a list of supported options."""
110  return SUPPORTED_OPTIONS
111 
112  def get_tts_audio(self, message, language, options):
113  """Load TTS from BaiduTTS."""
114 
115  aip_speech = AipSpeech(
116  self._app_data_app_data["appid"],
117  self._app_data_app_data["apikey"],
118  self._app_data_app_data["secretkey"],
119  )
120 
121  speech_data = self._speech_conf_data_speech_conf_data.copy()
122  for key, value in options.items():
123  speech_data[_OPTIONS[key]] = value
124 
125  result = aip_speech.synthesis(message, language, 1, speech_data)
126 
127  if isinstance(result, dict):
128  _LOGGER.error(
129  "Baidu TTS error-- err_no:%d; err_msg:%s; err_detail:%s",
130  result["err_no"],
131  result["err_msg"],
132  result["err_detail"],
133  )
134  return None, None
135 
136  return self._codec_codec, result
def get_tts_audio(self, message, language, options)
Definition: tts.py:112
def get_engine(hass, config, discovery_info=None)
Definition: tts.py:59