New · version 0.2.1
Your GPU, as a private speech service.
Viska Server turns a Linux machine with a graphics card into the transcription engine for your laptop and your phone. Install it with one command on a home server or a virtual machine, pick a Whisper model for each language, and pair your devices. Your voice goes to your own hardware and nowhere else.
The same host as Viska, without a desktop.
Viska on a desktop computer can already share its GPU in host mode. Viska Server is that host as a standalone system service: no window, no keyring, no logged-in user. It speaks the same protocol, so Viska on another computer and Viska Voice on Android connect to it exactly as they connect to a desktop host.
It is built to run for weeks on its own. A watchdog restarts it if it stops answering, a fatal GPU error ends the process so systemd can start a clean one, and updates are signed, installed side by side and rolled back if the new version does not come up.
curl -fsSL https://getviska.app/server/install.sh \
| sudo bash
# later
sudo viska-server pair
viska-server status
What you need.
- Ubuntu 22.04 or 24.04, or Debian 12, on x86_64 with systemd. A virtual machine is fine, for example on Proxmox with the graphics card passed through.
- An NVIDIA GPU with driver 550 or newer. RTX 30, 40 and 50 series work; the 50 series needs the CTranslate2 build the installer picks. Without a GPU it runs on the CPU, much slower. AMD cards with ROCm are experimental.
- About 10 GB free in
/optand/var/libfor the program and the models. - Tailscale for private access from your devices, or a domain name if you want public HTTPS through Caddy.
Install.
The installer asks which languages and models you want, sets up a system user and a hardened systemd service, downloads the models, publishes the server on your tailnet and prints a pairing code. Run it again at any time: it never overwrites your settings or your token.
Prefer not to pipe a script into a shell? Download install.sh
and its signature install.sh.sig, read it, check the
signature with the public key (also shown below), then run it with sudo bash install.sh.
# Swedish and English, Tailscale (the default)
curl -fsSL https://getviska.app/server/install.sh | sudo bash
# no questions: KB-Whisper medium for Swedish,
# Whisper medium.en for English, 1.5 GB budget
curl -fsSL https://getviska.app/server/install.sh \
| sudo bash -s -- --yes
# public HTTPS with your own domain
… | sudo bash -s -- --domain speech.example.com
# one multilingual model for every language
… | sudo bash -s -- --languages multilingual
Models and memory.
No language is required. Give each language the model you want: KB-Whisper small,
medium or large for Swedish, Whisper medium.en for English, or one multilingual model
such as Whisper large-v3 turbo for all of them. Change it whenever you like with
viska-server models use.
A home model stays on the GPU, ready at once. When a device asks for another language, its model is loaded beside the home model while you are still speaking; the GPU memory budget only limits those other models. An idle language model is parked in ordinary memory and is back on the GPU in under a second. Only if the card itself is full is the home model parked instead, and it moves back after a quiet spell. Real memory use is measured on your card, so the budget is not a guess.
# /etc/viska-server/config.toml
[languages]
sv = "kb-whisper-medium-ct2"
en = "whisper-medium-en-ct2"
[memory]
home_model = "kb-whisper-medium-ct2"
gpu_budget_mb = 1500
keep_home_on_gpu = true
return_home_after_minutes = 10
# apply without a restart
sudo systemctl reload viska-server
Proofreading, your way.
With intuitive proofreading the server turns what you said into what you meant to write. It uses Ollama Cloud with DeepSeek V4.1 Flash by default, which states that it keeps no data, or a model on your own machine through Ollama (Gemma 4, Qwen and others) or any OpenAI-compatible server such as vLLM or llama.cpp.
The prompt is yours to edit with sudo viska-server prompt edit sv. A device
may also send its own prompt for its own dictations; you can switch that off.
- Store the key with
sudo viska-server keys set ollama. It is read from the terminal without echo and kept in a root-owned file, never in the config. - Proofreading has a short deadline. If the provider is slow or down, the raw text is returned with a note, so dictation never waits on it.
- Proofreading sends text, never audio.
Pair your devices.
sudo viska-server pair prints a QR code in the terminal and a pairing link.
Scan the code with Viska Voice, or paste the link into Viska under Remote GPU. The link
carries the server address and its token: treat it like a password, and run
sudo viska-server token rotate if a device is lost.
- The server listens on localhost only. Tailscale or Caddy publishes it over HTTPS.
- Every request except a health check needs the token. Repeated wrong tokens from one address are slowed down.
- There is no administration over the network. Settings are changed over SSH, with the command line and one config file.
- Audio is kept in memory and never written to disk. The server logs durations and sizes, never audio, text or tokens.
Updates that undo themselves.
Once a day a small root service checks for a new version. The release list is signed, and the installed server only accepts our key and never an older version. The new version is installed next to the current one, the server waits until nobody is dictating, switches over and checks that it is healthy. If not, it switches back.
Choose auto, notify or off in the config file, and
the hours when automatic installs may happen. Your settings, prompts and token are never
touched by an update.
sudo viska-server update --check
sudo viska-server update
journalctl -u viska-server-update
Commands.
| Command | What it does |
|---|---|
viska-server status | Version, GPU, loaded and parked models, sessions |
viska-server doctor | Checks the driver, CUDA libraries, models, ports, Tailscale or Caddy, disk and config |
viska-server models list | Every model you can install, with size and languages |
sudo viska-server models use sv kb-whisper-large-ct2 | Serve Swedish with another model; installs it if needed |
sudo viska-server models home … / models budget 1500 | Set the home model and the GPU memory budget |
sudo viska-server prompt edit sv | Edit the Swedish proofreading prompt; prompt reset goes back |
sudo viska-server config edit | Edit the config file, check it and reload the server |
sudo viska-server pair / token rotate | Show the pairing code, or issue a new token |
Release signing key
Updates and the installer are signed with this Ed25519 key. Check a downloaded installer with base64 -d install.sh.sig > sig.bin && openssl pkeyutl -verify -pubin -inkey viska-server.pub -rawin -in install.sh -sigfile sig.bin.
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAsfAJMY6MB24e1ez38QWayD2G0Sm0BUUzUFkY6lvwHKQ=
-----END PUBLIC KEY-----Coming from the old viska-remote service? The installer takes over its token and Ollama key, so paired phones keep working, and switches the old service off.
Changes.
0.2.1
Keeps your main language model on the GPU while another language loads beside it, parks idle language models in RAM, and applies a new home model right after a reload. Viska Desktop 0.7.4 shows the languages the server serves.
Package: viska_server-0.2.1-py3-none-any.whl, SHA-256 1c495139cd359dc86576252fadce9da7de18547f448e5850e0e09fd38e9bf581. The installer and the update service fetch it for you and check its signed manifest.