Artificial Intelligence (AI) Azure

Scriberr on Ubuntu 24.04 on Azure User Guide

| Product: Scriberr on Ubuntu 24.04 LTS on Azure

Overview

Scriberr is an open source, self hosted AI audio transcription application. You upload an audio recording and it returns an accurate, searchable transcript through a clean web interface, powered by OpenAI Whisper models via WhisperX. It runs entirely on your own VM so your recordings never leave your infrastructure, with optional speaker diarization and optional LLM summarisation and chat over your transcripts.

The cloudimg image ships Scriberr v1.2.0 as a single Docker Compose service under /opt/scriberr, bound to loopback 127.0.0.1:8080 and fronted by nginx on port 80. The WhisperX Python environment and a compact small Whisper model, together with the silero voice activity model and the English alignment model, are baked into the image, so a transcription works immediately and fully offline the first time you log in, with no multi gigabyte model download.

Secure by default, no default login: the image ships with zero user accounts. On first boot a scriberr-firstboot.service oneshot generates a unique administrator password for your instance, registers that single administrator, and self registration is then automatically closed, so no one else can create an account. The password is written to a root only file on the VM. Public access on port 80 is only opened after that first boot registration completes.

Per instance secrets: the JWT session signing secret is generated uniquely on first boot into /opt/scriberr/.env (readable only by root), so no two instances share a signing key and nothing secret ships inside the image.

CPU only, no GPU required: the default transcription profile is tuned for a modest CPU VM (the small model with int8 compute and silero voice activity detection). Select a larger model and a larger VM for higher accuracy. The advanced NVIDIA GPU models (Parakeet, Canary, Sortformer) are disabled on this CPU image; run Scriberr on a GPU VM if you need them.

What is included:

  • Scriberr v1.2.0 as ghcr.io/rishikanthc/scriberr:v1.2.0
  • WhisperX transcription environment + a baked small Whisper model (offline ready)
  • PyAnnote speaker diarization support (bring your own HuggingFace token)
  • Docker Engine with the Compose plugin from the official Docker repository
  • scriberr.service managing the container, the app bound to 127.0.0.1:8080
  • nginx reverse proxy on port 80, streamed progress + large upload aware, ready for TLS
  • scriberr-firstboot.service for first boot admin creation, per instance secret and default profile
  • Ubuntu 24.04 LTS base, fully patched, unattended security upgrades enabled
  • 24/7 cloudimg support, 24h response SLA

Prerequisites

An active Azure subscription, an SSH key pair, and a VNet with a subnet. Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM), which comfortably runs the default small model on CPU. For faster or more accurate transcription with larger models, choose a VM with more vCPUs and RAM. No GPU is required.

Step 1: Deploy from the Azure Portal

Launch the image from the Azure Marketplace into your resource group, choosing your VNet/subnet and SSH key. Open port 80 (HTTP) to the networks that should reach the web interface, and port 22 (SSH) to your admin network. The first boot prepares the service and creates your administrator; give it a minute or two after the VM reports running.

Step 2: Retrieve your administrator password

There is no default password. A unique administrator credential is generated for your instance on first boot and written to a root only file. SSH in and read it:

sudo cat /root/scriberr-credentials.txt

You will see the generated username and password and your instance URL:

# Scriberr on Ubuntu 24.04 — Per-VM Credentials (root only)
SCRIBERR_ADMIN_USERNAME=admin
SCRIBERR_ADMIN_PASSWORD=<ADMIN_PASSWORD>
SCRIBERR_URL=http://<your-vm-ip>/

The file is mode 0600, readable only by root, and self registration is already closed, so this administrator is the only account:

sudo ls -l /root/scriberr-credentials.txt
curl -s http://127.0.0.1/api/v1/auth/registration-status

The registration status returns {"registration_enabled":false} — no one can register a second account.

The services active and the Scriberr container running, published on loopback 127.0.0.1:8080 behind nginx on port 80

The per-VM credentials file listed with 0600 root-only permissions, showing the generated administrator username with the password withheld

Step 3: Log in

Browse to http://<your-vm-ip>/. You are greeted by the Sign In screen. Enter the username and password from the credentials file.

