mirror of
https://github.com/home-assistant/core
synced 2024-09-03 08:14:07 +02:00
![Pascal Vizeli](/assets/img/avatar_default.png)
* Add voice support over NC * Add disocery support for TTS / STT * fix cloud TTS discovery * Fix dev config * Fix discovery * Bump hass-nabucasa 0.25 * Add channel support * Fix lint * Update homeassistant/components/cloud/__init__.py Co-Authored-By: Paulus Schoutsen <balloob@gmail.com> * Update homeassistant/components/cloud/tts.py Co-Authored-By: Paulus Schoutsen <balloob@gmail.com> * Update homeassistant/components/cloud/tts.py Co-Authored-By: Paulus Schoutsen <balloob@gmail.com> * Update homeassistant/components/cloud/tts.py Co-Authored-By: Paulus Schoutsen <balloob@gmail.com> * bump hass-nabucasa * Update tts.py * fix lint
136 lines
4.1 KiB
Python
136 lines
4.1 KiB
Python
"""Support for Baidu speech service."""
|
|
import logging
|
|
|
|
from aip import AipSpeech
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.tts import CONF_LANG, PLATFORM_SCHEMA, Provider
|
|
from homeassistant.const import CONF_API_KEY
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
SUPPORTED_LANGUAGES = ["zh"]
|
|
DEFAULT_LANG = "zh"
|
|
|
|
CONF_APP_ID = "app_id"
|
|
CONF_SECRET_KEY = "secret_key"
|
|
CONF_SPEED = "speed"
|
|
CONF_PITCH = "pitch"
|
|
CONF_VOLUME = "volume"
|
|
CONF_PERSON = "person"
|
|
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|
{
|
|
vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES),
|
|
vol.Required(CONF_APP_ID): cv.string,
|
|
vol.Required(CONF_API_KEY): cv.string,
|
|
vol.Required(CONF_SECRET_KEY): cv.string,
|
|
vol.Optional(CONF_SPEED, default=5): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=9)
|
|
),
|
|
vol.Optional(CONF_PITCH, default=5): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=9)
|
|
),
|
|
vol.Optional(CONF_VOLUME, default=5): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=15)
|
|
),
|
|
vol.Optional(CONF_PERSON, default=0): vol.All(
|
|
vol.Coerce(int), vol.Range(min=0, max=4)
|
|
),
|
|
}
|
|
)
|
|
|
|
# Keys are options in the config file, and Values are options
|
|
# required by Baidu TTS API.
|
|
_OPTIONS = {
|
|
CONF_PERSON: "per",
|
|
CONF_PITCH: "pit",
|
|
CONF_SPEED: "spd",
|
|
CONF_VOLUME: "vol",
|
|
}
|
|
SUPPORTED_OPTIONS = [CONF_PERSON, CONF_PITCH, CONF_SPEED, CONF_VOLUME]
|
|
|
|
|
|
def get_engine(hass, config, discovery_info=None):
|
|
"""Set up Baidu TTS component."""
|
|
return BaiduTTSProvider(hass, config)
|
|
|
|
|
|
class BaiduTTSProvider(Provider):
|
|
"""Baidu TTS speech api provider."""
|
|
|
|
def __init__(self, hass, conf):
|
|
"""Init Baidu TTS service."""
|
|
self.hass = hass
|
|
self._lang = conf.get(CONF_LANG)
|
|
self._codec = "mp3"
|
|
self.name = "BaiduTTS"
|
|
|
|
self._app_data = {
|
|
"appid": conf.get(CONF_APP_ID),
|
|
"apikey": conf.get(CONF_API_KEY),
|
|
"secretkey": conf.get(CONF_SECRET_KEY),
|
|
}
|
|
|
|
self._speech_conf_data = {
|
|
_OPTIONS[CONF_PERSON]: conf.get(CONF_PERSON),
|
|
_OPTIONS[CONF_PITCH]: conf.get(CONF_PITCH),
|
|
_OPTIONS[CONF_SPEED]: conf.get(CONF_SPEED),
|
|
_OPTIONS[CONF_VOLUME]: conf.get(CONF_VOLUME),
|
|
}
|
|
|
|
@property
|
|
def default_language(self):
|
|
"""Return the default language."""
|
|
return self._lang
|
|
|
|
@property
|
|
def supported_languages(self):
|
|
"""Return a list of supported languages."""
|
|
return SUPPORTED_LANGUAGES
|
|
|
|
@property
|
|
def default_options(self):
|
|
"""Return a dict including default options."""
|
|
return {
|
|
CONF_PERSON: self._speech_conf_data[_OPTIONS[CONF_PERSON]],
|
|
CONF_PITCH: self._speech_conf_data[_OPTIONS[CONF_PITCH]],
|
|
CONF_SPEED: self._speech_conf_data[_OPTIONS[CONF_SPEED]],
|
|
CONF_VOLUME: self._speech_conf_data[_OPTIONS[CONF_VOLUME]],
|
|
}
|
|
|
|
@property
|
|
def supported_options(self):
|
|
"""Return a list of supported options."""
|
|
return SUPPORTED_OPTIONS
|
|
|
|
def get_tts_audio(self, message, language, options=None):
|
|
"""Load TTS from BaiduTTS."""
|
|
|
|
aip_speech = AipSpeech(
|
|
self._app_data["appid"],
|
|
self._app_data["apikey"],
|
|
self._app_data["secretkey"],
|
|
)
|
|
|
|
if options is None:
|
|
result = aip_speech.synthesis(message, language, 1, self._speech_conf_data)
|
|
else:
|
|
speech_data = self._speech_conf_data.copy()
|
|
for key, value in options.items():
|
|
speech_data[_OPTIONS[key]] = value
|
|
|
|
result = aip_speech.synthesis(message, language, 1, speech_data)
|
|
|
|
if isinstance(result, dict):
|
|
_LOGGER.error(
|
|
"Baidu TTS error-- err_no:%d; err_msg:%s; err_detail:%s",
|
|
result["err_no"],
|
|
result["err_msg"],
|
|
result["err_detail"],
|
|
)
|
|
return None, None
|
|
|
|
return self._codec, result
|