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-11031reference. 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):
# jigasi-override.yml
services:
jigasi:
environment:
- JIGASI_MODE=transcriber
- JIGASI_TRANSCRIBER_PASSWORDFix 2: set the transcriber password, then restart Prosody
In .env:
ENABLE_TRANSCRIPTIONS=1
JIGASI_TRANSCRIBER_PASSWORD=a-long-random-passwordAn 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.
# 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=trueAdd the Vosk server
# vosk.yml
services:
vosk:
image: alphacep/kaldi-en:latest
restart: unless-stopped
networks:
- meet.jitsiIt 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 up -d --force-recreate prosody jigasiTest it
- Join a meeting and open the menu, then Subtitles (or Start transcription in some releases).
- Speak a sentence. Captions should appear within a second or two.
- Leave the meeting and check
config/transcriptsfor a new.txtfile 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 voskA 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.