Add options feature to Baidu TTS. (#11462)

* Add options feature to Baidu TTS.

Add options feature: supported_options() and default_options() added, get_tts_audio updated to accommodate options.

* Add options feature to Baidu TTS.

Add options feature: supported_options() and default_options() added, get_tts_audio updated to accommodate options.

* Fix style

* Fix style

Change the order of content of lists and dictionaries.

* Fix style

Changed order of imports, and fixed grammar errors.
This commit is contained in:
Yien Xu 2018-01-09 00:22:50 +08:00 committed by Pascal Vizeli
parent 0e710099e0
commit e0e2f739ba

View File

@ -1,5 +1,5 @@
""" """
Support for the baidu speech service. Support for Baidu speech service.
For more details about this component, please refer to the documentation at For more details about this component, please refer to the documentation at
https://home-assistant.io/components/tts.baidu/ https://home-assistant.io/components/tts.baidu/
@ -8,22 +8,17 @@ https://home-assistant.io/components/tts.baidu/
import logging import logging
import voluptuous as vol import voluptuous as vol
from homeassistant.components.tts import Provider, CONF_LANG, PLATFORM_SCHEMA
from homeassistant.const import CONF_API_KEY from homeassistant.const import CONF_API_KEY
from homeassistant.components.tts import Provider, PLATFORM_SCHEMA, CONF_LANG
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
REQUIREMENTS = ["baidu-aip==1.6.6"] REQUIREMENTS = ["baidu-aip==1.6.6"]
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
SUPPORTED_LANGUAGES = ['zh']
SUPPORT_LANGUAGES = [
'zh',
]
DEFAULT_LANG = 'zh' DEFAULT_LANG = 'zh'
CONF_APP_ID = 'app_id' CONF_APP_ID = 'app_id'
CONF_SECRET_KEY = 'secret_key' CONF_SECRET_KEY = 'secret_key'
CONF_SPEED = 'speed' CONF_SPEED = 'speed'
@ -32,20 +27,39 @@ CONF_VOLUME = 'volume'
CONF_PERSON = 'person' CONF_PERSON = 'person'
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES),
vol.Required(CONF_APP_ID): cv.string, vol.Required(CONF_APP_ID): cv.string,
vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_API_KEY): cv.string,
vol.Required(CONF_SECRET_KEY): cv.string, vol.Required(CONF_SECRET_KEY): cv.string,
vol.Optional(CONF_SPEED, default=5): vol.All( vol.Optional(CONF_SPEED, default=5): vol.All(
vol.Coerce(int), vol.Range(min=0, max=9)), vol.Coerce(int), vol.Range(min=0, max=9)
),
vol.Optional(CONF_PITCH, default=5): vol.All( vol.Optional(CONF_PITCH, default=5): vol.All(
vol.Coerce(int), vol.Range(min=0, max=9)), vol.Coerce(int), vol.Range(min=0, max=9)
),
vol.Optional(CONF_VOLUME, default=5): vol.All( vol.Optional(CONF_VOLUME, default=5): vol.All(
vol.Coerce(int), vol.Range(min=0, max=15)), vol.Coerce(int), vol.Range(min=0, max=15)
),
vol.Optional(CONF_PERSON, default=0): vol.All( vol.Optional(CONF_PERSON, default=0): vol.All(
vol.Coerce(int), vol.Range(min=0, max=4)), 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): def get_engine(hass, config):
"""Set up Baidu TTS component.""" """Set up Baidu TTS component."""
@ -66,14 +80,14 @@ class BaiduTTSProvider(Provider):
'appid': conf.get(CONF_APP_ID), 'appid': conf.get(CONF_APP_ID),
'apikey': conf.get(CONF_API_KEY), 'apikey': conf.get(CONF_API_KEY),
'secretkey': conf.get(CONF_SECRET_KEY), 'secretkey': conf.get(CONF_SECRET_KEY),
} }
self._speech_conf_data = { self._speech_conf_data = {
'spd': conf.get(CONF_SPEED), _OPTIONS[CONF_PERSON]: conf.get(CONF_PERSON),
'pit': conf.get(CONF_PITCH), _OPTIONS[CONF_PITCH]: conf.get(CONF_PITCH),
'vol': conf.get(CONF_VOLUME), _OPTIONS[CONF_SPEED]: conf.get(CONF_SPEED),
'per': conf.get(CONF_PERSON), _OPTIONS[CONF_VOLUME]: conf.get(CONF_VOLUME),
} }
@property @property
def default_language(self): def default_language(self):
@ -82,8 +96,23 @@ class BaiduTTSProvider(Provider):
@property @property
def supported_languages(self): def supported_languages(self):
"""Return list of supported languages.""" """Return a list of supported languages."""
return SUPPORT_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): def get_tts_audio(self, message, language, options=None):
"""Load TTS from BaiduTTS.""" """Load TTS from BaiduTTS."""
@ -92,17 +121,28 @@ class BaiduTTSProvider(Provider):
self._app_data['appid'], self._app_data['appid'],
self._app_data['apikey'], self._app_data['apikey'],
self._app_data['secretkey'] self._app_data['secretkey']
) )
result = aip_speech.synthesis( if options is None:
message, language, 1, self._speech_conf_data) 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): if isinstance(result, dict):
_LOGGER.error( _LOGGER.error(
"Baidu TTS error-- err_no:%d; err_msg:%s; err_detail:%s", "Baidu TTS error-- err_no:%d; err_msg:%s; err_detail:%s",
result['err_no'], result['err_no'],
result['err_msg'], result['err_msg'],
result['err_detail']) result['err_detail']
return (None, None) )
return None, None
return (self._codec, result) return self._codec, result