Free self-hosted Jitsi transcription with Jigasi and Vosk

Short answer

For our existing Jigasi/Vosk setup, run Jigasi in transcriber mode, configure its password and point it at Vosk using a custom properties file. Apply environment changes by recreating the affected containers. Our larger English model setup starts at 16 GB RAM; requirements depend on the selected model. New deployments should evaluate bridge-based transcription.

Jitsi can show live subtitles and save a transcript of every meeting. The transcription component is Jigasi, the same service that handles SIP phone dial-in, running in a different mode. For the speech recognition itself you can use Google Cloud Speech or run Vosk locally for free.

Getting Vosk working on the stock Docker files took us three fixes that are not in the official documentation. They are the reason most people give up, so they are the core of this guide.

Heads up: Jitsi now marks Jigasi transcription as deprecated. Its handbook says bridge-based transcription replaces it and Jigasi transcription will be removed in a future release (handbook). This setup still works on current releases. For a new deployment, read bridge-based transcription and what the deprecation means for you first.

What you need

  • A working Docker install matching our stable-11031 reference. Later releases need their own configuration check. See install Jitsi with Docker.
  • Memory for the selected model plus Jitsi. Our larger English setup starts at 16 GB RAM; Vosk’s model documentation distinguishes small models from large models with much higher memory needs. This is not a universal minimum or a capacity guarantee.
  • Jigasi’s compose overlay, jigasi.yml, from the same release.

Fix 1: run Jigasi as a transcriber

The stock jigasi.yml sets JIGASI_MODE=sip. In SIP mode Jigasi ignores transcription requests from Jicofo, and users see service-unavailable when they turn on subtitles.

Override it, and pass the transcriber password through (the base file does not):

YAML
# jigasi-override.yml
services:
  jigasi:
    environment:
      - JIGASI_MODE=transcriber
      - JIGASI_TRANSCRIBER_PASSWORD

Fix 2: set the transcriber password, then restart Prosody

In .env:

Config
ENABLE_TRANSCRIPTIONS=1
JIGASI_TRANSCRIBER_PASSWORD=a-long-random-password

An empty or mismatched password can produce SASLError SCRAM-SHA-1 not-authorized. Confirm the failed account and hidden domain. Apply changed Compose environment values by recreating Prosody and Jigasi during a maintenance window; restarting alone keeps the old environment. Recreating Prosody interrupts meetings.

Fix 3: configure Vosk in a mounted properties file

The Docker init scripts do not translate the JIGASI_SIP_COMMUNICATOR_PROP_* variables into sip-communicator.properties in transcriber mode. Write the file yourself and mount it. Note the property name: Jigasi reads vosk.websocket_url with an underscore. Written as vosk.websocket.url it is silently ignored, Jigasi falls back to a localhost default, and transcripts contain join events but no speech.

Properties
# config/jigasi/custom-sip-communicator.properties
org.jitsi.jigasi.transcription.customService=org.jitsi.jigasi.transcription.VoskTranscriptionService
org.jitsi.jigasi.transcription.vosk.websocket_url=ws://vosk:2700
org.jitsi.jigasi.transcription.DIRECTORY=/config/transcripts
org.jitsi.jigasi.transcription.SAVE_TXT=true

Add the Vosk server

YAML
# vosk.yml
services:
  vosk:
    image: alphacep/kaldi-en:latest
    restart: unless-stopped
    networks:
      - meet.jitsi

It listens on port 2700 inside the Docker network only. Nothing needs to be opened on the firewall.

Start everything

Terminal
cd /opt/jitsi-meet
curl -fsSLO https://raw.githubusercontent.com/jitsi/docker-jitsi-meet/stable-11031/jigasi.yml
mkdir -p config/transcripts
docker compose -f docker-compose.yml -f jigasi.yml -f jigasi-override.yml -f vosk.yml up -d
docker compose -f docker-compose.yml -f jigasi.yml -f jigasi-override.yml -f vosk.yml up -d --force-recreate prosody jigasi

Test it

  1. Join a meeting and open the menu, then Subtitles (or Start transcription in some releases).
  2. Speak a sentence. Captions should appear within a second or two.
  3. Leave the meeting and check config/transcripts for a new .txt file with your words in it.

Watch the logs while you test:

Terminal
docker compose -f docker-compose.yml -f jigasi.yml -f jigasi-override.yml -f vosk.yml logs -f jigasi vosk

A healthy log shows Jigasi joining the room as the transcriber and opening a WebSocket to vosk:2700.

Accuracy and languages

Vosk is good for clear speech in its language and weaker with heavy accents, cross-talk and jargon. For English meetings it is useful for searchable notes; for legal-grade transcripts use Google Cloud Speech or a post-meeting service on the recording.

Troubleshooting

See Jitsi transcription not working for each error message and its fix.

One-click option

On our platform, transcription is a one-time $29 feature per server. All three fixes above are built in, the server is sized correctly, and transcripts upload to your own S3 bucket. We also add transcription to existing servers as a service.

Written by the Jitsi Help engineering team

Jitsi infrastructure engineers who deploy and run Jitsi Meet servers in production. The steps on this page are tested on Jitsi Meet stable-11031. Last updated . How we write our guides

Stuck on something this page does not cover? Ask a question below. Jitsi Help engineers read every one.

Did this guide work for you?

Something on this page is outdated or wrong?

Frequently asked questions

Is Jitsi transcription free?

Vosk runs speech recognition locally without a per-minute API fee. You still pay for server resources, and model licenses and memory needs vary. Our larger English setup starts at 16 GB RAM; that is not a minimum for every Vosk model. External speech APIs have their own pricing and data handling.

Which languages does Vosk support?

Vosk has models for English and more than twenty other languages. The Docker image name selects the model, for example alphacep/kaldi-en for English. Each language needs its own Vosk server.

Where are Jitsi transcripts saved?

With the setup in this guide, Jigasi writes a .txt transcript per meeting to /config/transcripts inside the container, which maps to the transcripts folder under your CONFIG directory. A timer can upload them to S3 alongside recordings.

Why do I get service-unavailable when I start subtitles?

Check whether a transcriber is running, authenticated and configured for the meeting. SIP mode and incorrect passwords are possible causes in this setup, but the message alone does not identify the fault. Recreate affected containers after changing their Compose environment.

Discussion

    Stuck, or would rather not do this by hand?

    Deploy it in one click

    A private Jitsi server in your own AWS account with SSL, your domain and optional recording, transcription and JWT. Free 15 minute trial.

    Start free trial

    Talk to a Jitsi engineer

    Setup, fixes, branding, recording, scaling. Tell us what is happening and we reply with a plan and a quote.

    Get expert help

    Related

    Recently updated