Running fully air-gapped¶
YazSes transcribes on-device, so an air-gapped machine is a supported case rather than a workaround. The only thing that ever needs the network is fetching a model once, and this page shows how to do that elsewhere and carry it across — and how to verify the claim rather than take it on trust.
Verified on
Ubuntu 24.04 · Python 3.14 · YazSes 2.18.2 · faster-whisper, int8 CPU. Every command below was run there.
What actually needs the network¶
| Thing | When | Air-gapped answer |
|---|---|---|
| The Whisper model | first use of each model | copy the cache directory |
| Diarization models | first --diarize only | copy the data directory |
| The package itself | install | pip download on a connected machine |
| Anything else | never | — |
There is no telemetry, no update check on the dictation path, and no cloud inference. The one place a remote endpoint can be configured — the optional LLM cleanup — refuses a non-loopback address unless you explicitly opt out with [filters.disfluency] llm_allow_remote_endpoint, and the daemon warns on every start while that is on.
Step 1 — fetch the models on a connected machine¶
Install YazSes there, then pull each model you want by using it once:
yazses transcribe some-recording.wav --model base.en
yazses transcribe --download-models # only if you want --diarize
Confirm where they landed:
Step 2 — carry two directories across¶
# on the connected machine
tar czf yazses-models.tar.gz \
-C ~ .cache/huggingface/hub \
.local/share/yazses/diarization # omit if you do not use --diarize
Sizes, so you can pick media: tiny.en 78 MB, base.en 148 MB, small.en 486 MB on disk; the diarization pair is about 45 MB.
Step 3 — install the package without a network¶
On the connected machine, matching the target's Python version and architecture:
On the air-gapped machine:
evdev builds from source on Linux
It publishes no wheels at all, so pip download fetches an sdist and the target machine needs a compiler and kernel headers — build-essential python3-dev on Debian/Ubuntu. This catches people out precisely because every other dependency is a wheel.
Step 4 — prove it does not phone home¶
Do not take this page's word for it. The model loader asks for a cached snapshot first (local_files_only=True) and only falls back to downloading if that fails, so setting the hub offline is a real test rather than a placebo:
HF_HUB_OFFLINE=1 python3 -c "
import soundfile as sf, dataclasses
from yazses.config import SttConfig
from yazses.stt.factory import build_engine
eng = build_engine(dataclasses.replace(SttConfig(), model='base.en'))
a, sr = sf.read('clip.wav', dtype='float32')
print(eng.transcribe(a, sr)[:60])"
Real output:
Stronger, and the one worth doing if it matters to you — watch the syscalls:
sudo strace -f -e trace=network -o /tmp/net.log yazses transcribe clip.wav
grep -c "connect(" /tmp/net.log
Strongest — take the interface down and dictate:
What to turn off¶
Nothing on the dictation path reaches out. One optional feature would, if enabled:
That is the whole list. There is no update-check setting to disable, because there is no automatic update check: yazses update contacts PyPI or the Snap Store only when you run it, and is never called on your behalf.
What is not covered here¶
yazses updateon an air-gapped machine has no offline path; upgrade by repeating step 3 with newer wheels.- A genuinely disconnected machine was not used for this page. The verification above was done with the hub forced offline and the model cache in place, which exercises the same code path — but nobody unplugged a cable. If you run YazSes on a real air-gapped system, tell us what happened.