announcer/AGENTS.md
Kent ff43624969 Flere stemmer: nvcc (10 norske talere), flere engelske, svensk og dansk
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 03:37:46 +02:00

52 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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_LIST` i `announcer.py` er eneste sted en stemme legges til: egen
kort `id`, visningsnavn, gruppe (optgroup i menyen), Piper-modell
(`<lang>-<navn>-<kvalitet>`) og evt. `speaker` for flerstemmemodeller.
Modellene lastes ned fra rhasspy/piper-voices ved første oppstart til
`voices/` (gitignored, 63–120 MB per modell). Fullstendig liste:
`https://huggingface.co/rhasspy/piper-voices/resolve/main/voices.json`.
Norsk finnes bare i to modeller: `talesyntese-medium` (én nøytral stemme) og
`nvcc-medium` (ti talere i én modell, kodene KNN/MSV osv. er fra datasettet,
K = kvinne, M = mann). Ingen av dem er «morsomme» stemmer; vil noen ha
Vader/robot må det legges effekter på etterpå (ffmpeg-filter i `synthesize`).
## 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.