├── images ├── example.png ├── folders.png ├── service.png └── service_small.png ├── hacs.json ├── custom_components └── reversotts │ ├── strings.json │ ├── manifest.json │ ├── translations │ ├── en.json │ └── fr.json │ ├── __init__.py │ ├── config_flow.py │ ├── const.py │ └── tts.py ├── .github └── workflows │ └── validate.yml └── README.md /images/example.png: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hacs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Reverso TTS / tts", 3 | "render_readme": true 4 | } 5 | -------------------------------------------------------------------------------- /images/folders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rt400/ReversoTTS-HA/HEAD/images/folders.png -------------------------------------------------------------------------------- /images/service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rt400/ReversoTTS-HA/HEAD/images/service.png -------------------------------------------------------------------------------- /images/service_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rt400/ReversoTTS-HA/HEAD/images/service_small.png -------------------------------------------------------------------------------- /custom_components/reversotts/strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "step": { 4 | "user": { 5 | "data": { 6 | "language": "Language", 7 | "pitch": "Pitch", 8 | "bitrate": "Bitrate" 9 | } 10 | } 11 | }, 12 | "abort": { 13 | "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /custom_components/reversotts/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "domain": "reversotts", 3 | "name": "Reverso TTS", 4 | "version": "1.1.0", 5 | "documentation": "https://github.com/rt400/ReversoTTS-HA", 6 | "dependencies": [], 7 | "codeowners": ["@yuval_mejahez"], 8 | "requirements": ["pyttsreverso==0.4"], 9 | "issue_tracker": "https://github.com/rt400/ReversoTTS-HA/issues", 10 | "iot_class": "cloud_push", 11 | "config_flow": true 12 | } 13 | -------------------------------------------------------------------------------- /custom_components/reversotts/translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Service is already configured" 5 | }, 6 | "step": { 7 | "user": { 8 | "data": { 9 | "language": "Language", 10 | "pitch": "Speak speed", 11 | "bitrate": "Bitrate" 12 | } 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /custom_components/reversotts/translations/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Le service est déjà configuré" 5 | }, 6 | "step": { 7 | "user": { 8 | "data": { 9 | "language": "Langue", 10 | "pitch": "Vitesse de parole", 11 | "bitrate": "Taux d'échantillonnage" 12 | } 13 | } 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /custom_components/reversotts/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from homeassistant.config_entries import ConfigEntry 4 | from homeassistant.const import Platform 5 | from homeassistant.core import HomeAssistant 6 | 7 | PLATFORMS: tuple[Platform] = Platform.TTS 8 | 9 | 10 | async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 11 | """Set up Reverso TTS from a config entry.""" 12 | await hass.config_entries.async_forward_entry_setup(entry, PLATFORMS) 13 | 14 | return True 15 | 16 | 17 | async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 18 | """Unload a config entry.""" 19 | return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) 20 | -------------------------------------------------------------------------------- /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: Validate 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: 7 | - cron: "0 0 * * *" 8 | 9 | # jobs: 10 | # validate: 11 | # runs-on: "ubuntu-latest" 12 | # steps: 13 | # - uses: "actions/checkout@v2" 14 | # - uses: "home-assistant/actions/hassfest@master" 15 | # - name: HACS validation 16 | # uses: "hacs/integration/action@main" 17 | # with: 18 | # # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 19 | # CATEGORY: "integration" 20 | jobs: 21 | validate: 22 | runs-on: "ubuntu-latest" 23 | steps: 24 | - uses: "actions/checkout@v2" 25 | - name: HACS validation 26 | uses: "hacs/action@main" 27 | with: 28 | category: "integration" 29 | -------------------------------------------------------------------------------- /custom_components/reversotts/config_flow.py: -------------------------------------------------------------------------------- 1 | """Config flow for Reverso TTS integration.""" 2 | from __future__ import annotations 3 | 4 | from typing import Any 5 | 6 | import voluptuous as vol 7 | 8 | from homeassistant import config_entries 9 | from homeassistant.components.tts import CONF_LANG 10 | from homeassistant.data_entry_flow import FlowResult 11 | 12 | from .const import ( 13 | CONF_BITRATE, 14 | CONF_PITCH, 15 | DEFAULT_BITRATE, 16 | DEFAULT_LANG, 17 | DEFAULT_PITCH, 18 | DOMAIN, 19 | SUPPORT_LANGUAGES, 20 | ) 21 | 22 | STEP_USER_DATA_SCHEMA = vol.Schema( 23 | { 24 | vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), 25 | vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): str, 26 | vol.Optional(CONF_BITRATE, default=DEFAULT_BITRATE): vol.In( 27 | ["22k", "96k", "128k", "192k", "320k"] 28 | ), 29 | } 30 | ) 31 | 32 | 33 | class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): 34 | """Handle a config flow for Reverso TTS.""" 35 | 36 | VERSION = 1 37 | 38 | async def async_step_user( 39 | self, user_input: dict[str, Any] | None = None 40 | ) -> FlowResult: 41 | """Handle the initial step.""" 42 | if user_input is not None: 43 | self._async_abort_entries_match( 44 | { 45 | CONF_LANG: user_input[CONF_LANG], 46 | CONF_PITCH: user_input[CONF_PITCH], 47 | CONF_BITRATE: user_input[CONF_BITRATE], 48 | } 49 | ) 50 | return self.async_create_entry(title="Reverso TTS", data=user_input) 51 | 52 | return self.async_show_form(step_id="user", data_schema=STEP_USER_DATA_SCHEMA) 53 | 54 | async def async_step_onboarding( 55 | self, data: dict[str, Any] | None = None 56 | ) -> FlowResult: 57 | """Handle a flow initialized by onboarding.""" 58 | return self.async_create_entry( 59 | title="Reverso TTS", 60 | data={ 61 | CONF_LANG: DEFAULT_LANG, 62 | CONF_PITCH: DEFAULT_PITCH, 63 | CONF_BITRATE: DEFAULT_BITRATE, 64 | }, 65 | ) 66 | -------------------------------------------------------------------------------- /custom_components/reversotts/const.py: -------------------------------------------------------------------------------- 1 | """Constants for the reverso integration.""" 2 | 3 | DOMAIN = "reversotts" 4 | CONF_PITCH = "pitch" 5 | CONF_BITRATE = "bitrate" 6 | DEFAULT_LANG = "Sharon-US-English" 7 | DEFAULT_PITCH = "100" 8 | DEFAULT_BITRATE = "128k" 9 | SUPPORT_OPTIONS = ["pitch", "bitrate"] 10 | BITRATE_OPTIONS = ["22k", "96k", "128k", "192k", "320k"] 11 | 12 | SUPPORT_LANGUAGES = [ 13 | "Leila-Arabic", 14 | "Mehdi-Arabic", 15 | "Nizar-Arabic", 16 | "Salma-Arabic", 17 | "Lisa-Australian-English", 18 | "Tyler-Australian-English", 19 | "Jeroen-Belgian-Dutch", 20 | "Sofie-Belgian-Dutch", 21 | "Zoe-Belgian-Dutch", 22 | "Alice-BE-Belgian-French", 23 | "Anais-BE-Belgian-French", 24 | "Antoine-BE-Belgian-French", 25 | "Bruno-BE-Belgian-French", 26 | "Claire-BE-Belgian-French", 27 | "Julie-BE-Belgian-French", 28 | "Justine-Belgian-French", 29 | "Manon-BE-Belgian-French", 30 | "Margaux-BE-Belgian-French", 31 | "Marcia-Brazilian", 32 | "Graham-British", 33 | "Lucy-British", 34 | "Peter-British", 35 | "QueenElizabeth-British", 36 | "Rachel-British", 37 | "Louise-Canadian-French", 38 | "Laia-Catalan", 39 | "Eliska-Czech", 40 | "Mette-Danish", 41 | "Rasmus-Danish", 42 | "Daan-Dutch", 43 | "Femke-Dutch", 44 | "Jasmijn-Dutch", 45 | "Max-Dutch", 46 | "Samuel-Finland-Swedish", 47 | "Sanna-Finnish", 48 | "Alice-French", 49 | "Anais-French", 50 | "Antoine-French", 51 | "Bruno-French", 52 | "Claire-French", 53 | "Julie-French", 54 | "Manon-French", 55 | "Margaux-French", 56 | "Andreas-German", 57 | "Claudia-German", 58 | "Julia-German", 59 | "Klaus-German", 60 | "Sarah-German", 61 | "Kal-Gothenburg-Swedish", 62 | "Dimitris-Greek", 63 | "he-IL-Asaf-Hebrew", 64 | "Deepa-Indian-English", 65 | "Chiara-Italian", 66 | "Fabiana-Italian", 67 | "Vittorio-Italian", 68 | "Sakura-Japanese", 69 | "Minji-Korean", 70 | "Lulu-Mandarin-Chinese", 71 | "Bente-Norwegian", 72 | "Kari-Norwegian", 73 | "Olav-Norwegian", 74 | "Ania-Polish", 75 | "Monika-Polish", 76 | "Celia-Portuguese", 77 | "ro-RO-Andrei-Romanian", 78 | "Alyona-Russian", 79 | "Mia-Scanian", 80 | "Antonio-Spanish", 81 | "Ines-Spanish", 82 | "Maria-Spanish", 83 | "Elin-Swedish", 84 | "Emil-Swedish", 85 | "Emma-Swedish", 86 | "Erik-Swedish", 87 | "Ipek-Turkish", 88 | "Heather-US-English", 89 | "Karen-US-English", 90 | "Kenny-US-English", 91 | "Laura-US-English", 92 | "Micah-US-English", 93 | "Nelly-US-English", 94 | "Rod-US-English", 95 | "Ryan-US-English", 96 | "Saul-US-English", 97 | "Sharon-US-English", 98 | "Tracy-US-English", 99 | "Will-US-English", 100 | "Rodrigo-US-Spanish", 101 | "Rosa-US-Spanish", 102 | ] 103 | -------------------------------------------------------------------------------- /custom_components/reversotts/tts.py: -------------------------------------------------------------------------------- 1 | """Support for the Reverso TTS speech service.""" 2 | import logging 3 | 4 | from pyttsreverso import pyttsreverso 5 | import voluptuous as vol 6 | 7 | from homeassistant.components.tts import ( 8 | CONF_LANG, 9 | PLATFORM_SCHEMA, 10 | Provider, 11 | TextToSpeechEntity, 12 | TtsAudioType, 13 | ) 14 | from homeassistant.config_entries import ConfigEntry 15 | from homeassistant.core import HomeAssistant 16 | from homeassistant.helpers.entity_platform import AddEntitiesCallback 17 | from homeassistant.helpers.typing import ConfigType 18 | 19 | from .const import ( 20 | CONF_BITRATE, 21 | CONF_PITCH, 22 | DEFAULT_BITRATE, 23 | DEFAULT_LANG, 24 | DEFAULT_PITCH, 25 | SUPPORT_LANGUAGES, 26 | SUPPORT_OPTIONS, 27 | ) 28 | 29 | _LOGGER = logging.getLogger(__name__) 30 | 31 | PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( 32 | { 33 | vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), 34 | vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): str, 35 | vol.Optional(CONF_BITRATE, default=DEFAULT_BITRATE): str, 36 | } 37 | ) 38 | 39 | 40 | def get_engine(config: ConfigType, discovery_info=None): 41 | """Set up Reverso speech component.""" 42 | return ReversoProvider( 43 | config[CONF_LANG], 44 | config[CONF_PITCH], 45 | config[CONF_BITRATE], 46 | ) 47 | 48 | 49 | async def async_setup_entry( 50 | hass: HomeAssistant, 51 | config_entry: ConfigEntry, 52 | async_add_entities: AddEntitiesCallback, 53 | ) -> None: 54 | """Set up Reverso speech platform via config entry.""" 55 | default_language = config_entry.data[CONF_LANG] 56 | default_pitch = config_entry.data[CONF_PITCH] 57 | default_bitrate = config_entry.data[CONF_BITRATE] 58 | async_add_entities( 59 | [ReversoTTSEntity(default_language, default_pitch, default_bitrate)] 60 | ) 61 | 62 | 63 | class ReversoTTSEntity(TextToSpeechEntity): 64 | """The Reverso TTS API provider.""" 65 | 66 | def __init__(self, lang: str, pitch: int, bitrate: str): 67 | """Initialize Reverso TTS provider.""" 68 | self._lang = lang 69 | self._pitch = pitch 70 | self._bitrate = bitrate 71 | self.name = "Reverso TTS" 72 | 73 | @property 74 | def default_language(self): 75 | """Return the default language.""" 76 | return self._lang 77 | 78 | @property 79 | def supported_languages(self): 80 | """Return list of supported languages.""" 81 | return SUPPORT_LANGUAGES 82 | 83 | def get_tts_audio(self, message, language, options=None): 84 | """Load TTS using pyttsreverso.""" 85 | if language is None: 86 | language = self._lang 87 | try: 88 | convert = pyttsreverso.ReversoTTS() 89 | data = convert.convert_text( 90 | voice=language, pitch=self._pitch, bitrate=self._bitrate, msg=message 91 | ) 92 | except Exception as e: 93 | _LOGGER.error("Error while to convert: %s", str(e)) 94 | return (None, None) 95 | return ("mp3", data) 96 | 97 | 98 | class ReversoProvider(Provider): 99 | """The Reverso TTS API provider.""" 100 | 101 | def __init__(self, lang: str, pitch: int, bitrate) -> None: 102 | """Initialize Reverso TTS provider.""" 103 | self._lang = lang 104 | self._pitch = pitch 105 | self._bitrate = bitrate 106 | self.name = "Reverso TTS" 107 | 108 | @property 109 | def default_language(self): 110 | """Return the default language.""" 111 | return self._lang 112 | 113 | @property 114 | def supported_languages(self): 115 | """Return list of supported languages.""" 116 | return SUPPORT_LANGUAGES 117 | 118 | @property 119 | def supported_options(self) -> list[str]: 120 | """Return a list of supported options.""" 121 | return SUPPORT_OPTIONS 122 | 123 | def get_tts_audio(self, message, language, options=None) -> TtsAudioType: 124 | """Load TTS using pyttsreverso.""" 125 | if language is None: 126 | language = self._lang 127 | try: 128 | convert = pyttsreverso.ReversoTTS() 129 | data = convert.convert_text( 130 | voice=language, pitch=self._pitch, bitrate=self._bitrate, msg=message 131 | ) 132 | except Exception as e: 133 | _LOGGER.error("Error while to convert: %s", str(e)) 134 | return (None, None) 135 | return ("mp3", data) 136 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![hacs_badge](https://img.shields.io/badge/HACS-Default-orange.svg?style=for-the-badge)](https://github.com/custom-components/hacs) 2 | # ReversoTTS component for HomeAssistant 3 | 4 | The `ReversoTTS` text-to-speech platform uses online Reverso Text-to-Speech engine to read a text with natural sounding voices. 5 | 6 | ## Installation 7 | 8 | ### With HACS 9 | 10 | You can install it from within HACS by clicking on the button below (recommended). 11 | 12 | [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=PhoenixR49&repository=hass-huggingchat-conversation&category=Integration) 13 | 14 | ### Manually 15 | 16 | First download all files in folder https://github.com/rt400/ReversoTTS-HA/tree/master/custom_components/reversotts . 17 | Now you need to create folder "reversotts" in your HomeAssistant config/custom_components folder and copy all files that you already download. 18 | So after that you need to see like this example : 19 | 20 | ![GitHub Logo](/images/folders.png) 21 | 22 | ### Configuration Optinal Variables 23 | 24 | #### Language 25 | 26 | The language to use. Supported languages are in this table, please use only the name from **LangCode** column: 27 | 28 | | LangCode | Voice | Gender | Language | 29 | | ------------- | ------------- | ------------- | ------------- | 30 | | Leila-Arabic | Leila22k | Female | Arabic | 31 | | Mehdi-Arabic | Mehdi22k | Male | Arabic | 32 | | Nizar-Arabic | Nizar22k | Male | Arabic | 33 | | Salma-Arabic | Salma22k | Female | Arabic | 34 | | Lisa-Australian-English | Lisa22k | Female | Australian English | 35 | | Tyler-Australian-English | Tyler22k | Male | Australian English | 36 | | Jeroen-Belgian-Dutch | Jeroen22k | Male | Belgian Dutch | 37 | | Sofie-Belgian-Dutch | Sofie22k | Female | Belgian Dutch | 38 | | Zoe-Belgian-Dutch | Zoe22k | Female | Belgian Dutch | 39 | | Alice-BE-Belgian-French | Alice-BE22k | Female | Belgian French | 40 | | Anais-BE-Belgian-French | Anais-BE22k | Female | Belgian French | 41 | | Antoine-BE-Belgian-French | Antoine-BE22k | Male | Belgian French | 42 | | Bruno-BE-Belgian-French | Bruno-BE22k | Male | Belgian French | 43 | | Claire-BE-Belgian-French | Claire-BE22k | Female | Belgian French | 44 | | Julie-BE-Belgian-French | Julie-BE22k | Female | Belgian French | 45 | | Justine-Belgian-French | Justine22k | Female | Belgian French | 46 | | Manon-BE-Belgian-French | Manon-BE22k | Female | Belgian French | 47 | | Margaux-BE-Belgian-French | Margaux-BE22k | Female | Belgian French | 48 | | Marcia-Brazilian | Marcia22k | Female | Brazilian | 49 | | Graham-British | Graham22k | Male | British | 50 | | Lucy-British | Lucy22k | Female | British | 51 | | Peter-British | Peter22k | Male | British | 52 | | QueenElizabeth-British | QueenElizabeth22k | Female | British | 53 | | Rachel-British | Rachel22k | Female | British | 54 | | Louise-Canadian-French | Louise22k | Female | Canadian French | 55 | | Laia-Catalan | Laia22k | Female | Catalan | 56 | | Eliska-Czech | Eliska22k | Female | Czech | 57 | | Mette-Danish | Mette22k | Female | Danish | 58 | | Rasmus-Danish | Rasmus22k | Male | Danish | 59 | | Daan-Dutch | Daan22k | Male | Dutch | 60 | | Femke-Dutch | Femke22k | Female | Dutch | 61 | | Jasmijn-Dutch | Jasmijn22k | Female | Dutch | 62 | | Max-Dutch | Max22k | Male | Dutch | 63 | | Samuel-Finland-Swedish | Samuel22k | Male | Finland Swedish | 64 | | Sanna-Finnish | Sanna22k | Female | Finnish | 65 | | Alice-French | Alice22k | Female | French | 66 | | Anais-French | Anais22k | Female | French | 67 | | Antoine-French | Antoine22k | Male | French | 68 | | Bruno-French | Bruno22k | Male | French | 69 | | Claire-French | Claire22k | Female | French | 70 | | Julie-French | Julie22k | Female | French | 71 | | Manon-French | Manon22k | Female | French | 72 | | Margaux-French | Margaux22k | Female | French | 73 | | Andreas-German | Andreas22k | Male | German | 74 | | Claudia-German | Claudia22k | Female | German | 75 | | Julia-German | Julia22k | Female | German | 76 | | Klaus-German | Klaus22k | Male | German | 77 | | Sarah-German | Sarah22k | Female | German | 78 | | Kal-Gothenburg-Swedish | Kal22k | Male | Gothenburg Swedish | 79 | | Dimitris-Greek | Dimitris22k | Male | Greek | 80 | | he-IL-Asaf-Hebrew | he-IL-Asaf | Male | Hebrew | 81 | | Deepa-Indian-English | Deepa22k | Female | Indian English | 82 | | Chiara-Italian | Chiara22k | Female | Italian | 83 | | Fabiana-Italian | Fabiana22k | Female | Italian | 84 | | Vittorio-Italian | Vittorio22k | Male | Italian | 85 | | Sakura-Japanese | Sakura22k | Female | Japanese | 86 | | Minji-Korean | Minji22k | Female | Korean | 87 | | Lulu-Mandarin-Chinese | Lulu22k | Female | Mandarin Chinese | 88 | | Bente-Norwegian | Bente22k | Female | Norwegian | 89 | | Kari-Norwegian | Kari22k | Female | Norwegian | 90 | | Olav-Norwegian | Olav22k | Male | Norwegian | 91 | | Ania-Polish | Ania22k | Female | Polish | 92 | | Monika-Polish | Monika22k | Female | Polish | 93 | | Celia-Portuguese | Celia22k | Female | Portuguese | 94 | | ro-RO-Andrei-Romanian | ro-RO-Andrei | Male | Romanian | 95 | | Alyona-Russian | Alyona22k | Female | Russian | 96 | | Mia-Scanian | Mia22k | Female | Scanian | 97 | | Antonio-Spanish | Antonio22k | Male | Spanish | 98 | | Ines-Spanish | Ines22k | Female | Spanish | 99 | | Maria-Spanish | Maria22k | Female | Spanish | 100 | | Elin-Swedish | Elin22k | Female | Swedish | 101 | | Emil-Swedish | Emil22k | Male | Swedish | 102 | | Emma-Swedish | Emma22k | Female | Swedish | 103 | | Erik-Swedish | Erik22k | Male | Swedish | 104 | | Ipek-Turkish | Ipek22k | Female | Turkish | 105 | | Heather-US-English | Heather22k | Female | US English | 106 | | Karen-US-English | Karen22k | Female | US English | 107 | | Kenny-US-English | Kenny22k | Male | US English | 108 | | Laura-US-English | Laura22k | Female | US English | 109 | | Micah-US-English | Micah22k | Male | US English | 110 | | Nelly-US-English | Nelly22k | Female | US English | 111 | | Rod-US-English | Rod22k | Male | US English | 112 | | Ryan-US-English | Ryan22k | Male | US English | 113 | | Saul-US-English | Saul22k | Male | US English | 114 | | Sharon-US-English | Sharon22k | Female | US English | 115 | | Tracy-US-English | Tracy22k | Female | US English | 116 | | Will-US-English | Will22k | Male | US English | 117 | | Rodrigo-US-Spanish | Rodrigo22k | Male | US Spanish | 118 | | Rosa-US-Spanish | Rosa22k | Female | US Spanish | 119 | 120 | #### Pitch 121 | 122 | The speak speed. Supported speed are `10-100`, 100 is normal speak. 123 | 124 | default: "`100`" 125 | 126 | #### Bitrate 127 | 128 | The `bitrate` for sound quailty. Supported bitrate are `22k, 96k, 128k, 192k, 320k` 129 | 130 | default: "`128k`" 131 | 132 | ## Examples of how to use 133 | 134 | There are several ways how to use TTS service. 135 | 136 | * Through call a service in HomeAssistant Developer Tools, in this example i used with Google Home Mini Speaker: 137 | 138 | ![GitHub Logo](/images/service_small.png) 139 | 140 | * Through Automation in HomeAssistant , in this example i send to my Google HomeMini a meesage : 141 | 142 | ``` 143 | - id: Test Message 144 | alias: Test Message 145 | initial_state: 'on' 146 | trigger: 147 | - platform: state 148 | entity_id: input_boolean.test 149 | from: 'off' 150 | to: 'on' 151 | condition: 152 | action: 153 | - data: 154 | message: "This is a Test For GitHub Readme" 155 | service: tts.reversotts_say 156 | entity_id: media_player.google_home_mini_salon 157 | ``` 158 | 159 | **Good Luck !** 160 | --------------------------------------------------------------------------------