Some checks failed
Release / semantic-release (push) Successful in 30s
tests / Unit tests (Linux, Python 3.11) (push) Failing after 5m17s
Release / build-linux (push) Failing after 7m3s
Release / build-windows (push) Has been cancelled
Release / build-macos (arm64, macos-latest) (push) Has been cancelled
Release / build-macos (x64, macos-15-intel) (push) Has been cancelled
Release / release-main (push) Has been cancelled
Release / release-develop (push) Has been cancelled
docker/jarvis-config.template.json hardcoded "tts_engine": "piper". entrypoint
renders it into /app/config/jarvis.json, and bridge _tts_engine_setting() reads
that JSON BEFORE the env — so TTS_ENGINE=melo in .env was ignored and the bot
synthesised Korean with the English Piper voice (the "foreign accent" the user
heard); the warm melo-worker sat unused.
Template now carries ${TTS_ENGINE}; compose sets TTS_ENGINE=${TTS_ENGINE:-melo}
so envsubst renders the real engine. Verified: envsubst with TTS_ENGINE=melo
yields "tts_engine": "melo", and `docker compose config` passes TTS_ENGINE=melo.
Added a regression test that the template stays env-driven and renders the
configured engine.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""The container's TTS engine must be env-driven, not hardcoded.
|
|
|
|
Regression for a bug where docker/jarvis-config.template.json hardcoded
|
|
`"tts_engine": "piper"`. The bridge reads the rendered /app/config/jarvis.json
|
|
*before* the environment, so a hardcoded "piper" overrode `TTS_ENGINE=melo` in
|
|
.env and the bot read Korean text with the English Piper voice ("foreign
|
|
accent"). The template must carry `${TTS_ENGINE}` so envsubst (entrypoint.sh)
|
|
renders whatever engine the deployment configured.
|
|
"""
|
|
|
|
import json
|
|
import string
|
|
from pathlib import Path
|
|
|
|
TEMPLATE = Path(__file__).resolve().parent.parent / "docker" / "jarvis-config.template.json"
|
|
|
|
|
|
def _render(**env) -> dict:
|
|
"""Mimic entrypoint.sh `envsubst < template`: substitute env vars, leaving
|
|
any unset ones as literal text (valid JSON string values)."""
|
|
raw = TEMPLATE.read_text(encoding="utf-8")
|
|
return json.loads(string.Template(raw).safe_substitute(**env))
|
|
|
|
|
|
def test_template_does_not_hardcode_an_engine():
|
|
raw = TEMPLATE.read_text(encoding="utf-8")
|
|
assert '"tts_engine": "${TTS_ENGINE}"' in raw
|
|
assert '"tts_engine": "piper"' not in raw
|
|
assert '"tts_engine": "melo"' not in raw
|
|
|
|
|
|
def test_rendered_engine_follows_env():
|
|
assert _render(TTS_ENGINE="melo")["tts_engine"] == "melo"
|
|
assert _render(TTS_ENGINE="piper")["tts_engine"] == "piper"
|
|
assert _render(TTS_ENGINE="xtts")["tts_engine"] == "xtts"
|