Serve Swedish Piper voices from frontend origin
Build and publish frontend / publish (push) Successful in 1m34s

This commit is contained in:
Ein Anderssono
2026-10-16 07:07:48 +02:00
parent bdc63a588e
commit 94078686b4
11 changed files with 152 additions and 5 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ The game is text- and dialogue-based and uses no images. Place descriptions incl
Player-facing speech uses Piper TTS in WebAssembly in the browser after audio is activated by a user gesture. It reads game dialogue, onboarding, account responses, character and world creation, gameplay replies, in-game errors, and microphone disclosures; the `/admin` route is excluded. The audio is decoded and played through the Web Audio API, independently of `speechSynthesis`. The first unauthenticated visit keeps the introduction visible and it can be started with `Läs introduktionen`. New game replies are read automatically and the transcript remains available to screen readers and as text. Returning players hear the latest saved game reply when they reopen the game. The player can change speaking rate; narrator pitch is neutral and character pitch is varied consistently by voice identity. These preferences are stored in browser `localStorage`. If WebAssembly, model loading, or audio playback fails, the same content remains available as text and the dialogue offers a retry.
The Piper engine and WebAssembly runtime are served by the frontend from a versioned same-origin path. The Swedish voice model (about 63 MB) downloads on first use from Hugging Face and is cached in browser storage when supported. Only the model files are fetched from that service; dialogue text is synthesized on the device and is not sent to a TTS provider. The frontend CI builds and packages the runtime; there is no Piper server or Kubernetes TTS service.
The Piper engine, WebAssembly runtime, and all three Swedish medium voice models (Alma, Lisa, and NST) are served from this frontend's same-origin `/tts/piper-wasm-v1/` path. The Gitea pipeline downloads the pinned model files, verifies their sizes and cryptographic hashes, and packages them into the versioned frontend image. The browser's Piper adapter redirects the library's built-in model URLs to this same-origin server; it does not request voice files from Hugging Face. A voice model is fetched on first use and cached in browser storage when supported. The game currently uses the NST model. Dialogue text is synthesized on the device and is not sent to a TTS provider. Voice model attribution and license references are available in the voice settings and at `/tts/piper-wasm-v1/voices/ATTRIBUTION.txt`.
The microphone button beside the text field uses Web Speech API when available and sends only its final Swedish transcript through the same submission path as typed text. Before its first use, the client explains that the browser may process audio through a provider-selected service; the game itself does not receive or store recordings, while the final transcript is saved as ordinary dialogue. Writing `röstinställningar` or saying `röstkommando alternativ` opens temporary voice controls in the dialogue. The player can adjust speaking rate and enable or disable short audio cues. Voice preferences are stored in browser `localStorage`.