[SOLUTION] Local TTS on Android Auto via VLC and Piper TTS

Local TTS on Android Auto via VLC and Piper TTS

Hi everyone,

After several iterations, I've put together a working solution to play
text-to-speech notifications through car speakers via Android Auto,
using only local components - no cloud, no Google Assistant.

Key features

  • :white_check_mark: Fully local TTS with Piper (no cloud dependency)
  • :white_check_mark: Works with any vehicle supporting Android Auto
  • :white_check_mark: Privacy-friendly - no data sent to external services
  • :white_check_mark: Reliable audio routing to car speakers (not phone speaker)
  • :white_check_mark: Tested on Mercedes-Benz with wireless Android Auto

How it works

The solution uses VLC as a bridge: Home Assistant generates TTS audio
via Piper, then sends a VLC intent to the phone with the audio file URL.
Android Auto recognizes VLC as a media source and routes audio to car speakers.

Complete guide on GitHub

I've documented the full solution with step-by-step installation,
validation tests at each stage, and a troubleshooting guide
:

:backhand_index_pointing_right: GitHub - Kolia56/ha-car-spoken-alerts: Local spoken alerts in your car via Android Auto - Home Assistant integration with Piper TTS and VLC. Privacy-friendly, no cloud dependency. · GitHub

The repository includes:

  • Detailed installation instructions
  • Ready-to-use example files (scripts, automations)
  • Validation tests for each component
  • Known limitations and how to handle them
  • Vehicle compatibility notes

Known limitations

The previous audio source (radio, Spotify, etc.) does not auto-resume
after TTS finishes. Android Auto replaces the audio source rather than
pausing it. A manual tap on the radio/music app is needed to resume.

This is acceptable for critical notifications (fuel alerts, security, etc.)
but may not suit frequent non-critical messages.

Looking for feedback

If you test this solution on a different vehicle, I'd love to hear:

  • Car make/model/year
  • Connection type (wired/wireless)
  • Audio source behavior (auto-resume or not)
  • Any quirks or issues

This will help build community compatibility data.

Feedback and improvements welcome!

Major update: solved the “no auto-resume” limitation :tada:

Since my original post, I found a significantly better approach than
VLC + Piper for the audio behavior side of things.

The problem with the original solution: VLC takes permanent audio
focus, so it fully replaces the radio/music source. You had to manually
tap back to your radio after every TTS alert — annoying for frequent
notifications.

The fix: use Automate (free Android
automation app) to trigger the phone’s native TTS engine directly, with
Audio focus: Transient may duck instead of VLC’s permanent focus.
Android Auto now treats the message as a temporary interruption — same
behavior as a navigation voice prompt: the radio ducks, the message
plays, and the radio volume automatically returns to normal afterward.
No more manual intervention needed.

Bonus: this also turned out to be a simpler architecture overall — no
more Piper add-on, Wyoming Protocol, or VLC intents. Just Automate + the
phone’s built-in TTS engine.

I also fixed a secondary issue along the way: the first word of each
message being cut off (turned out to be a Bluetooth/Android Auto
connection delay — the exact same behavior was present on a professional
speed-camera app on the same setup, so it’s an environment quirk, not a
bug in this implementation). A short SSML <break time="700ms"/> prefix
resolves it.

The repo has been fully updated to reflect this new approach, with the
original VLC + Piper version preserved in a
v1-vlc-piper
release for anyone who prefers the (slightly better sounding, but less
functional) original voice engine:

:backhand_index_pointing_right: GitHub - Kolia56/ha-car-spoken-alerts: Local spoken alerts in your car via Android Auto - Home Assistant integration with Piper TTS and VLC. Privacy-friendly, no cloud dependency. · GitHub

Also added a second example use case beyond fuel alerts: automatic
alarm arming/disarming announcements based on location (distance +
direction of travel, not just a simple zone trigger).

As always, feedback and vehicle compatibility reports welcome — there’s
a compatibility table
in the repo for that.