WORKING SOLUTION: HomePod Gen 1 TTS via pyatv — fix for the 10-second timeout (HA Green, Piper, June 2026)

After weeks of chasing 504s, miniaudio.DecodeError, and silent failures, I have a fully working setup. Posting this because this issue was closed without a fix and people are still hitting it.

Hardware: Home Assistant Green · HAOS 18.0 · Core 2026.6.4 · HomePod Gen 1


Root cause (two problems, not one)

  1. The stereo pair is the killer. If your HomePod is in a stereo pair, HA's pyatv integration will 504 on virtually every TTS call. The pair presents differently to pyatv than an individual device.
  2. Piper is too slow for pyatv's hardcoded timeout. pyatv has a 10-second download timeout in audio_source.py. On HA Green hardware, Piper takes longer than 10 seconds to synthesise anything beyond a short phrase. Result: miniaudio.DecodeError: ('failed to init decoder', -1). This is the [error] Audio streaming failed you've been seeing.

Two paths to a fix

Path 1 — If you have an Apple TV (try this first)

If you have a stereo pair, you almost certainly also have an Apple TV in the same room — they go together. Target the Apple TV entity for tts.speak instead of the HomePod directly. The Apple TV routes audio to your HomePod pair via its own native AirPlay connection, bypassing the pyatv-to-HomePod timeout entirely.

Use media_player.your_apple_tv as your entity. Keep the short-phrase rule (see below) regardless.

Path 2 — No Apple TV, or Path 1 doesn't work

Break the stereo pair. In the Apple Home app: long-press one HomePod → Settings → scroll to the bottom → Ungroup Accessory. Then in HA: delete both HomePod entries from Settings → Devices & Services → Apple TV integration, go to Settings → Devices & Services → Discovered, and re-add the individual HomePod.

Yes, you lose the stereo pair for music. Personally, I am running a 06:00 morning announcement, and for me, that's an acceptable trade. The individual HomePod still sounds excellent for speech.


The short-phrase rule — non-negotiable regardless of path

Each tts.speak call must be roughly 12 words or fewer. Use multiple calls with delay actions between them (4–5 seconds works well). A single long message will always hit the pyatv timeout.

Working example — full 10-phrase weather broadcast:

yaml

- action: tts.speak
  target:
    entity_id: media_player.living_room_living_room_left_homepod
  data:
    cache: true
    media_player_entity_id: media_player.living_room_living_room_left_homepod
    message: "Good morning."
- delay:
    seconds: 4
- action: tts.speak
  target:
    entity_id: media_player.living_room_living_room_left_homepod
  data:
    cache: true
    media_player_entity_id: media_player.living_room_living_room_left_homepod
    message: "Maximum temperature {{ states('sensor.your_bom_sensor_temp_max') }} degrees."
- delay:
    seconds: 4
- action: tts.speak
  target:
    entity_id: media_player.living_room_living_room_left_homepod
  data:
    cache: true
    media_player_entity_id: media_player.living_room_living_room_left_homepod
    message: "Have a nice day."

I'm running a full 10-phrase BOM weather broadcast every morning — conditions, temperature, overnight low, rain chance and amount, UV index, fire danger, and weather warnings — all playing cleanly through a HomePod Gen 1. About 50 seconds end-to-end, zero failures.

What does NOT work:

  • Targeting the stereo pair entity directly
  • Any single tts.speak message longer than ~12 words on slower hardware
  • Music Assistant or AirPlay as the intermediary (adds its own buffering layer on top of pyatv's timeout)

I really hope this helps someone who has been hitting a wall. Peace.

The issue was closed because a fix has been merged into next month's release.

You can test it now if you join the beta testing program. It's pretty stable with only a few cosmetic dashboard issues.