Local TTS (speech)

uv run poe up serves the API (including POST /v1/audio/speech) on :14322. poe up-prod / docker compose up serve speech at POST /api/v1/audio/speech through nginx.

Korean note: upstream Piper has no official Korean neural voice that works with stock piper-tts. The backend defaults to edge-tts (tts.engine: edge) with ko-KR-SunHiNeural. Override voice / engine in backend YAML (~/.config/soju/backend.yaml or docker/soju/backend.yaml). Native Piper is available when you set tts.engine: piper and a valid tts.piper.model_path.

In the UI, choose Controls → Speech: local (Soju backend) or browser (Web Speech). If local TTS is down, the app falls back to the browser.

Default browser env: PUBLIC_TTS_ENGINE=local and PUBLIC_AI_BASE_URL=http://localhost:14322 (dev) or /api (prod).