Tale-til-tekst for Windows — fungerer i alle inputfelt i alle applikasjoner. En systemstatusfelts-app (WinUI 3 / .NET 10) som strømmer mikrofonlyd over WebSocket til en transkripsjonsserver som kjører faster-whisper. Serveren kan kjøre lokalt eller på en annen maskin i lokalnettet.
Standardmodell: NbAiLab/nb-whisper-medium — optimalisert for norsk.
- Trykk F9 (hold inne for hold-to-talk, eller trykk for å veksle) — et overleggsvindu vises nederst på skjermen
- Snakk — en live lydnivåindikator viser at mikrofonen er aktiv
- Slipp / trykk igjen for å stoppe — serveren transkriberer og resultatet vises med en Kopier-knapp
Valgfritt: auto-send ved stillhet — aktiver i Lyd-innstillingene for kontinuerlig diktering. Serveren transkriberer automatisk ved hver pause, og teksten akkumuleres i overleggsvinduet mens mikrofonen forblir åpen. Trykk hurtigtasten for å avslutte.
Klienten strømmer rå 16kHz PCM-lyd over WebSocket under opptak. Når opptaket stoppes (eller ved en stillhetspause), kjører serveren en inferenspass på den bufrede lyden og returnerer transkripsjonen.
sequenceDiagram
actor Bruker
participant Klient as Klient (WinUI 3)
participant Server as Server (Python)
participant Whisper as faster-whisper
Bruker->>Klient: Trykker F9
Klient->>Klient: Starter mikrofonopptak
Klient->>Bruker: Viser overleggsvindu (Lytter...)
loop Mens opptak pågår
Klient->>Server: PCM-lyd (binære WebSocket-frames)
end
Bruker->>Klient: Trykker F9 igjen (eller stillhet detekteres)
Klient->>Server: {"type": "audio_stop"}
Klient->>Bruker: Viser overleggsvindu (Behandler...)
Server->>Whisper: Inferens på bufret lyd
Whisper-->>Server: Transkriberte segmenter
Server-->>Klient: {"type": "final", "text": "..."}
alt Skriv tekst direkte inn
Klient->>Bruker: Injiserer tekst i aktivt felt (SendInput / Ctrl+V)
else Overleggsmodus
Klient->>Bruker: Viser resultat i overleggsvindu med Kopier-knapp
end
LocalWhisper/
├── client/ # C# / WinUI 3 / .NET 10 Windows-klient
│ └── LocalWhisper/
│ ├── App.xaml(.cs) # Oppstart, systemstatusfeltet, global hurtigtast
│ ├── MainWindow.xaml(.cs) # Innstillingsvindu (NavigationView)
│ ├── Pages/ # Innstillingssider (Tilkobling, Hurtigtast, Modell, Lyd, Om)
│ ├── Services/
│ │ ├── AudioCaptureService.cs
│ │ ├── WebSocketService.cs
│ │ ├── HotkeyService.cs
│ │ ├── TranscriptionOrchestrator.cs
│ │ ├── SettingsService.cs
│ │ ├── ServerApiService.cs
│ │ ├── CorrectorService.cs
│ │ └── LlmService.cs
│ └── Helpers/NativeMethods.cs # P/Invoke (SendInput, tastatturhook)
└── server/ # Python-transkripsjonsserver
├── server.py
├── transcriber.py
├── config.py
├── config.yaml # Hovedkonfigurasjon (versjonskontrollert)
├── secrets.yaml # HuggingFace-token — IKKE versjonskontrollert (se nedenfor)
├── secrets.yaml.example
├── requirements.txt
└── test_client.py
- Windows 10 1809 (build 17763) eller nyere
- .NET 10 SDK (for å bygge fra kildekode)
cd client
dotnet build LocalWhisper/LocalWhisper.csproj -r win-x64cd client
dotnet publish LocalWhisper/LocalWhisper.csproj -r win-x64 -c Release --self-contained -o publishKopier publish\-mappen til målmaskinen og kjør LocalWhisper.exe. Ingen installasjon nødvendig.
Ved første oppstart starter appen i systemstatusfeltet (intet vindu vises). Ikonet indikerer tilstand:
| Ikon | Tilstand |
|---|---|
| 🟢 Grønn sirkel | Tilkoblet / inaktiv |
| 🔴 Rød sirkel | Tar opp |
| ⬛ Mørk grå firkant | Frakoblet |
Høyreklikk på ikonet for kontekstmenyen. Venstreklikk åpner innstillingsvinduet.
| Side | Beskrivelse |
|---|---|
| Tilkobling | Server-URL, koble til/fra |
| Hurtigtast | Aktiv hurtigtast, enkeltaster og modifikatorkombinasioner (Ctrl, Shift, Alt, Win), hold-to-talk-veksling |
| Modell | Bytt transkripsjonmsodell under kjøring |
| Lyd | Velg mikrofon, auto-kopier til utklippstavle, auto-send ved stillhet med lydnivåkalibrering, VAD-følsomhet og støykalibrering |
| Visning | Posisjon for overleggsvindu (6 posisjoner: øverst/nederst × venstre/midten/høyre) — flyttes i sanntid |
| Korreksjoner | Ord- og fraseerstatninger som anvendes på transkripsjonen |
| Direkteskriv | Korreksjoner som alltid injiseres via SendInput (Type), uavhengig av innlimingsmetode — aktiveres kun når hele transkripsjon matcher feltet nøyaktig |
| Stoppfraser | Fraser som fjernes fra transkripsjonsresultatet (ufølsom for store/små bokstaver). Hvis hele resultatet er en stoppfrase, forkastes det stille |
| LLM | Valgfri LLM-etterbehandling av transkripsjonen (Ollama, LM Studio, OpenAI, Claude, Azure OpenAI) |
| Generelt | Start/avslutning per segment, tekstinnlimingsmetode, avslutt appen |
| Om | Om appen |
Innstillinger lagres automatisk mellom økter.
Standard: F9
Støtter enkeltaster (F1–F24, bokstaver, piltaster, osv.), modifikatorkombinasioner (Ctrl, Shift, Alt, Win — én eller flere), og rene modifikatorer alene (f.eks. kun Shift).
To moduser (konfigurerbart på Hurtigtast-siden):
- Veksle (standard) — trykk én gang for å starte, trykk igjen for å stoppe
- Hold-to-talk — hold tasten inne mens du snakker, slipp for å stoppe
Tips: Aktiver Kopier automatisk til utklippstavle på Lyd-siden for å hoppe over det manuelle kopieringstrinnet — resultatet kopieres automatisk når opptaket stopper.
Tips: Aktiver Auto-send ved stillhet på Lyd-siden for kontinuerlig diktering — transkriberte tekster akkumuleres i overleggsvinduet mens du snakker og pauser naturlig. Bruk Avslutning per segment for å styre hvordan pausene settes sammen: mellomrom (sammenhengende tekst), enkelt linjeskift eller dobbelt linjeskift (avsnittsskift).
Tips: Opptaksnivåindikatoren viser ikke lyd under stilleterskel — bruk Lyd → Auto-send ved stillhet → Kalibrér lydnivå for å stille inn terskelen automatisk basert på tre sekunder med omgivelseslyd.
Tips: Sitter du i støyende omgivelser og Whisper begynner å hallusinere tekst fra bakgrunnsstøy? Gå til Lyd → Talegjenkjenning (VAD) og trykk Kalibrér støy. Appen tar opp tre sekunder med bakgrunnslyd og beregner riktig terskelverdi automatisk.
- Python 3.10+
cd server
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # macOS / Linux
pip install -r requirements.txtKreves kun for lukkede modeller. Unngår hastighetsbegrensning ved første nedlasting.
- Hent et skrivebeskyttet token på https://huggingface.co/settings/tokens
cp secrets.yaml.example secrets.yaml- Erstatt
hf_YOUR_TOKEN_HEREmed ditt token
secrets.yaml er i .gitignore og vil aldri bli versjonskontrollert.
Rediger config.yaml for infrastrukturinnstillinger (modell, enhet, port):
transcription:
default_model: "NbAiLab/nb-whisper-medium"
device: "cpu" # "auto" | "cuda" | "cpu"
compute_type: "int8" # "int8" for CPU, "float16" for GPUVAD-innstillinger (terskelverdi, av/på) settes fra klienten og synkroniseres automatisk ved tilkobling — de er ikke i config.yaml.
Tilgjengelige modeller:
| Modell | Merknader |
|---|---|
NbAiLab/nb-whisper-small |
Rask, mindre nøyaktig |
NbAiLab/nb-whisper-medium |
Anbefalt |
NbAiLab/nb-whisper-large |
Beste kvalitet, treg på CPU |
openai/whisper-large-v3 |
Flerspråklig |
cd server
.venv\Scripts\activate
uvicorn server:app --host 0.0.0.0 --port 8765Den valgte modellen lastes ned fra HuggingFace ved første kjøring (~1–3 GB). Påfølgende starter bruker lokal hurtigbuffer.
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
/health |
GET | Status, gjeldende modell, enhet |
/models |
GET | List tilgjengelige modeller |
/models/switch |
POST | Bytt modell under kjøring |
/config |
GET | Full konfigurasjon |
/config/streaming |
POST | Oppdater VAD-innstillinger under kjøring |
/config/calibrate |
POST | Analyser støyopptak, returner anbefalt VAD-terskel |
/transcribe/file |
POST | Transkriber lydfil (wav, mp3, m4a, flac, …) |
curl http://localhost:8765/healthVerifiser serveren uten Windows-klienten:
# Tilkoblingstest (3 sekunder stillhet)
python test_client.py
# Strøm en WAV-fil
python test_client.py sti/til/lyd.wav
# Ekstern server
python test_client.py --url ws://192.168.1.x:8765/ws/transcribe sti/til/lyd.wavForventet utdata:
[final ] 'Hei, dette er en test av talestyring.' (1243ms)
- Transkripsjon kjøres etter at opptaket stopper (eller per stillhetspause med auto-send) — lengre opptak mellom pauser betyr lengre ventetid for hvert resultat.
- faster-whisper støtter ikke Metal/MPS — macOS bruker CPU med int8.
- Den globale tastatturhoken (
WH_KEYBOARD_LL) kan bli blokkert i noen bedriftsmiljøer. Fn-tasten genereres på maskinvarenivå og når aldri operativsystemet — den kan ikke brukes som hurtigtast.