- Sett opp docker-compose.dev.yml med PostgreSQL, Redis, Caddy og Whisper - Benchmarket faster-whisper (small/medium/large-v3) med norsk tale - Besluttet medium + initial_prompt som standard, SRT som master-format - Ny feature-spec: AI Gateway (LiteLLM) med BYOK og Promptfoo-testing - Definert dataklassifisering (kritisk/gjenskapbar/avledet/flyktig) - Konkretisert backup-strategi med pg_dump, rsync og restore-prosedyre - Splittet repos: sidelinja/server (kode) + sidelinja/sidelinja (innhold) - Oppdatert lokal.md: utviklingsmiljø for kode, ikke prod-replika - Dokumentert transkripsjonspipeline: Whisper SRT → Git → PG (avledet) - Live AI-assistent: small-modell, flyktig logg med 30d TTL Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
38 lines
No EOL
2.9 KiB
Markdown
38 lines
No EOL
2.9 KiB
Markdown
# Feature Spec: Live AI-Assistent i Studio
|
|
**Filsti:** `docs/features/live_ai_assistent.md`
|
|
|
|
## 1. Konsept
|
|
En "virtuell co-host" som lytter på innspillingen i sanntid. Når programlederne nevner spesifikke personer eller organisasjoner, slår systemet opp i Kunnskapsgrafen og dytter relevante "Faktoider" til skjermen deres umiddelbart.
|
|
|
|
## 2. Arkitektur & Dataflyt
|
|
Denne funksjonen krever lav forsinkelse og asynkron prosessering.
|
|
|
|
1. **Lydkilde (SvelteKit + LiveKit):** SvelteKit-appen bruker `livekit-client`. I tillegg til å sende høykvalitetslyd til de andre deltakerne, rutes en komprimert lydstrøm (via WebSockets eller LiveKit sine egne server-side hooks) til en lokal Rust-tjeneste.
|
|
2. **Transkripsjon (Rust + Whisper):** Rust-tjenesten mater lyden inn i faster-whisper-server (`Systran/faster-whisper-small`) i chunks på ~5 sekunder. `small` er valgt for latency — den prosesserer ~5x raskere enn sanntid, noe som gir <1s forsinkelse per chunk. Ingen `initial_prompt` — hastighet prioriteres over navnenøyaktighet.
|
|
3. **Entity Extraction & Oppslag (Rust + PostgreSQL):** Rust-tjenesten analyserer tekststrømmen for egennavn (Named Entity Recognition). Den gjør et lynraskt asynkront oppslag i PostgreSQL: `SELECT * FROM factoids JOIN actors... WHERE actor.name = $1`.
|
|
4. **Sanntids-Push (SpacetimeDB):** Hvis et treff finnes, dytter Rust-tjenesten faktoiden inn i SpacetimeDB som et event: `LiveFactoidEvent`.
|
|
5. **Visning (SvelteKit):** Studio-grensesnittet lytter på SpacetimeDB. Når `LiveFactoidEvent` inntreffer, popper faktoiden lydløst opp i en egen boks på skjermen.
|
|
|
|
### 2.1 Lagringsstrategi
|
|
Live-transkripsjonen er **flyktig arbeidsdata** — ikke en del av det permanente datasettet. Den lagres i PostgreSQL som en feilsøkingslogg med TTL (standard 30 dager, konfigurerbart):
|
|
|
|
```sql
|
|
live_transcription_log (
|
|
id SERIAL,
|
|
session_id UUID, -- knytter chunks til en innspillingssesjon
|
|
chunk_timestamp TIMESTAMPTZ,
|
|
chunk_text TEXT,
|
|
matched_entities TEXT[], -- hvilke entiteter NER fant
|
|
pushed_factoids UUID[], -- hvilke faktoider ble pushet til frontend
|
|
created_at TIMESTAMPTZ DEFAULT now()
|
|
)
|
|
```
|
|
|
|
En nattlig jobbkø-jobb sletter rader eldre enn TTL. Dette gir mulighet til å feilsøke kjeden chunk → entity match → factoid push ("hvorfor dukket den faktoiden opp?") uten å akkumulere data over tid.
|
|
|
|
Den endelige, kvalitetssikrede transkripsjonen av hele episoden lages etterpå via `medium` + `initial_prompt` gjennom Podcastfabrikkens pipeline (se `podcastfabrikken.md`).
|
|
|
|
## 3. Utviklingsfaser (For Claude Code)
|
|
* **Fase 1:** Ikke bygg live-lyd enda. Bygg funksjonaliteten der grensesnittet lytter på SpacetimeDB, og lag et dummy-script i Rust som dytter test-faktoider inn i SpacetimeDB for å verifisere UI-et.
|
|
* **Fase 2:** Koble Whisper til et offline lydopptak og kjør NER/oppslag mot PostgreSQL.
|
|
* **Fase 3:** Koble sammen LiveKit-strømmen og Whisper. |