Skip to content
Jitsi.help

Free self-hosted Jitsi transcription with Jigasi and Vosk

Updated Tested on Jitsi Meet stable-11031By the Jitsi Help engineering team

Short answer

Run Jigasi in transcriber mode (JIGASI_MODE=transcriber), give it a transcriber password (JIGASI_TRANSCRIBER_PASSWORD) and restart Prosody so the user exists, add a Vosk server container, and point Jigasi at it with org.jitsi.jigasi.transcription.vosk.websocket_url in a mounted custom-sip-communicator.properties. The server needs 16 GB of RAM.

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.

What you need

  • A working Docker install on stable-11031 or later. See install Jitsi with Docker.
  • 16 GB of RAM. The Vosk English model is held in memory. On AWS that means a t3.xlarge or larger; an 8 GB c5.xlarge is too small.
  • 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):

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

Fix 2: set the transcriber password, then restart Prosody

In .env:

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

Without this value Jigasi logs in as transcriber@hidden.meet.jitsi with an empty password and Prosody answers SASLError SCRAM-SHA-1 not-authorized. Prosody creates the transcriber account when it starts, so restart Prosody after setting it, not only Jigasi.

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.

# 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

# 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

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 restart 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:

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.

Frequently asked questions

Is Jitsi transcription free?

With Vosk, yes. Vosk runs an open source speech model on your own server, so there is no per-minute fee and audio never leaves your infrastructure. The cost is a bigger server, 16 GB of RAM at minimum. Google Cloud Speech is the paid alternative with higher accuracy in more languages.

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?

Almost always because Jigasi is running as a SIP gateway instead of a transcriber, or because it cannot log in to Prosody. Set JIGASI_MODE=transcriber and JIGASI_TRANSCRIBER_PASSWORD, then restart Prosody and Jigasi.

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