45 lines
2.1 KiB
Markdown
45 lines
2.1 KiB
Markdown
# 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 (`<lang>-<navn>-<kvalitet>`); 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.
|