# VoiceStudio — Install on Linux
VoiceStudio's Linux desktop app is built with Electron. The archived Tauri app
is no longer maintained; if you still run it, follow the
[migration guide](../electron-migration.md).
## Requirements
- **Linux x86_64** with a graphical desktop session (X11 or Wayland). There are
no ARM64 Linux packages.
- **~10 GB free disk** for the app, its Python environment, and model weights.
- Optional: an **NVIDIA driver** for CUDA acceleration. Without one, setup
installs the CPU build of PyTorch (see below). For AMD GPUs see
[AMD GPU (ROCm)](#amd-gpu-rocm).
Python, FFmpeg/FFprobe, yt-dlp, and model weights are bootstrapped by the app
on first launch; no toolchain is needed for the packaged app. If no FFmpeg
resolves anywhere, the app downloads its own checksummed static build;
**Settings → Audio tools** shows which binaries are in use and lets you
override them or update yt-dlp.
## Install (AppImage or .deb)
Download a package from the
[Releases page](https://github.com/debpalash/VoiceStudio/releases/latest):
| Package | File |
|---|---|
| AppImage (any distribution) | `VoiceStudio-Electron--linux-x64.AppImage` |
| Debian / Ubuntu package | `VoiceStudio-Electron--linux-x64.deb` |
**AppImage:**
```bash
chmod +x VoiceStudio-Electron-*-linux-x64.AppImage
./VoiceStudio-Electron-*-linux-x64.AppImage
```
The AppImage uses the static AppImage runtime, so it does not need `libfuse2`.
The [shell installer](script.md) (`curl -fsSL https://voicestudio.sh/install | sh`)
downloads the latest AppImage, verifies it against the release's
`SHA256SUMS.txt`, and installs it as `~/.local/bin/VoiceStudio`.
**.deb:**
```bash
sudo apt install ./VoiceStudio-Electron--linux-x64.deb
```
The in-app updater's Linux feed carries the AppImage. Update a `.deb`
installation by installing the newer `.deb`; remove it with your package
manager.
Compare any download with the release's `SHA256SUMS.txt` before installing.
### Machines without an NVIDIA GPU
Laptops and desktops with Intel/AMD integrated graphics (or any GPU without
an NVIDIA driver) run the whole app on the CPU, just slower. When no NVIDIA
driver is found, the packaged app's runtime setup installs the small CPU build
of PyTorch rather than the CUDA build and its ~3 GB of `nvidia-*` packages,
and needs about 5 GiB of free disk instead of 9 GiB. Pick a light voice engine
(KittenTTS, Supertonic-3, PocketTTS) and a small Whisper model for the best
speed. `OMNIVOICE_TORCH_VARIANT=cuda|cpu|rocm` overrides the detection, and an
existing install keeps working untouched. Source setup (`bun run setup:api`)
also selects the locked CPU wheels on x86-64 hosts without NVIDIA. Linux ARM
source installs keep their native PyPI wheels. See
[CPU setup and overrides](../../electron/README.md#running-without-a-gpu).
## Building from source
Use this for development or to run current `main`. To build and install a
desktop package from `main` without a checkout, use the shell installer's
[`--main` mode](script.md#building-main).
Prerequisites:
- **git** and **curl**
- **Bun** — `curl -fsSL https://bun.sh/install | bash`
- **uv** — `curl -LsSf https://astral.sh/uv/install.sh | sh` (it provides the
managed Python 3.11 the backend uses)
- **Node.js 22+**, **Rust / Cargo**
(`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`), and the
native development libraries used by the Electron native helper. If you use
rustup, reopen the shell or run `source "$HOME/.cargo/env"` first.
```bash
# Debian / Ubuntu
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libasound2-dev libxdo-dev \
libxtst-dev libx11-dev libxkbcommon-dev libwayland-dev libssl-dev \
binutils zsync
# Fedora
sudo dnf install gcc gcc-c++ make pkgconf-pkg-config alsa-lib-devel libxdo-devel \
libXtst-devel libX11-devel libxkbcommon-devel wayland-devel openssl-devel
# Arch
sudo pacman -S --needed base-devel alsa-lib xdotool libxtst libx11 \
libxkbcommon wayland openssl
```
`bun run dist` also needs `readelf` (binutils) and `zsyncmake` (zsync) to
embed AppImage update information.
Then, from a clone of the repository:
```bash
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
bun run setup:api # create the Python environment with uv
bun run dev # Electron with hot reload; it starts and supervises the backend
```
Do not start the backend in a second terminal; Electron attaches to a backend
already listening on port 3900, otherwise it starts its own. Other commands:
| Command | What it does |
|---|---|
| `bun run desktop-prod` | Build Electron and launch the production bundle |
| `bun run dist` | Build local installers (AppImage and `.deb`) in `electron/release/` without publishing |
| `bun run smoke-test` | Build and launch an isolated packaged app |
See [Electron setup](../../electron/README.md) for backend configuration and
quality gates. The first launch downloads model weights only when you install
a model.
### Arch Linux (AUR)
```bash
yay -S voicestudio-bin # or paru -S voicestudio-bin
```
`voicestudio-bin` is a community-maintained AUR package that installs the
release `.deb`; report packaging problems on its AUR page. Package-managed
installs should set `VOICESTUDIO_DISABLE_UPDATER=1` so `pacman` handles
updates instead of the in-app updater.
## ChromeOS, iPad and other devices
There is no native ChromeOS or iPadOS app, and VoiceStudio does not run
inside the browser alone: the models need a real backend.
- **Chromebook with Linux development environment on x86-64:** install the
AppImage or `.deb` ([Install](#install-appimage-or-deb)). Expect CPU-only
generation (the container has no GPU access on most devices) and enough RAM
for the model you pick. ARM Chromebooks are not supported: the Linux builds
are x86-64 only.
- **Any browser, including ChromeOS, iPad and phones:** run VoiceStudio on a
PC, Mac or server and open its web interface from the device. On the same
network turn on **Network** sharing and scan the QR code; from anywhere, use
Tailscale. See [Sharing & Remote Access](../sharing.md); for a headless host
see [Docker](docker.md).
## Wayland dictation shortcut
System-wide dictation on Wayland uses the standard
`org.freedesktop.portal.GlobalShortcuts` interface. Your desktop must run
`xdg-desktop-portal` and a portal backend that implements that interface. The
desktop owns the consent dialog and may let you replace VoiceStudio's preferred
key combination.
VoiceStudio binds the replacement before saving a changed shortcut. If consent
is declined or the portal is unavailable, Settings keeps the previous shortcut
and reports the registration failure. The configured shortcut still works while
the VoiceStudio window is focused.
While a dictation is running, VoiceStudio shows a small always-on-top capsule.
It sits near the bottom of the screen your pointer is on — except on Wayland,
where the protocol gives applications no say in their own placement and the
compositor decides where it appears. The capsule works the same either way; only
its position is out of the app's hands there.
Wayland does not expose a portable identity for the app focused at shortcut
down, so VoiceStudio safely leaves the complete transcript on the clipboard and
the pill says **Copied** instead of risking insertion into a different app.
Advanced users can opt into current-focus insertion with
`VOICESTUDIO_WAYLAND_UNTARGETED_INSERT=1`. wlroots compositors such as Sway and
Hyprland use `wtype`; KDE Plasma and GNOME can use `dotool` or `ydotool` to
paste the Unicode clipboard payload. The
opt-in targets whichever client owns keyboard focus when transcription
finishes, not necessarily the app where dictation started. Tray-started
dictation remains copy-only. `dotool` needs direct write access to
`/dev/uinput` (normally through a distribution udev rule/group). `ydotool`
1.0+ needs the `ydotoold` daemon running with that access and its socket
available to the desktop user. VoiceStudio skips either helper when its
readiness check fails.
If the global shortcut stops working, restart your desktop's portal service,
then save the shortcut again in **Settings → Hotkey** to reopen consent. Portal
packages and support vary by desktop; use the backend recommended by your
distribution rather than running multiple portal backends in the same session.
See the portal project's [service integration checks](https://flatpak.github.io/xdg-desktop-portal/docs/system-integration.html)
and the Arch Linux [backend compatibility table](https://wiki.archlinux.org/title/XDG_Desktop_Portal#List_of_backends_and_interfaces)
for concrete service and desktop-backend checks.
## Blank window or GPU errors
The Electron app renders with Chromium, not WebKitGTK, so the `WEBKIT_*`
variables and the bundled-WebKit/GStreamer workarounds from the archived Tauri
AppImage no longer apply. If the window stays blank or the terminal shows GPU
process errors, start the app once with Chromium's GPU acceleration disabled:
```bash
./VoiceStudio-Electron-*-linux-x64.AppImage --disable-gpu
```
On Wayland sessions you can also try forcing X11 (XWayland) with
`--ozone-platform=x11`. If either flag helps, report your distribution, desktop
and GPU driver in a GitHub issue.
## .deb ffprobe conflict
This applies only to upgrades from **pre-v0.3** `.deb` packages, which
installed `ffprobe` into `/usr/bin/ffprobe` and could clobber the system copy.
If `ffprobe -version` reports the wrong binary after such an upgrade,
reinstall the system package:
```bash
sudo apt install --reinstall ffmpeg
```
## Restricted networks (China / Russia)
If `uv` times out fetching the python-build-standalone tarball or PyPI:
```bash
# Use a faster Python source mirror (China only — verify a current mirror)
export UV_PYTHON_INSTALL_MIRROR=https://gh-proxy.com/https://github.com/astral-sh/python-build-standalone/releases/download
# Use a PyPI mirror
export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
# Or skip the download entirely if you have a compatible system Python
export UV_PYTHON_PREFERENCE=only-system
# Be tolerant of slow links
export UV_HTTP_TIMEOUT=120
export UV_HTTP_RETRIES=5
```
Packaged setup already tries a Python download mirror and raises the uv
network budget automatically; set these to force a specific mirror, or before
`bun run setup:api` in a source checkout. See
[troubleshooting](troubleshooting.md#first-run-setup-fails-on-a-restricted-network-githubpypi-blocked).
## AMD GPU (ROCm)
ROCm support is **Linux-only and opt-in**. The **default install ships the
CUDA build** of PyTorch (the `pytorch-cuda` index in `pyproject.toml`), so on
an AMD-only machine `torch.cuda.is_available()` is `False` and VoiceStudio runs
on CPU until you opt into the ROCm variant.
> **Running in Docker or Podman instead?** There's a prebuilt ROCm image —
> `ghcr.io/debpalash/voicestudio:stable-rocm` — with GPU acceleration out of the
> box; see [docker.md](docker.md#pull-and-run-amd-gpu--rocm). The rest of this
> section is about source/desktop installs. (VoiceStudio has no ROCm path on
Windows; see [windows.md](windows.md#gpu-support) for what a Radeon card can
do there.)
Ways to opt in, in order of preference:
**1. Packaged app (environment variable).** Install the ROCm userspace
(`/opt/rocm` or `rocminfo` on PATH), then launch VoiceStudio once with
`OMNIVOICE_TORCH_VARIANT=rocm` set, for example
`OMNIVOICE_TORCH_VARIANT=rocm ./VoiceStudio-Electron-*-linux-x64.AppImage`.
Runtime setup then reinstalls `torch`/`torchaudio` from the ROCm wheel index
(`https://download.pytorch.org/whl/rocm6.4` by default) right after the
dependency sync, matched to the app's pinned `torch==2.8.0` (the rocm6.2 index
only ever published up to torch 2.5.1). **Settings → Performance → GPU
acceleration** reports which PyTorch build is installed. The option is ignored
on macOS and Windows.
**2. Source checkout.** `OMNIVOICE_TORCH_VARIANT=rocm bun run setup:api` swaps
torch right after `uv sync`; `bun run dev` then starts the backend from that
environment, and `bun run dev:api` launches it without re-syncing, so the
wheel is not reverted (#1665). Running `bun run setup:api` without the
variable restores the lockfile's CUDA build — a hand-swapped ROCm wheel does
not survive it. `OMNIVOICE_TORCH_INDEX=` overrides the wheel
index when you need a different ROCm version — e.g. AMD publishes newer
driver-matched builds (7.2.x) at `repo.radeon.com` as a `--find-links` page
rather than a PyPI-style index:
```bash
uv pip install --reinstall torch==2.8.0 torchaudio==2.8.0 \
--find-links https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2.4/
```
run that manually if you want a specific ROCm point release; the
`OMNIVOICE_TORCH_INDEX` env var only accepts a PEP 503 index URL, not a
find-links page. If the reinstall fails (network, unsupported card), VoiceStudio
keeps the default torch build and warns instead of breaking the install.
**3. Manual wheel swap (fallback).** Replace torch with the ROCm wheel
**after** the first-run install populates the venv:
```bash
# From the project directory (source install), into VoiceStudio's uv venv.
# Matches the app's torch==2.8.0 pin — a different ROCm point release
# (e.g. rocm6.2, rocm7.x) may not carry that exact torch build.
uv pip install --reinstall torch torchaudio \
--index-url https://download.pytorch.org/whl/rocm6.4
```
Once a ROCm build of PyTorch is in the venv, detection is automatic —
`get_best_device()` returns the GPU (ROCm-built PyTorch reports through
`torch.cuda.is_available()`), and VoiceStudio auto-sets
`HSA_OVERRIDE_GFX_VERSION` for consumer cards whose GFX ID isn't in the
official ROCm support matrix. Relaunch and **Settings → Performance → GPU acceleration** should
report the GPU device instead of `cpu`. Verify the wheel sees your card:
```bash
uv run python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
```
Notes:
- ROCm is exercised far less than the default CUDA/MPS/CPU paths — it works,
but expect rough edges on consumer cards and report what you hit.
- Unsupported GFX (e.g. some consumer RDNA cards): if it still won't run, set
`HSA_OVERRIDE_GFX_VERSION` yourself (e.g. `export HSA_OVERRIDE_GFX_VERSION=11.0.0`)
to the nearest supported architecture before launching.
- ZLUDA (CUDA-on-ROCm translation) can work but is unsupported here — prefer a
native ROCm wheel.
Tracking issue: [#124](https://github.com/debpalash/VoiceStudio/issues/124).
## Hugging Face token (optional but recommended)
See [docs/setup/huggingface-token.md](../setup/huggingface-token.md).
## Troubleshooting
Hit a wall? See [docs/install/troubleshooting.md](troubleshooting.md).