Why do Vosk captions stop when several people speak in Jitsi?

Short answer

Older Jigasi builds can corrupt valid Vosk replies when participant sessions parse messages concurrently. Jigasi PR #647 fixes the shared parser, and Docker stable-11248 includes the fixed package, 1.1-415-g2750d54-1. Upgrade the running transcriber, then test captions from several speakers; restarting an older build does not install the fix. [S1][S2][S3][S9]

Symptoms

Some speakers lose captions during a meeting with several speakers. The report was reproduced on Docker stable-9955, using Jigasi 1.1-369-gb80d3df. These are the exact parsing lines from PR #647, including the valid JSON reply: [S1]

Text
SEVERE: VoskWebsocketStreamingSession.onMessage: Error parsing message: {
  "partial" : "the out for the ancient"
}
Unexpected character (") at position 29.

The report also includes these streaming-error fragments: [S1]

Text
SEVERE: VoskWebsocketStreamingSession.onError: Error while streaming audio data
        to transcription service
java.util.NoSuchElementException
  at VoskTranscriptionService.onMessageInternal(VoskTranscriptionService.java:286)

Your timestamp, text and source line number can differ. The useful clue is a parsing failure on a valid Vosk response while multiple participant sessions are active. Not every meeting with several people necessarily reproduces the race. [S1][S2]

Cause

Older VoskTranscriptionService code used one JSONParser for multiple participant sessions. Jetty can deliver their WebSocket callbacks concurrently. Each parse changes the parser’s internal state, so another callback can overwrite it mid-parse. Valid JSON can then fail, or results can contain another participant’s text, as the contributor’s stress test reported. [S1][S2]

The merged fix uses ThreadLocal<JSONParser> and calls jsonParser.get().parse(msg). This gives each callback thread its own parser. It is a Jigasi code fix, with no new Vosk model or configuration setting required. [S2]

PR #647 merged on September 11, 2026, as commit 2750d54. The official September 14 stable-11248 Jigasi image build installed 1.1-415-g2750d54-1 for both linux/amd64 and linux/arm64. The previous stable Docker release was stable-11146-2, published August 17, before the fix. stable-11248 is therefore the first stable Docker release containing it, and remained the latest when checked on October 12, 2026. [S1][S3][S4]

The Jitsi stable APT repository also offers 1.1-415-g2750d54-1. The web changelog records Jitsi Meet 2.0.11248, but does not list this Jigasi fix. The package index and image build logs establish the transcriber version directly. [S3][S5][S6]

Fix

  1. Docker, existing Vosk transcription installations: check the running service. Run this from your Docker deployment directory. The stock service is transcriber, using the Jigasi image. Include every overlay you normally deploy in the helper. If your custom setup runs transcription in a service named jigasi, use that name in the service-specific commands. [S7][S8]

    Terminal
    dc() {
        docker compose -f docker-compose.yml -f transcriber.yml "$@"
    }
    dc images transcriber
    dc exec -T transcriber dpkg-query -W -f='${Version}\n' jigasi
    dc logs --tail=200 transcriber

    Image inspection, execution and log options are documented by Docker; the package query reads the installed version inside the running container. Save the error context before replacing it. [S10][S11]

  2. Docker, upgrade to stable-11248: update the release files and images together. Follow the handbook’s updating section to replace the Compose files with those from the release. Keep your existing .env, credentials and configuration. When upgrading from before stable-11146, follow its rootless directory migration too, including writable storage directories for UID 1000. [S7]

    Set this existing image selector in .env: [S8]

    Config
    JITSI_IMAGE_VERSION=stable-11248

    Then run the helper from step 1 during a maintenance window: [S9][S10]

    Terminal
    dc config --images
    dc pull
    dc up -d
    dc images
    dc exec -T transcriber dpkg-query -W -f='${Version}\n' jigasi

    Check that every Jitsi component uses stable-11248. Your separate Vosk image has its own version. pull downloads images; up -d recreates services whose images or configuration changed. A restart of an old container alone does not replace its image. [S8][S9][S10]

  3. Debian/Ubuntu packages, Jigasi before the fix: upgrade Jigasi itself. These commands assume the official Jitsi stable APT repository is already configured. Check its candidate before installing. At the research date, the confirmed fixed candidate was 1.1-415-g2750d54-1. [S5][S12][S13]

    Terminal
    dpkg-query -W -f='${Version}\n' jigasi
    sudo apt-get update
    apt-cache policy jigasi
    sudo apt-get install --only-upgrade jigasi
    sudo systemctl restart jigasi
    dpkg-query -W -f='${Version}\n' jigasi
    systemctl is-active jigasi

    Use your normal package configuration review during the upgrade. The service is named jigasi; restarting it ensures the process loads the updated code. An OS release name alone does not establish which Jigasi build is running. [S11][S13][S14]

No confirmed configuration-only workaround was supplied in PR #647. Treat reducing simultaneous speakers or restarting old Jigasi as unverified mitigation, not a substitute for upgrading. Use the existing Vosk setup guide for backend configuration. [S1][S2]

Verify

For Docker after step 2, the installed-package command must print exactly this version for the build verified here. The same output applies to packages after step 3: [S3][S5][S11]

Text
1.1-415-g2750d54-1

On package installations, systemctl is-active jigasi should print active. That confirms service state, not successful captions. [S14]

For both install types, run a fresh test meeting on meet.example.com. Have several participants speak, including overlapping speech, and confirm captions continue for each person. Check that the reproduced test produces no new parsing or streaming errors shown above. This is a proposed functional test, not a load test performed by jitsi.help. The upstream contributor’s parser stress test was clean after the change. [S1][S2]

If it still fails

Docker stable-11248: follow the transcriber log while repeating the test: [S7][S10]

Terminal
dc logs --since=10m --follow transcriber

Debian/Ubuntu, fixed package: the upstream unit redirects application output to /var/log/jitsi/jigasi.log. Read that file for parsing errors; the journal is useful for service startup failures. Custom units can change logging, so inspect the actual unit if this file stays empty. [S15][S16][S17]

Terminal
sudo tail -n 200 /var/log/jitsi/jigasi.log
systemctl cat jigasi
sudo journalctl -u jigasi -n 100 --no-pager

Recheck every transcriber instance’s installed package. For a custom build, verify it contains commit 2750d54; a reassuring image name alone is insufficient evidence. In the released Vosk class, Error to send websocket request for participant and Error to finalize websocket connection for participant are distinct send/finalization log prefixes. Investigate those separately rather than treating every WebSocket error as this parser race. [S2][S11]

Use transcription not working for setup failures. If you need help gathering evidence across several instances, our transcription service covers that investigation.

FAQ

Does stable-11248 include the Vosk parser fix?

Yes. Its official Jigasi image build installed 1.1-415-g2750d54-1 on both supported build architectures. That package’s commit is the merged PR #647 fix. [S1][S3]

Does Unexpected character mean Vosk sent invalid JSON?

Not necessarily. The reported reply was valid JSON; concurrent callbacks corrupted the shared parser’s state. Genuine invalid responses still need investigation after installing the fix. [S1][S2]

Will restarting Jigasi solve it?

A restart does not add the missing code to an older container or package. Install the fixed build and recreate the container or restart the upgraded package service. [S2][S9][S14]

Is this the same as Jigasi running out of memory?

This page covers the parser race fixed by PR #647. The Jigasi memory troubleshooting page covers a separate investigation; this parser change does not establish that all resource or connection-lifecycle problems are fixed. [S2]

Sources

[S1] Jigasi PR #647, merged 2026-09-11, community production report and maintainer-approved repository fix.

[S2] Released VoskTranscriptionService.java, 2026-09-11, source code.

[S3] stable-11248 Jigasi image build, 2026-09-14, official repository build log; package installation verified through GitHub’s authenticated log download.

[S4] Docker releases, checked 2026-10-12, release notes.

[S5] Jitsi stable package index, checked 2026-10-12, official repository metadata.

[S6] Jitsi web changelog, 2026-09-14 release, release notes.

[S7] Docker handbook, checked 2026-10-12, official doc.

[S8] stable-11248 transcriber.yml, 2026-09-14 release, source code.

[S9] Docker pull and up, checked 2026-10-12, official docs.

[S10] Docker images, config, exec and logs, checked 2026-10-12, official docs.

[S11] dpkg-query, checked 2026-10-12, official Debian manual.

[S12] Debian/Ubuntu handbook, checked 2026-10-12, official doc.

[S13] apt-get and apt-cache, checked 2026-10-12, official Debian manuals.

[S14] systemctl, checked 2026-10-12, official Debian manual.

[S15] Jigasi package service unit, 2026-09-11, source code.

[S16] tail, checked 2026-10-12, official Debian manual.

[S17] journalctl, checked 2026-10-12, official Debian manual.

Open questions

We did not reproduce the concurrency failure or run a sustained multi-speaker test on a real server. PR #647 does not establish a failure probability or participant threshold. Independently built images need their own package/code verification. No reliable pre-upgrade workaround was confirmed. [S1][S2]

Written by the Jitsi Help engineering team

Jitsi infrastructure engineers who deploy and run Jitsi Meet servers in production. Last updated . How we write our guides

Did this fix it?

Something on this page is outdated or wrong?

Collect debug info

These commands gather what an engineer needs to diagnose a Jitsi server. Copy them, run them, and keep the output.

Terminal
# Run on the server, from your docker-jitsi-meet folder

# 1. Every service should be "running" (or "healthy")
docker compose ps

# 2. Which images and release tags are running
docker compose images

# 3. Recent logs from the core services
docker compose logs --tail=200 web prosody jicofo jvb

# 4. The settings most fixes depend on
grep -E '^(PUBLIC_URL|JVB_ADVERTISE_IPS|ENABLE_LETSENCRYPT|ENABLE_AUTH|AUTH_TYPE)=' .env

# 5. Is anything listening for media on UDP 10000?
sudo ss -ulnp | grep 10000

Installed with the Debian packages instead of Docker? Read the service logs with:

Terminal
sudo journalctl -u prosody -u jicofo -u jitsi-videobridge2 --since "1 hour ago"

Remove passwords, secrets and tokens before you share any output.

Send the output to an engineer

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