# sg-announcer – utrop på høyttaleranlegget (Sauda Gathering) Liten Flask-app: tekst inn i nettleseren → forhåndslytt → «Send ut på anlegget» spiller lyden lokalt på **denne** maskinen med `pw-play`. TTS er Piper (`piper-tts`, onnx, helt lokalt). Alt ligger i to filer: `announcer.py` (server + kø) og `index.html` (sida). Dokumentasjon for Kent: Athena-notatet `30 Ressurser/Teknologi/Sauda Gathering - announcer.md`. Oppdater det, ikke denne fila, når noe som er verdt å huske endres. ## Kjøring Tjenesten er en systemd-brukerenhet: `~/.config/systemd/user/sg-announcer.service` (enabled, port 8090). `systemctl --user restart sg-announcer` etter endringer i koden. Manuelt: `uv run announcer.py --port 8090`. Miljøvariabler (settes i enheten): `ANNOUNCER_PORT`, `ANNOUNCER_PIN` (tom = ingen PIN), `ANNOUNCER_SINK` (pw-play `--target`; tom = standard utgang). ## Hvordan det henger sammen - `/api/preview` syntetiserer og returnerer WAV til nettleseren. Ingen lyd på PC-en. - `/api/announce` legger meldingen i én FIFO-kø; en bakgrunnstråd spiller én om gangen med `pw-play`. `/api/stop` dreper gjeldende avspilling, `/api/clear` tømmer køen. - Knappen «Send ut» er låst til nøyaktig den teksten/stemmen/hastigheten som sist ble forhåndslyttet. Det er med vilje: ingen skal sende noe de ikke har hørt. - Ferdige WAV-er bufres i `cache/` etter innholdshash. Trygt å slette. - Chimen («ding-dong») genereres i Python, ingen lydfil. ## Stemmer `VOICES` i `announcer.py` er eneste sted en stemme legges til. Navnet er Piper-ID-en (`--`); fila lastes ned fra rhasspy/piper-voices ved første oppstart til `voices/` (gitignored, ~63 MB per stemme). Norsk: `no_NO-talesyntese-medium` er den eneste norske Piper-stemmen. ## Feller - **ufw**: appen kjører nativt, så Docker-smutthullet gjelder ikke. Porten må åpnes eksplisitt for LAN-et (`sudo ufw allow from 10.20.70.0/23 to any port 8090 proto tcp`). - `pkill -f announcer.py` fra et skall som selv har `announcer.py` i kommandolinja dreper skallet. Bruk `systemctl --user`. - Piper 1.8 bruker `SynthesisConfig(length_scale=…)`; lavere = raskere.