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-11031or 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
- 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 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.