WIP: fix(hermes-voice): switch Atlas Piper TTS to hfc_female, bake amy as alternate #24
Closed
hermes-automation
wants to merge 1 commits from
hermes/tts-voice-hfc-female into main
pull from: hermes/tts-voice-hfc-female
merge into: titan:main
titan:main
titan:feature/hermes-agent-build-mirrors
titan:feature/hermes-agent-multiarch
titan:feature/hermes-next-hux
titan:feature/hermes-hux-contracts
titan:feature/t_39cf1905-webui-build-token
titan:feature/t_26da4c88-titan-capacity-guardrails-v4
titan:feature/t_26da4c88-titan-capacity-guardrails-v3
titan:feature/t_26da4c88-titan-capacity-guardrails-v2
titan:feature/t_26da4c88-titan-capacity-guardrails
titan:fix/t_39cf1905-jenkins-controller-priority
titan:feature/t_8cbe6a55-hermes-webui-release-v2
titan:feature/t_8cbe6a55-hermes-webui-release
titan:feature/hermes-domain-rename-agent-worker-v2
titan:hermes/t_65356568-multiuser-capacity-assessment
titan:fix/cli-auto-failover-effort
titan:feature/hermes-pr44-after-pr43
titan:fix/hermes-heartbeat-dead-reclaim-replacement
titan:handoff/t_1a2c627b
titan:feature/hermes-combined-multilingual-voice-v2
titan:fix/hermes-handsfree-stt-webm
titan:fix/hermes-restore-legacy-chat-triage-hosts-v2
titan:feature/hermes-domain-rename-agent-worker-bstein
titan:fix/hermes-restore-legacy-chat-triage-hosts-v3
titan:hermes/tts-voice-multilingual-prerequisite
titan:fix/hermes-restore-legacy-chat-triage-hosts
titan:fix/hermes-oidc-ensure-rerun-hostname-rollout
titan:feature/hermes-direct-cli-lane-concurrency-2-replacement
titan:feature/hermes-domain-rename-chat-bstein-triage
titan:feature/hermes-kanban-profile-concurrency-2
titan:feature/hermes-zombie-lane-heartbeat-reclaim
titan:hermes/repair-pr26-voice-split
titan:feature/hermes-durable-two-worker-cli-concurrency
titan:hermes/chat-voice-conversation-instrument
titan:feature/hermes-domain-rename-chat-triage
titan:hermes/voice-stt-tts-language-routing
titan:hermes/voice-stt-language-routing
titan:hermes/tts-voice-multilingual
titan:fix/hermes-chat-session-continuity-contract
titan:hermes/fix-grafana-no-data-vm-storage
titan:feature/ci-gitops
titan:fix/jenkins-quality-gate-discovery
titan:feature/hermes-inpod-supervisor
titan:feature/hermes-chat-smoothness
titan:wt/t_1e95ea6d
titan:feature/hermes-full-handoff-acceptance
titan:feature/hermes-distributed-worker-pool
titan:feature/hermes-review-goal-semantics
titan:feature/hermes-cli-auto-quota-routing
titan:fix/hermes-result-decomposition-reliability
titan:feature/hermes-safe-gitea-pr-client
titan:feature/hermes-unprivileged-image-builder
titan:feature/hermes-cli-process-reaping
titan:feature/hermes-three-lane-placement
titan:wt/t_cca008de
titan:codex/cassandra-generator-08105
titan:cassandra-0851-rollout
titan:cassandra-0821-deploy
titan:codex/testing-dashboard-health-20260604
titan:feature/ariadne
titan:feature/pi-usb-scratch-rollout
titan:feature/sso-hardening
titan:codex/titan-iac-work-quality-gate
titan:codex/titan-iac-main-platform-metrics
titan:codex/titan-iac-platform-metrics
titan:feature/atlas-jobs-schedule-observability
titan:lane2/jenkins-cleanup-activate
titan:lane2/jenkins-cleanup-wiring-split
titan:codex-ananke-fixes
titan:feature/atlasbot-ananke-recovery
titan:feature/atlasbot
titan:deploy
titan:feature/vault-consumption
titan:feature/postgres-migration
titan:feature/bstein-dev-home
titan:feature/mailu
titan:feature/sso
titan:feature/atlas-monitoring
titan:restructure/hybrid-clusters
titan:fea/titan24-gpu
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "hermes/tts-voice-hfc-female"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Brad's 2026-08-20 decision: switch the private Atlas Piper TTS voice for the
Hermes chat WebUI from Lessac to a warmer, pleasant feminine voice.
en_US-hfc_female-mediumen_US-amy-medium(selectable laterwithout another Jenkins build)
high/medium/low) are kept, not deleted — thiswasn't required for image size. Image growth: +120.6 MiB
(2 new medium voices x (onnx + onnx.json), checksummed against the same
pinned
rhasspy/piper-voices@ea046e8458f6acd997706d6e6066a022b42f6fb1revision already used for Lessac). All four new sha256 checksums were
verified locally against the freshly downloaded upstream files before
being pinned in the Dockerfile.
Verified behaviour — read before merging
The Piper server (
dockerfiles/hermes-jetson-tts-server.py:59-72) readsonly
input/textandspeedfrom the POST body. The"voice"fieldthe WebUI sends is ignored by the server. The audible voice is
determined solely by the
HERMES_TTS_VOICEenv var at process start.The WebUI's hardcoded voice string is updated here for honesty (it no longer
claims Lessac), but
HERMES_TTS_VOICEremains the effective control —changing the WebUI string alone does nothing to the audio.
Sites changed
dockerfiles/Dockerfile.hermes-jetson-tts— added checksum-pinneden_US-hfc_female-mediumanden_US-amy-medium(onnx + onnx.json) fromthe existing pinned revision; updated
ENV HERMES_TTS_VOICEdefault;extended the build-time
PiperVoice.loadassertion to cover all 5 models(3 Lessac + hfc_female + amy).
dockerfiles/hermes-jetson-tts-server.py:20—VOICE_NAMEdefaultaligned from
en_US-lessac-high(which disagreed with the Dockerfile'sprior default of
en_US-lessac-medium) toen_US-hfc_female-medium.services/hermes/voice-deployment.yaml—HERMES_TTS_VOICEenv var andthe
ai.bstein.dev/modelannotation updated tohfc_female.dockerfiles/hermes-webui-atlas-patch.py:66— hardcoded voice stringaligned (fail-closed
replace_exactpatching preserved).testing/tests/test_hermes_chat_quality.py— updated assertions for thenew default voice, checksum count, and the 4 new checksums.
Grepped the whole repo for
lessacpost-change: every remaining hit is inDockerfile.hermes-jetson-tts(the retained Lessac ADD/assert lines) — nodoc/catalog (including
services/hermes/NOTES.md) names the voice.Rollout-coupling hazard — required merge sequence
The server fails closed if
HERMES_TTS_VOICEnames a model not bakedinto the image (
hermes-jetson-tts-server.py:99-100, "baked Piper voice ismissing").
voice-deployment.yaml:126pins the TTS image by digest, sothe env var change here and the new image digest must roll out together,
or image-first — never env-first. If the env var reaches the cluster before
an image containing
en_US-hfc_female-mediumdoes, the TTS pod crash-loops.Required sequence after this PR is approved and merged:
main.hermes-jetson-ttsfrom the new Dockerfile and publishes anew image digest.
services/hermes/voice-deployment.yaml:126to thenew build (separate follow-up commit/PR, since the digest isn't known
until the build completes).
apply.
Do not let the env var change here reach the cluster ahead of a
hermes-jetson-ttsimage that actually containsen_US-hfc_female-medium.Verification
.venv/bin/python -m pytest testing/tests/test_hermes_chat_quality.py -q— 12 passed.
.venv/bin/python -m pytest testing/ -q— 2537 passed, 4 skipped(environment-gated: no read-only cluster access, no
visudo), 4 failed —all 4 failures reproduce identically on
origin/mainwith none of thisbranch's changes applied (live-cluster CPU-request drift in
test_hermes_agent_layout.py, a flaky HTTP-error-path assertion intest_hermes_gitea_pr_integration.py, and a live kanban config drift intest_hermes_kanban_supervisor.py) — unrelated to this change.kustomize build services/hermes— succeeds; rendered output confirmsHERMES_TTS_VOICE=en_US-hfc_female-mediumand the updated modelannotation.
downloads from the pinned Hugging Face revision (deterministic, confirmed
by re-downloading and re-hashing).
🤖 Generated with Claude Code
Amy should be english primary voice
Pull request closed