From 89fe232643134f283c041537e9f6841f47dc1c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D1=83=D0=B1=D0=BE=D0=B2=D0=B8=D0=BA=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC?= Date: Sun, 20 Dec 2020 06:40:43 +0200 Subject: [PATCH] Add google cloud tts SSML + fix (#40203) * Add SSML + fix SSML option is added + pitch paramter fix + couple style code changes * Remove redundant .get() * Fix PITCH_SCHEMA, remove redundant .get of dict --- homeassistant/components/google_cloud/tts.py | 47 +++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/google_cloud/tts.py b/homeassistant/components/google_cloud/tts.py index 1658fcec1f5..69b276fc75f 100644 --- a/homeassistant/components/google_cloud/tts.py +++ b/homeassistant/components/google_cloud/tts.py @@ -20,6 +20,7 @@ CONF_SPEED = "speed" CONF_PITCH = "pitch" CONF_GAIN = "gain" CONF_PROFILES = "profiles" +CONF_TEXT_TYPE = "text_type" SUPPORTED_LANGUAGES = [ "ar-XA", @@ -84,6 +85,9 @@ MIN_GAIN = -96.0 MAX_GAIN = 16.0 DEFAULT_GAIN = 0 +SUPPORTED_TEXT_TYPES = ["text", "ssml"] +DEFAULT_TEXT_TYPE = "text" + SUPPORTED_PROFILES = [ "wearable-class-device", "handset-class-device", @@ -103,6 +107,7 @@ SUPPORTED_OPTIONS = [ CONF_PITCH, CONF_GAIN, CONF_PROFILES, + CONF_TEXT_TYPE, ] GENDER_SCHEMA = vol.All( @@ -116,6 +121,7 @@ SPEED_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_SPEED, max=MAX_SPEED PITCH_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_PITCH, max=MAX_PITCH)) GAIN_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_GAIN, max=MAX_GAIN)) PROFILES_SCHEMA = vol.All(cv.ensure_list, [vol.In(SUPPORTED_PROFILES)]) +TEXT_TYPE_SCHEMA = vol.All(vol.Lower, vol.In(SUPPORTED_TEXT_TYPES)) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { @@ -128,6 +134,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): PITCH_SCHEMA, vol.Optional(CONF_GAIN, default=DEFAULT_GAIN): GAIN_SCHEMA, vol.Optional(CONF_PROFILES, default=[]): PROFILES_SCHEMA, + vol.Optional(CONF_TEXT_TYPE, default=DEFAULT_TEXT_TYPE): TEXT_TYPE_SCHEMA, } ) @@ -144,14 +151,15 @@ async def async_get_engine(hass, config, discovery_info=None): return GoogleCloudTTSProvider( hass, key_file, - config.get(CONF_LANG), - config.get(CONF_GENDER), - config.get(CONF_VOICE), - config.get(CONF_ENCODING), - config.get(CONF_SPEED), - config.get(CONF_PITCH), - config.get(CONF_GAIN), - config.get(CONF_PROFILES), + config[CONF_LANG], + config[CONF_GENDER], + config[CONF_VOICE], + config[CONF_ENCODING], + config[CONF_SPEED], + config[CONF_PITCH], + config[CONF_GAIN], + config[CONF_PROFILES], + config[CONF_TEXT_TYPE], ) @@ -170,6 +178,7 @@ class GoogleCloudTTSProvider(Provider): pitch=0, gain=0, profiles=None, + text_type=DEFAULT_TEXT_TYPE, ): """Init Google Cloud TTS service.""" self.hass = hass @@ -182,6 +191,7 @@ class GoogleCloudTTSProvider(Provider): self._pitch = pitch self._gain = gain self._profiles = profiles + self._text_type = text_type if key_file: self._client = texttospeech.TextToSpeechClient.from_service_account_json( @@ -216,6 +226,7 @@ class GoogleCloudTTSProvider(Provider): CONF_PITCH: self._pitch, CONF_GAIN: self._gain, CONF_PROFILES: self._profiles, + CONF_TEXT_TYPE: self._text_type, } async def async_get_tts_audio(self, message, language, options=None): @@ -224,11 +235,12 @@ class GoogleCloudTTSProvider(Provider): { vol.Optional(CONF_GENDER, default=self._gender): GENDER_SCHEMA, vol.Optional(CONF_VOICE, default=self._voice): VOICE_SCHEMA, - vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): SCHEMA_ENCODING, + vol.Optional(CONF_ENCODING, default=self._encoding): SCHEMA_ENCODING, vol.Optional(CONF_SPEED, default=self._speed): SPEED_SCHEMA, - vol.Optional(CONF_PITCH, default=self._speed): SPEED_SCHEMA, - vol.Optional(CONF_GAIN, default=DEFAULT_GAIN): GAIN_SCHEMA, - vol.Optional(CONF_PROFILES, default=[]): PROFILES_SCHEMA, + vol.Optional(CONF_PITCH, default=self._pitch): PITCH_SCHEMA, + vol.Optional(CONF_GAIN, default=self._gain): GAIN_SCHEMA, + vol.Optional(CONF_PROFILES, default=self._profiles): PROFILES_SCHEMA, + vol.Optional(CONF_TEXT_TYPE, default=self._text_type): TEXT_TYPE_SCHEMA, } ) options = options_schema(options) @@ -239,8 +251,9 @@ class GoogleCloudTTSProvider(Provider): language = _voice[:5] try: + params = {options[CONF_TEXT_TYPE]: message} # pylint: disable=no-member - synthesis_input = texttospeech.types.SynthesisInput(text=message) + synthesis_input = texttospeech.types.SynthesisInput(**params) voice = texttospeech.types.VoiceSelectionParams( language_code=language, @@ -250,10 +263,10 @@ class GoogleCloudTTSProvider(Provider): audio_config = texttospeech.types.AudioConfig( audio_encoding=texttospeech.enums.AudioEncoding[_encoding], - speaking_rate=options.get(CONF_SPEED), - pitch=options.get(CONF_PITCH), - volume_gain_db=options.get(CONF_GAIN), - effects_profile_id=options.get(CONF_PROFILES), + speaking_rate=options[CONF_SPEED], + pitch=options[CONF_PITCH], + volume_gain_db=options[CONF_GAIN], + effects_profile_id=options[CONF_PROFILES], ) # pylint: enable=no-member