Hermes and the bridge on the phone itself
Experimental, not tested on hardware. Nothing on this page has been tried on a real phone. The Hermes Termux page currently says the Termux package does not work and a fix is in progress. Use the normal setup unless you want to experiment.
The idea: Hermes Agent and the Car Voice bridge both run in Termux on the same Android phone as the app, and the app connects to http://127.0.0.1:8787. Plain http is allowed only for 127.0.0.1 and localhost; that traffic never leaves the phone.
What the app does for you
- It accepts
http://127.0.0.1:<port>andhttp://localhost:<port>as bridge address; every other address must be https. - When you open the connect step or Settings, it asks
http://127.0.0.1:8787/readyzonce (1 second, no token). If a Car Voice bridge answers, it offers: "A Car Voice bridge is running on this phone. Use it?" That fills the address; the token is still needed.
Steps
Hermes. Install it with the Termux instructions in the Hermes documentation, switch on the API server as in setup step 1 and run the gateway the way that page describes for Termux.
The bridge. In another Termux session, with Termux' own Python (3.11 or newer):
pkg install python curl mkdir -p ~/car-voice && cd ~/car-voice curl -fsSLO https://carvoice.app/download/SHA256SUMS curl -fsSLO https://carvoice.app/download/car-voice-bridge-0.7.0.tar.gz sha256sum -c SHA256SUMS tar -xzf car-voice-bridge-0.7.0.tar.gz mv car-voice-bridge-0.7.0/backend ~/car-voice/backend cd ~/car-voice/backend python -m venv .venv .venv/bin/pip install edge-tts==7.3.1 segno==1.6.6This installs only what an OpenAI-compatible speech service needs. Local Whisper (
faster-whisper, which needs native CTranslate2 and numpy builds) is not expected to install on Android and was not tried. The bridge only loads it withHERMES_BRIDGE_STT_PROVIDER=local. Whetheredge-ttsand its dependencies install in Termux was not tried either.Configuration, e.g. in
~/car-voice/bridge.env:HERMES_BRIDGE_HOST=127.0.0.1 HERMES_BRIDGE_PORT=8787 HERMES_BRIDGE_DATA_DIR=/data/data/com.termux/files/home/car-voice/data HERMES_BRIDGE_TOKENS_FILE=/data/data/com.termux/files/home/car-voice/data/tokens.json HERMES_API_BASE_URL=http://127.0.0.1:8642 HERMES_API_ALLOW_INTERNAL_HTTP=true HERMES_API_KEY=<the API_SERVER_KEY of Hermes> HERMES_BRIDGE_STT_PROVIDER=openai HERMES_BRIDGE_STT_API_BASE=https://api.groq.com/openai/v1 HERMES_BRIDGE_STT_API_KEY=<key> HERMES_BRIDGE_IROH=offThe app reaches this bridge on
127.0.0.1, so the phone link is not needed (and theirohpackage has no build for Termux). Create the data directory (mkdir -p ~/car-voice/data). This file has no JSON values, soset -a; . ~/car-voice/bridge.env; set +aloads it into the shell.Start the bridge:
.venv/bin/python -m hermes_voice_bridge serve.Pair:
.venv/bin/python -m hermes_voice_bridge pair --origin http://127.0.0.1:8787 --code-only. You cannot scan a QR code on the screen of the phone that shows it, so use the pairing code: in Car Voice, tap Enter pairing code, enterhttp://127.0.0.1:8787and the code, and tap Connect. Without--code-only,pairalso prints the token, which you can paste after "Use this bridge" instead.
Things to know
- Android can stop Termux in the background; the Hermes Termux page mentions battery-optimisation exemptions and
termux-wake-lock, which help but do not guarantee anything. - The bridge still uses the internet: the speech service and Microsoft's Edge text-to-speech.
- Any app on the phone can open connections to
127.0.0.1:8787. They still need the token, but if the bridge is not running another app could listen on that port and receive the token when Car Voice connects. Only use this while you run the bridge yourself.