Text-to-Speech (TTS)

Text-to-Speech (TTS) enables Home Assistant to speak to you.

Configuring a tts platform

To get started, add the following lines to your configuration.yaml (example for Google):

# Example configuration.yaml entry for Google TTS service
  - platform: google_translate

Depending on your setup, you might need to set an external URL (external_url) inside the configuration or in the parameters of this component.

The following optional parameters can be used with any platform. However, the TTS integration will only look for global settings under the configuration of the first configured platform:

Configuration Variables

cache boolean (Optional, default: true)

Allow TTS to cache voice file to local storage.

cache_dir string (Optional, default: tts)

Folder name or path to a folder for caching files.

time_memory integer (Optional, default: 300)

Time to hold the voice data inside memory for fast play on a media player. Minimum is 60 s and the maximum 57600 s (16 hours).

service_name string (Optional)

Define the service name.


The service name default set to _say. For example, for google_translate TTS, its service name default is google_translate_say.

The extended example from above would look like the following sample:

# Example configuration.yaml entry for Google Translate TTS service
  - platform: google_translate
    cache: true
    cache_dir: /tmp/tts
    time_memory: 300
    service_name: google_say

The following sections describe some of the problems encountered with media devices.

Self-signed certificates

This problem occurs when your Home Assistant instance is configured to be accessed through SSL, and you are using a self-signed certificate on your internal URL.

The tts service will send an https:// URL to the media device, which will check the certificate, and reject it. So it won’t play your file. If you could make the device accept your certificate, it would play the file. However, many media devices do not allow changing settings to accept self-signed certificates. Ultimately, your option may be to serve files to local devices as http:// rather than https://.

Google cast devices

The Google cast devices (Google Home, Chromecast, etc.) present the following problems:

  • They reject self-signed certificates.

  • They do not work with URLs that contain hostnames established by local naming means. Let’s say your Home Assistant instance is running on a machine made known locally as ha. All your machines on your local network are able to access it as ha. However, try as you may, your cast device won’t download the media files from your ha machine. That’s because your cast device ignores your local naming setup. In this example, the say service creates a URL like http://ha/path/to/media.mp3 (or https://... if you are using SSL). If you are not using SSL then setting an internal URL that contains the IP address of your server works around this issue. By using an IP address, the cast device does not have to resolve the hostname.

  • If you are using an SSL (e.g., https://yourhost.example.org/...) then you must use the hostname in the certificate (e.g., external_url: https://yourhost.example.org). You cannot use an IP address since the certificate won’t be valid for the IP address, and the cast device will refuse the connection.

Service say

The say service support language and on some platforms also options for set, i.e., voice, motion, speed, etc. The text for speech is set with message. Since release 0.92, service name can be defined in configuration service_name option.

Say to all media_player device entities:

# Replace google_translate_say with <platform>_say when you use a different platform.
service: tts.google_translate_say
  entity_id: all
  message: "May the force be with you."

Say to the media_player.floor device entity:

service: tts.google_translate_say
  entity_id: media_player.floor
  message: "May the force be with you."

Say to the media_player.floor device entity in French:

service: tts.google_translate_say
  entity_id: media_player.floor
  message: "Que la force soit avec toi."
  language: "fr"

With a template:

service: tts.google_translate_say
  message: "Temperature is {{states('sensor.temperature')}}."
  cache: false


The integration has two caches. Both caches can be controlled with the cache option in the platform configuration or the service call say. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.


POST /api/tts_get_url

Returns a URL to the generated TTS file. Platform and message are required.

    "platform": "amazon_polly",
    "message": "I am speaking now"

The return code is 200 if the file is generated. The message body will contain a JSON object with the URL.

    "path": "/api/tts_proxy/265944c108cbb00b2a621be5930513e03a0bb2cd_en_-_demo.mp3",
    "url": ""

Sample curl command:

$ curl -X POST -H "Authorization: Bearer <ACCESS TOKEN>" \
       -H "Content-Type: application/json" \
       -d '{"message": "I am speaking now", "platform": "amazon_polly"}' \