diff --git a/.coveragerc b/.coveragerc index 58e1293ba28..33e238de0e7 100644 --- a/.coveragerc +++ b/.coveragerc @@ -608,6 +608,7 @@ omit = homeassistant/components/telegram_bot/* homeassistant/components/thingspeak.py homeassistant/components/tts/amazon_polly.py + homeassistant/components/tts/microsoft.py homeassistant/components/tts/picotts.py homeassistant/components/vacuum/roomba.py homeassistant/components/weather/bom.py diff --git a/homeassistant/components/tts/microsoft.py b/homeassistant/components/tts/microsoft.py new file mode 100644 index 00000000000..4f4c5eb959d --- /dev/null +++ b/homeassistant/components/tts/microsoft.py @@ -0,0 +1,89 @@ +""" +Support for the Microsoft Cognitive Services text-to-speech service. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/tts.microsoft/ +""" +import logging +from http.client import HTTPException + +import voluptuous as vol + +from homeassistant.components.tts import Provider, PLATFORM_SCHEMA, CONF_LANG +from homeassistant.const import CONF_TYPE, CONF_API_KEY +import homeassistant.helpers.config_validation as cv + +CONF_GENDER = 'gender' +CONF_OUTPUT = 'output' + +REQUIREMENTS = ["pycsspeechtts==1.0.1"] + +_LOGGER = logging.getLogger(__name__) + +SUPPORTED_LANGUAGES = [ + 'ar-eg', 'ar-sa', 'ca-es', 'cs-cz', 'da-dk', 'de-at', 'de-ch', 'de-de', + 'el-gr', 'en-au', 'en-ca', 'en-ga', 'en-ie', 'en-in', 'en-us', 'es-es', + 'en-mx', 'fi-fi', 'fr-ca', 'fr-ch', 'fr-fr', 'he-il', 'hi-in', 'hu-hu', + 'id-id', 'it-it', 'ja-jp', 'ko-kr', 'nb-no', 'nl-nl', 'pl-pl', 'pt-br', + 'pt-pt', 'ro-ro', 'ru-ru', 'sk-sk', 'sv-se', 'th-th', 'tr-tr', 'zh-cn', + 'zh-hk', 'zh-tw', +] + +GENDERS = [ + 'Female', 'Male', +] + +DEFAULT_LANG = 'en-us' +DEFAULT_GENDER = 'Female' +DEFAULT_TYPE = 'ZiraRUS' +DEFAULT_OUTPUT = 'audio-16khz-128kbitrate-mono-mp3' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_API_KEY): cv.string, + vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES), + vol.Optional(CONF_GENDER, default=DEFAULT_GENDER): vol.In(GENDERS), + vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string, +}) + + +def get_engine(hass, config): + """Set up Microsoft speech component.""" + return MicrosoftProvider(config[CONF_API_KEY], config[CONF_LANG], + config[CONF_GENDER], config[CONF_TYPE]) + + +class MicrosoftProvider(Provider): + """The Microsoft speech API provider.""" + + def __init__(self, apikey, lang, gender, ttype): + """Init Microsoft TTS service.""" + self._apikey = apikey + self._lang = lang + self._gender = gender + self._type = ttype + self._output = DEFAULT_OUTPUT + self.name = 'Microsoft' + + @property + def default_language(self): + """Return the default language.""" + return self._lang + + @property + def supported_languages(self): + """Return list of supported languages.""" + return SUPPORTED_LANGUAGES + + def get_tts_audio(self, message, language, options=None): + """Load TTS from Microsoft.""" + if language is None: + language = self._lang + from pycsspeechtts import pycsspeechtts + try: + trans = pycsspeechtts.TTSTranslator(self._apikey) + data = trans.speak(language, self._gender, self._type, + self._output, message) + except HTTPException as ex: + _LOGGER.error("Error occurred for Microsoft TTS: %s", ex) + return(None, None) + return ("mp3", data) diff --git a/requirements_all.txt b/requirements_all.txt index 9e8916a39f7..58e8dd387bd 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -613,6 +613,9 @@ pycmus==0.1.0 # homeassistant.components.comfoconnect pycomfoconnect==0.3 +# homeassistant.components.tts.microsoft +pycsspeechtts==1.0.1 + # homeassistant.components.sensor.cups # pycups==1.9.73