# Free self-hosted Jitsi transcription with Jigasi and Vosk

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

Source: https://jitsi.help/guides/jitsi-transcription-vosk/
Updated: September 26, 2026
Publisher: Jitsi Help (https://jitsi.help/)

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](/guides/install-jitsi-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):

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

## Fix 2: set the transcriber password, then restart Prosody

In `.env`:

```ini
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.

```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

```bash
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:

```bash
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](/troubleshooting/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](/services/jitsi-transcription/).

## 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.


---

Jitsi Help is an independent service. It is not affiliated with, endorsed by or sponsored by 8x8, Inc. or the Jitsi project. Jitsi and Jitsi Meet are trademarks of 8x8, Inc., used here only to describe the software we host and support.
