diff --git a/homeassistant/components/baidu/tts.py b/homeassistant/components/baidu/tts.py index 064dfb8d24c..03aced2282c 100644 --- a/homeassistant/components/baidu/tts.py +++ b/homeassistant/components/baidu/tts.py @@ -1,6 +1,7 @@ """Support for Baidu speech service.""" import logging +from typing import Any from aip import AipSpeech import voluptuous as vol @@ -9,6 +10,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.const import CONF_API_KEY from homeassistant.helpers import config_validation as cv @@ -85,17 +87,17 @@ class BaiduTTSProvider(Provider): } @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._lang @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return a list of supported languages.""" return SUPPORTED_LANGUAGES @property - def default_options(self): + def default_options(self) -> dict[str, Any]: """Return a dict including default options.""" return { CONF_PERSON: self._speech_conf_data[_OPTIONS[CONF_PERSON]], @@ -105,11 +107,16 @@ class BaiduTTSProvider(Provider): } @property - def supported_options(self): + def supported_options(self) -> list[str]: """Return a list of supported options.""" return SUPPORTED_OPTIONS - def get_tts_audio(self, message, language, options): + def get_tts_audio( + self, + message: str, + language: str, + options: dict[str, Any], + ) -> TtsAudioType: """Load TTS from BaiduTTS.""" aip_speech = AipSpeech( diff --git a/homeassistant/components/marytts/tts.py b/homeassistant/components/marytts/tts.py index 08d78ecf5c3..257a2c22854 100644 --- a/homeassistant/components/marytts/tts.py +++ b/homeassistant/components/marytts/tts.py @@ -2,6 +2,8 @@ from __future__ import annotations +from typing import Any + from speak2mary import MaryTTS import voluptuous as vol @@ -9,6 +11,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.const import CONF_EFFECT, CONF_HOST, CONF_PORT from homeassistant.helpers import config_validation as cv @@ -66,26 +69,28 @@ class MaryTTSProvider(Provider): self.name = "MaryTTS" @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._mary.locale @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return list of supported languages.""" return SUPPORT_LANGUAGES @property - def default_options(self): + def default_options(self) -> dict[str, Any]: """Return dict include default options.""" return {CONF_EFFECT: self._effects} @property - def supported_options(self): + def supported_options(self) -> list[str]: """Return a list of supported options.""" return SUPPORT_OPTIONS - def get_tts_audio(self, message, language, options): + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Load TTS from MaryTTS.""" effects = options[CONF_EFFECT] diff --git a/homeassistant/components/microsoft/tts.py b/homeassistant/components/microsoft/tts.py index b5e770601b4..d36c4d7c1c1 100644 --- a/homeassistant/components/microsoft/tts.py +++ b/homeassistant/components/microsoft/tts.py @@ -1,6 +1,7 @@ """Support for the Microsoft Cognitive Services text-to-speech service.""" import logging +from typing import Any from pycsspeechtts import pycsspeechtts from requests.exceptions import HTTPError @@ -10,6 +11,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.const import CONF_API_KEY, CONF_REGION, CONF_TYPE, PERCENTAGE from homeassistant.generated.microsoft_tts import SUPPORTED_LANGUAGES @@ -89,26 +91,28 @@ class MicrosoftProvider(Provider): self.name = "Microsoft" @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._lang @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return list of supported languages.""" - return SUPPORTED_LANGUAGES + return list(SUPPORTED_LANGUAGES) @property - def supported_options(self): + def supported_options(self) -> list[str]: """Return list of supported options like voice, emotion.""" return [CONF_GENDER, CONF_TYPE] @property - def default_options(self): + def default_options(self) -> dict[str, Any]: """Return a dict include default options.""" return {CONF_GENDER: self._gender, CONF_TYPE: self._type} - def get_tts_audio(self, message, language, options): + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Load TTS from Microsoft.""" if language is None: language = self._lang diff --git a/homeassistant/components/picotts/tts.py b/homeassistant/components/picotts/tts.py index 54caf1a2b26..11cb2d7f557 100644 --- a/homeassistant/components/picotts/tts.py +++ b/homeassistant/components/picotts/tts.py @@ -5,6 +5,7 @@ import os import shutil import subprocess import tempfile +from typing import Any import voluptuous as vol @@ -12,6 +13,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) _LOGGER = logging.getLogger(__name__) @@ -42,16 +44,18 @@ class PicoProvider(Provider): self.name = "PicoTTS" @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._lang @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return list of supported languages.""" return SUPPORT_LANGUAGES - def get_tts_audio(self, message, language, options): + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Load TTS using pico2wave.""" with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmpf: fname = tmpf.name diff --git a/homeassistant/components/voicerss/tts.py b/homeassistant/components/voicerss/tts.py index 6bf42d86836..dfb9a0c7a80 100644 --- a/homeassistant/components/voicerss/tts.py +++ b/homeassistant/components/voicerss/tts.py @@ -3,6 +3,7 @@ import asyncio from http import HTTPStatus import logging +from typing import TYPE_CHECKING, Any import aiohttp import voluptuous as vol @@ -11,6 +12,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.const import CONF_API_KEY from homeassistant.helpers import config_validation as cv @@ -182,17 +184,21 @@ class VoiceRSSProvider(Provider): } @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._lang @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return list of supported languages.""" return SUPPORT_LANGUAGES - async def async_get_tts_audio(self, message, language, options): + async def async_get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Load TTS from VoiceRSS.""" + if TYPE_CHECKING: + assert self.hass websession = async_get_clientsession(self.hass) form_data = self._form_data.copy() diff --git a/homeassistant/components/watson_tts/tts.py b/homeassistant/components/watson_tts/tts.py index 194e0905ff0..96e68fbcc41 100644 --- a/homeassistant/components/watson_tts/tts.py +++ b/homeassistant/components/watson_tts/tts.py @@ -1,6 +1,7 @@ """Support for IBM Watson TTS integration.""" import logging +from typing import Any from ibm_cloud_sdk_core.authenticators import IAMAuthenticator from ibm_watson import TextToSpeechV1 @@ -9,6 +10,7 @@ import voluptuous as vol from homeassistant.components.tts import ( PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.helpers import config_validation as cv @@ -163,26 +165,28 @@ class WatsonTTSProvider(Provider): self.name = "Watson TTS" @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return a list of supported languages.""" return self.supported_langs @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self.default_lang @property - def default_options(self): + def default_options(self) -> dict[str, Any]: """Return dict include default options.""" return {CONF_VOICE: self.default_voice} @property - def supported_options(self): + def supported_options(self) -> list[str]: """Return a list of supported options.""" return [CONF_VOICE] - def get_tts_audio(self, message, language, options): + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Request TTS file from Watson TTS.""" response = self.service.synthesize( text=message, accept=self.output_format, voice=options[CONF_VOICE] diff --git a/homeassistant/components/yandextts/tts.py b/homeassistant/components/yandextts/tts.py index c7621eb639a..0d682c61417 100644 --- a/homeassistant/components/yandextts/tts.py +++ b/homeassistant/components/yandextts/tts.py @@ -3,6 +3,7 @@ import asyncio from http import HTTPStatus import logging +from typing import TYPE_CHECKING, Any import aiohttp import voluptuous as vol @@ -11,6 +12,7 @@ from homeassistant.components.tts import ( CONF_LANG, PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, Provider, + TtsAudioType, ) from homeassistant.const import CONF_API_KEY from homeassistant.helpers import config_validation as cv @@ -104,22 +106,26 @@ class YandexSpeechKitProvider(Provider): self.name = "YandexTTS" @property - def default_language(self): + def default_language(self) -> str: """Return the default language.""" return self._language @property - def supported_languages(self): + def supported_languages(self) -> list[str]: """Return list of supported languages.""" return SUPPORT_LANGUAGES @property - def supported_options(self): + def supported_options(self) -> list[str]: """Return list of supported options.""" return SUPPORTED_OPTIONS - async def async_get_tts_audio(self, message, language, options): + async def async_get_tts_audio( + self, message: str, language: str, options: dict[str, Any] + ) -> TtsAudioType: """Load TTS from yandex.""" + if TYPE_CHECKING: + assert self.hass websession = async_get_clientsession(self.hass) actual_language = language diff --git a/pylint/plugins/hass_enforce_type_hints.py b/pylint/plugins/hass_enforce_type_hints.py index 10aa0170b93..38b27f9b81a 100644 --- a/pylint/plugins/hass_enforce_type_hints.py +++ b/pylint/plugins/hass_enforce_type_hints.py @@ -2710,24 +2710,29 @@ _INHERITANCE_MATCH: dict[str, list[ClassTypeHintMatch]] = { TypeHintMatch( function_name="default_language", return_type=["str", None], + mandatory=True, ), TypeHintMatch( function_name="supported_languages", return_type=["list[str]", None], + mandatory=True, ), TypeHintMatch( function_name="supported_options", return_type=["list[str]", None], + mandatory=True, ), TypeHintMatch( function_name="default_options", return_type=["Mapping[str, Any]", None], + mandatory=True, ), TypeHintMatch( function_name="get_tts_audio", arg_types={1: "str", 2: "str", 3: "dict[str, Any]"}, return_type="TtsAudioType", has_async_counterpart=True, + mandatory=True, ), ], ),