Allow to pass YandexTTS options via sevice call (#10578)

This commit is contained in:
Andrey 2017-11-16 19:10:25 +02:00 committed by Paulus Schoutsen
parent bd5a16d70b
commit 072ed7ea13
3 changed files with 57 additions and 6 deletions

View file

@ -286,10 +286,11 @@ class SpeechManager(object):
options = options or provider.default_options options = options or provider.default_options
if options is not None: if options is not None:
invalid_opts = [opt_name for opt_name in options.keys() invalid_opts = [opt_name for opt_name in options.keys()
if opt_name not in provider.supported_options] if opt_name not in (provider.supported_options or
[])]
if invalid_opts: if invalid_opts:
raise HomeAssistantError( raise HomeAssistantError(
"Invalid options found: %s", invalid_opts) "Invalid options found: {}".format(invalid_opts))
options_key = ctypes.c_size_t(hash(frozenset(options))).value options_key = ctypes.c_size_t(hash(frozenset(options))).value
else: else:
options_key = '-' options_key = '-'

View file

@ -63,6 +63,13 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Range(min=MIN_SPEED, max=MAX_SPEED) vol.Range(min=MIN_SPEED, max=MAX_SPEED)
}) })
SUPPORTED_OPTIONS = [
CONF_CODEC,
CONF_VOICE,
CONF_EMOTION,
CONF_SPEED,
]
@asyncio.coroutine @asyncio.coroutine
def async_get_engine(hass, config): def async_get_engine(hass, config):
@ -94,11 +101,17 @@ class YandexSpeechKitProvider(Provider):
"""Return list of supported languages.""" """Return list of supported languages."""
return SUPPORT_LANGUAGES return SUPPORT_LANGUAGES
@property
def supported_options(self):
"""Return list of supported options."""
return SUPPORTED_OPTIONS
@asyncio.coroutine @asyncio.coroutine
def async_get_tts_audio(self, message, language, options=None): def async_get_tts_audio(self, message, language, options=None):
"""Load TTS from yandex.""" """Load TTS from yandex."""
websession = async_get_clientsession(self.hass) websession = async_get_clientsession(self.hass)
actual_language = language actual_language = language
options = options or {}
try: try:
with async_timeout.timeout(10, loop=self.hass.loop): with async_timeout.timeout(10, loop=self.hass.loop):
@ -106,10 +119,10 @@ class YandexSpeechKitProvider(Provider):
'text': message, 'text': message,
'lang': actual_language, 'lang': actual_language,
'key': self._key, 'key': self._key,
'speaker': self._speaker, 'speaker': options.get(CONF_VOICE, self._speaker),
'format': self._codec, 'format': options.get(CONF_CODEC, self._codec),
'emotion': self._emotion, 'emotion': options.get(CONF_EMOTION, self._emotion),
'speed': self._speed 'speed': options.get(CONF_SPEED, self._speed)
} }
request = yield from websession.get( request = yield from websession.get(

View file

@ -363,3 +363,40 @@ class TestTTSYandexPlatform(object):
assert len(aioclient_mock.mock_calls) == 1 assert len(aioclient_mock.mock_calls) == 1
assert len(calls) == 1 assert len(calls) == 1
def test_service_say_specified_options(self, aioclient_mock):
"""Test service call say with options."""
calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA)
url_param = {
'text': 'HomeAssistant',
'lang': 'en-US',
'key': '1234567xx',
'speaker': 'zahar',
'format': 'mp3',
'emotion': 'evil',
'speed': 2
}
aioclient_mock.get(
self._base_url, status=200, content=b'test', params=url_param)
config = {
tts.DOMAIN: {
'platform': 'yandextts',
'api_key': '1234567xx',
}
}
with assert_setup_component(1, tts.DOMAIN):
setup_component(self.hass, tts.DOMAIN, config)
self.hass.services.call(tts.DOMAIN, 'yandextts_say', {
tts.ATTR_MESSAGE: "HomeAssistant",
'options': {
'emotion': 'evil',
'speed': 2,
}
})
self.hass.block_till_done()
assert len(aioclient_mock.mock_calls) == 1
assert len(calls) == 1