From 8a350545f033fd3c29aa4342a86db335b3ae1e84 Mon Sep 17 00:00:00 2001 From: definitio <37266727+definitio@users.noreply.github.com> Date: Sun, 22 Nov 2020 15:03:58 +0400 Subject: [PATCH] Improve config validation --- custom_components/rhvoice/tts.py | 51 +++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/custom_components/rhvoice/tts.py b/custom_components/rhvoice/tts.py index 4bef866..43a87e7 100644 --- a/custom_components/rhvoice/tts.py +++ b/custom_components/rhvoice/tts.py @@ -1,10 +1,10 @@ """Support for the RHVoice tts service.""" import logging from asyncio import TimeoutError as aioTimeoutError - -import voluptuous as vol +from itertools import chain import async_timeout +import voluptuous as vol from aiohttp import ClientError from homeassistant.components.tts import PLATFORM_SCHEMA, Provider from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TIMEOUT @@ -19,14 +19,23 @@ CONF_VOICE = 'voice' CONF_VOLUME = 'volume' -SUPPORT_LANGUAGES = ['en-US', 'ru-RU'] +SUPPORTED_FORMATS = ['flac', 'mp3', 'opus', 'wav'] SUPPORTED_OPTIONS = [CONF_VOICE, CONF_FORMAT, CONF_RATE, CONF_PITCH, CONF_VOLUME] +SUPPORTED_LANGUAGES = { + 'en-US': ('alan', 'bdl', 'clb', 'slt'), + 'eo': ('spomenka',), + 'ka-GE': ('natia',), + 'ky-KG': ('azamat', 'nazgul'), + 'pt-BR': ('letícia-f123',), + 'ru-RU': ('aleksandr', 'anna', 'artemiy', 'elena', 'irina'), + 'tt-RU': ('talgat',), + 'uk-UA': ('anatol', 'natalia'), +} + +DEFAULT_PORT = 8080 -# Supported languages and voices: https://github.com/Olga-Yakovleva/RHVoice/wiki/Latest-version DEFAULT_FORMAT = 'mp3' # wav|mp3|opus|flac -DEFAULT_LANG = 'ru-RU' DEFAULT_PITCH = 50 # 0..100 -DEFAULT_PORT = 8080 DEFAULT_RATE = 50 # 0..100 DEFAULT_VOICE = 'anna' DEFAULT_VOLUME = 50 # 0..100 @@ -36,11 +45,21 @@ { vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_FORMAT, default=DEFAULT_FORMAT): cv.string, - vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): cv.positive_int, - vol.Optional(CONF_RATE, default=DEFAULT_RATE): cv.positive_int, - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): cv.string, - vol.Optional(CONF_VOLUME, default=DEFAULT_VOLUME): cv.positive_int, + vol.Optional(CONF_FORMAT, default=DEFAULT_FORMAT): vol.All( + cv.string, vol.In(SUPPORTED_FORMATS) + ), + vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): vol.All( + vol.Coerce(int), vol.Range(0, 100) + ), + vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All( + vol.Coerce(int), vol.Range(0, 100) + ), + vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.All( + cv.string, vol.In(chain(*SUPPORTED_LANGUAGES.values())) + ), + vol.Optional(CONF_VOLUME, default=DEFAULT_VOLUME): vol.All( + vol.Coerce(int), vol.Range(0, 100) + ), } ) @@ -55,17 +74,21 @@ class RHVoiceProvider(Provider): def __init__(self, hass, conf): """Init RHVoice TTS service.""" + self.name = 'RHVoice' self.hass = hass self._url = f'http://{conf.get(CONF_HOST)}:{conf.get(CONF_PORT)}/say' - self._language = DEFAULT_LANG self._codec = conf.get(CONF_FORMAT) self._pitch = conf.get(CONF_PITCH) self._rate = conf.get(CONF_RATE) self._voice = conf.get(CONF_VOICE) self._volume = conf.get(CONF_VOLUME) - self.name = 'RHVoice' self._timeout = conf.get(CONF_TIMEOUT) + for language, voices in SUPPORTED_LANGUAGES.items(): + if self._voice in voices: + self._language = language + break + @property def default_language(self): """Return the default language.""" @@ -74,7 +97,7 @@ def default_language(self): @property def supported_languages(self): """Return list of supported languages.""" - return SUPPORT_LANGUAGES + return list(SUPPORTED_LANGUAGES.keys()) @property def supported_options(self):