The Scriberr Sign In screen, with username and password fields and no default credential

You can confirm the credential works and that the default admin/admin is rejected from the command line:

# the per-VM admin authenticates and returns a JWT
curl -s -o /dev/null -w 'admin login: HTTP %{http_code}\n' -X POST http://127.0.0.1/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"<ADMIN_USERNAME>","password":"<ADMIN_PASSWORD>"}'
# a guessed default credential is refused
curl -s -o /dev/null -w 'default admin/admin: HTTP %{http_code}\n' -X POST http://127.0.0.1/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"admin"}'

The per-VM login returns 200; the default admin/admin returns 401.

The command line round-trip showing the per-VM admin login succeeding and the default admin/admin credential rejected with HTTP 401

Step 4: Transcribe an audio file

After signing in you land on your recordings dashboard. Click the + button to upload an audio file, keep the default CPU (Standard_B2s) profile (which uses the baked small model, int8 compute and silero voice activity detection), and start the transcription. Progress streams live; when it completes the recording appears in the list with a green tick.

The Scriberr dashboard listing a completed transcription

Open the recording to read the transcript. Scriberr shows an audio player and the transcript text, with word level timings available underneath.

A completed transcription opened in Scriberr, showing the audio player and the rendered transcript text

The whole flow works offline against the baked model. You can also drive it from the API — here a short clip is transcribed end to end and the transcript printed:

# log in and capture a JWT
TOKEN=$(curl -s -X POST http://127.0.0.1/api/v1/auth/login -H 'Content-Type: application/json' \
  -d '{"username":"<ADMIN_USERNAME>","password":"<ADMIN_PASSWORD>"}' | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')
# submit the bundled sample clip for a quick transcription
JOB=$(curl -s -X POST http://127.0.0.1/api/v1/transcription/quick -H "Authorization: Bearer $TOKEN" \
  -F 'audio=@/opt/scriberr/sample/sample-english.wav;type=audio/wav' \
  -F 'parameters={"model":"small","compute_type":"int8","device":"cpu","vad_method":"silero","diarize":false,"batch_size":4}' \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])')
# poll until it finishes and print the transcript
for i in $(seq 1 40); do
  S=$(curl -s http://127.0.0.1/api/v1/transcription/quick/$JOB -H "Authorization: Bearer $TOKEN")
  echo "$S" | grep -q '"status":"completed"' && { echo "$S" | python3 -c 'import sys,json;print(json.load(sys.stdin)["transcript"].strip())'; break; }
  sleep 3
done

The API transcription round-trip: logging in, submitting the sample clip with the baked small model, and printing the completed transcript with word level timings

Step 5: Larger models, speaker diarization and summaries

  • Higher accuracy: in the transcription profile, choose a larger Whisper model (medium or large-v3). Larger models need more RAM and CPU, so pair them with a larger VM size.
  • Speaker diarization: PyAnnote diarization requires a free HuggingFace access token and acceptance of the pyannote model licence. Add your token to a profile and enable diarization to label speakers.
  • Summaries and chat: to summarise or chat over a transcript, add an OpenAI compatible API key in the settings, or point Scriberr at a local model endpoint.

Enable HTTPS for production

The image serves plain HTTP on port 80 so login works out of the box. For production, put a certificate in front. Point a DNS name at the VM and use certbot with nginx:

sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.com

After enabling HTTPS you may re-enable secure cookies by setting SECURE_COOKIES=true in /opt/scriberr/.env and restarting scriberr.service. Change the administrator password after your first login from the account menu.

Managing the service

# service status
systemctl status scriberr.service nginx.service --no-pager
# the container
sudo docker ps
# application logs
sudo docker logs --tail 50 scriberr
# restart the stack
sudo systemctl restart scriberr.service

Data (the SQLite database, uploaded audio, transcripts and the model cache) lives under /opt/scriberr/data on the OS disk and is captured with the VM. The transcription environment is under /opt/scriberr/whisperx-env.

Support

Every cloudimg image includes 24/7 support with a 24 hour response SLA. Contact support@cloudimg.co.uk for help deploying or operating Scriberr on Azure.

Scriberr is a trademark of its respective owner. This image repackages open source software; cloudimg charges for support services.