Jitsi meeting transcription: when a self-hosted deployment needs live captions
Jitsi meeting transcription on a self-hosted deployment uses the bridge-based transcription service. The older Jigasi transcription path is deprecated: the Jitsi handbook states that it will be removed in a future release, so a new deployment should start on the bridge-based path. This matters for compliance planning as well as engineering, because a deployment built on a path scheduled for removal will need a second change window later. If you already run Jigasi for transcription, schedule the move now and confirm the removal timing in the handbook and the release notes for the version you run.
Teams usually need live transcription for three reasons. Compliance teams may need a written record of what was said in certain meetings, such as customer calls, board sessions or clinical consultations, and they must decide whether the transcript is the official record or only a working copy. Accessibility is the second driver: participants who are deaf or hard of hearing can follow the discussion through captions as people speak. The third is searchable notes, where a transcript lets people find a decision or a quote after the meeting. Before you enable anything, write down which of these you are meeting, because each one sets different retention, access and review requirements for the transcript data.
Enabling transcription changes the deployment in three ways. First, it adds a service. The reference transcription service, opus-transcriber-proxy, is a Node.js application configured through environment variables. It listens on port 8080 and exposes a /transcribe WebSocket endpoint, so it needs its own host or container, process supervision, TLS handling, monitoring and firewall rules that allow the videobridge to reach it. Second, it adds a speech-to-text backend. Third, audio leaves the videobridge. Each participant's Opus audio is forwarded over a WebSocket to the transcription service, which relays it to a provider such as OpenAI, Deepgram, Google Gemini or xAI, and the results stream back into the conference. Your data flow diagram and network policy need to show this outbound path, since the videobridge's in-memory routing model does not describe it.
Before you choose a backend, settle four points with your own team. Map where the transcription service runs and which network segment the videobridge can reach over that WebSocket connection. Ask each provider for its written terms on data retention, use of audio for model training and processing location, and check those terms against your legal and privacy requirements. Decide who may read transcripts, how long they are kept and where they are stored, since a transcript can be a more sensitive record than the audio it came from. Finally, confirm which backend options your Jitsi release supports, using the handbook page for bridge-based transcription as the source for the current provider list and the custom provider setting.
Which transcription path fits your Jitsi deployment
This table compares the three ways to add transcription to a self-hosted Jitsi deployment, based on where the audio is processed, which situations each path suits and what your team must confirm before choosing. Read each row as a decision point. The bridge-based paths are the route for new deployments, and legacy Jigasi transcription is deprecated and will be removed in a future release.
| Path | Where the audio is processed | When it fits | What the team must confirm |
|---|---|---|---|
| Bridge-based, hosted provider | Audio leaves your network for OpenAI, Deepgram, Google Gemini or xAI after the transcription service relays it. | Teams that accept a third-party processor for meeting audio and want a managed speech-to-text service. | Provider data processing terms, retention period, processing region, and whether your agreement covers meeting content. |
| Bridge-based, self-hosted OpenAI-compatible endpoint | Audio goes from the transcription service to an endpoint you run, such as an in-house speech model, inside your infrastructure. | Organizations that must keep meeting audio inside their own environment and can run a speech model with an OpenAI-compatible API. | Language and accuracy on your audio, capacity for concurrent meetings, network reachability, and that the custom provider setting is enabled as documented. |
| Legacy Jigasi transcription | Jigasi processes the audio itself, sending it to the Google Cloud backend or to a local Vosk or Whisper backend, depending on configuration. | Only existing deployments that cannot yet move, as a short-term step before the bridge-based path. | The removal release for your version, which backend your configuration uses, where it sends audio, and your migration date. |
| Moving off Jigasi | Audio processing moves to the bridge-based service and to the provider or endpoint you choose. | Any deployment running Jigasi transcription today, scheduled before removal in a future release. | Test transcripts on your own meetings, the replacement provider or endpoint, and retirement of Jigasi settings and containers. |
How the bridge-based transcription path routes audio
The bridge-based path starts at the videobridge, which already carries each participant's media. The bridge forwards each participant's Opus audio over a WebSocket to a transcription service. That service relays the audio to the speech provider you configured, which the Jitsi handbook lists as OpenAI, Deepgram, Google Gemini or xAI, and streams the results back into the conference. Before you design the network, confirm this path with your team, because each hop is a connection you must secure, monitor and document. The bridge is the sender in this design, so audio does not need to pass through a SIP gateway the way it does on the deprecated Jigasi path.
The reference transcription service is opus-transcriber-proxy, a Node.js application configured through environment variables. It listens on port 8080 and exposes a /transcribe WebSocket endpoint, which is the address the videobridge connects to. Provider credentials and options are set in the environment of that process, so they belong in your deployment tooling and secrets store, not in a shared configuration file. Confirm the exact variable names, defaults and transport settings against the Jitsi handbook transcription page and the proxy's own documentation for the version you deploy, since the handbook is the source for how the service is wired into the bridge.
The network consequences follow directly from that data path. The rule that matters most is between the videobridge host and the proxy host on the proxy's listening port, which is 8080 by default. Browser traffic does not change: participants still reach the web server on 80/TCP and 443/TCP and media on 10000/UDP, as the Debian and Ubuntu quick start describes. The proxy then makes outbound connections to the provider's API, so you need an egress rule for those destinations. Decide where the proxy runs, on the bridge host, on a separate virtual machine, or in a Docker network alongside the other containers. Co-location means fewer internal firewall rules. A separate host lets you restrict egress and scale transcription independently, but it adds a hop to monitor.
If you use a self-hosted model, the egress model changes. Enabling ENABLE_OPENAI_CUSTOM_PROVIDER lets the service use any OpenAI-compatible transcription API, including an in-house model, so the proxy's outbound traffic goes to your inference host instead of a public provider. That can keep audio inside your network, but it moves capacity planning, model quality and availability onto your team. Ask the vendor or model owner for the request format and expected concurrency, and test with a sample conference. Before go-live, draw each hop on one diagram, list every port and destination, confirm which outbound addresses your chosen provider needs, and record who owns each component.
Setting up Jitsi meeting transcription on the bridge-based path
This sequence adds live transcription to a working Jitsi Meet deployment by connecting the videobridge to a transcription service over WebSocket. The result is a service that receives each participant's audio and streams text back into the conference. Each step closes with a check you can run before moving on.
Confirm the base Jitsi Meet deployment
Before adding anything, confirm that the web app loads over HTTPS with a certificate issued for your domain, because the Jitsi handbook says working audio and video depend on it. Check that 80/TCP, 443/TCP and 10000/UDP are open between clients and the server, and that the host runs a supported release such as Debian 12 or Ubuntu 24.04 with OpenJDK 17. Done when a test meeting between two browsers carries audio and video without certificate warnings.
Provision the transcription service host
Choose a host for the transcription service and confirm that the videobridge can reach it over the network. The reference service, opus-transcriber-proxy, is a Node.js application, so the host needs a supported Node.js runtime. Check the runtime version requirement in the service's own repository before installing. Done when the bridge host can open a TCP connection to the service host on port 8080.
Install and start the transcription service
Install opus-transcriber-proxy on that host and run it under a process manager so it restarts after a reboot. The service listens on port 8080 and exposes a /transcribe WebSocket endpoint, which is the address the bridge will call. Done when the service starts without errors in its logs and a WebSocket test client on the bridge host completes a handshake with the /transcribe endpoint.
Set environment variables for the provider
Set the service's environment variables for your chosen speech-to-text provider, which can be OpenAI, Deepgram, Google Gemini or xAI. Confirm the exact variable names in the Jitsi handbook for your version. Keep provider credentials in your secrets store and out of shared configuration files. Done when the startup logs show the selected provider and report no credential or configuration errors.
Enable the custom provider for an OpenAI-compatible endpoint
If you run a self-hosted model behind an OpenAI-compatible transcription API, set ENABLE_OPENAI_CUSTOM_PROVIDER as the handbook describes and point the service at your endpoint using the variables the handbook documents for that purpose. Test the endpoint from the service host first, and confirm it accepts the request format the service sends. Done when a short test audio clip returns text and your endpoint's own logs record the request.
Wire the videobridge to the transcription service
Configure the videobridge to forward each participant's Opus audio to the transcription service's WebSocket address, and confirm the configuration keys and address format for your release in the handbook. Turn off the deprecated Jigasi transcription path so that only one transcription route is active. Restart the bridge and review its logs. Done when the bridge logs show a successful WebSocket connection to port 8080.
Verify transcription in a test meeting
Join a test meeting with at least two participants, start transcription through the meeting interface, and speak a short known phrase. Confirm that text appears in the conference, then review the service logs for requests to the chosen backend and the bridge logs for dropped WebSocket connections. Repeat the test after a bridge restart. Done when the phrase appears in the transcript, the backend logs show the requests, and the second test also produces text.
Moving off deprecated Jigasi transcription
The Jitsi handbook marks Jigasi transcription as deprecated, says it will be removed in a future release, and directs new deployments to the bridge-based transcription path. If your self-hosted Jitsi Meet still uses Jigasi for transcription, plan the move now, while the legacy setup still works and you have time to compare results. Treat the migration as a controlled change with a test phase, a cutover date and a rollback plan, not as a configuration tweak you make during an incident. The handbook's own wording on removal timing is the authority here, so check it again before you set your schedule.
Start with an inventory. In the official Docker setup, jigasi runs as its own container that acts as a SIP gateway, and the older transcription option is carried in that same container and configured through the .env file. List every transcription-related variable in your .env, the speech-to-text backend each one points to, the credentials and API keys it uses, and any configuration files or volume mounts attached to the jigasi container. Then record what the container does besides transcription. If you use SIP dial-in, that function has to survive the migration, so it must be documented separately. Finally, ask the people who use transcripts which outputs they rely on, such as language settings, speaker labels, export formats or stored transcript files. Confirm each feature against the current handbook, because variable names and defaults can change between releases.
Next, run both paths in a test environment that mirrors production as closely as you can. Keep Jigasi transcription on in one test copy and enable the bridge-based service, configured as described in the transcription guidance, in another. Use the same test meetings with the same participants, microphones, languages and accents, and compare the output side by side. Score word accuracy against a reference transcript that you write yourself, and also check latency, speaker attribution, punctuation, behavior during silence and the handling of overlapping speakers. Do not assume the two paths will match. Write down every difference, decide which ones matter to your users, and record which Jigasi features you need to confirm are supported on the new path before you commit to a cutover.
When the test results are acceptable, schedule a cutover window and change the transcription settings in .env on the production stack. Keep copies of the previous .env file and the container images so you can roll back quickly if the new path fails. Verify transcripts in a small pilot group before opening the change to all users. If the jigasi container still handles SIP dial-in, keep it running but disable its transcription setting, and confirm that dial-in still works after the change. Once the new path has run stably for a period you define in your own operations policy, remove the legacy transcription variables, delete the backend credentials for services you no longer use, rotate any shared keys, and update runbooks and monitoring so they no longer reference the old path.
Protecting audio and transcripts when transcription is enabled
Turning on transcription changes where audio and text travel. Jitsi protects media on the network, but the transcription path hands decrypted audio to a separate service and a speech provider, so each hop needs its own controls. The cards below cover the points to design and verify before the first meeting is transcribed.
Audio in transit between components
The videobridge decrypts participant audio in memory and forwards Opus audio over a WebSocket to the transcription service. That link carries unencrypted media from the bridge's point of view, so the team must decide how it is protected. Confirm whether the WebSocket uses TLS, keep the bridge and transcription service on a private network segment, and check that the outbound call to the speech provider also uses encrypted transport end to end.
Provider data handling and retention
The transcription service can relay audio to OpenAI, Deepgram, Google Gemini or xAI, and each provider has its own terms on data use, logging and retention. Ask each provider in writing how audio and transcripts are stored, how long they are kept, whether they are used for model training, and where processing happens. If a self-hosted OpenAI-compatible endpoint is used instead, the same questions apply to the team's own storage and backups.
Access control on the transcription endpoint
The reference transcription service listens on port 8080 and exposes a /transcribe WebSocket endpoint. Any client that can reach that endpoint could submit audio or receive transcripts, so network rules should admit only the videobridge hosts. Confirm whether the service authenticates connections, and test from an unapproved host that the endpoint refuses traffic before transcription goes live.
Secrets in environment variables
The transcription service is configured through environment variables, and provider API keys are typically set this way. Values in environment settings can appear in container definitions, process listings, support bundles and deployment logs. Store keys in the organization's secrets manager or an orchestrator secret object, restrict who can read deployment configuration, and plan a rotation procedure for each provider key.
Logging of transcript text
Transcript text is sensitive because it can contain names, medical details, legal matters or other regulated information. Application logs, reverse proxy logs and monitoring tools may record payloads or error messages that include words spoken in the meeting. Set log levels deliberately, confirm what the service writes on errors, redact or exclude transcript fields from centralized logging, and define how long any retained logs are kept.
End-to-end encrypted meetings
Jitsi's end-to-end encryption is documented for audio, video and screen sharing in supported clients, and the default DTLS-SRTP protection is separate from it. The facts available for this page do not establish whether a meeting with end-to-end encryption can send audio to the bridge-based transcription service. Confirm this with the Jitsi project and in a test deployment before promising transcription for any end-to-end encrypted meeting.
Choosing a speech-to-text backend for data control and quality
The main decision is where meeting audio goes for transcription. In the bridge-based path, the videobridge forwards each participant's Opus audio over a WebSocket to a transcription service, which relays it to a speech-to-text provider and streams results back into the conference. The reference service, opus-transcriber-proxy, can send audio to OpenAI, Deepgram, Google Gemini or xAI. Those hosted options move recordings of your meetings to a third party outside your infrastructure. The alternative is to set ENABLE_OPENAI_CUSTOM_PROVIDER so the service calls an OpenAI-compatible transcription API that you run, such as an in-house self-hosted model. That keeps audio inside your boundary, but it moves model operation to your team.
Several drivers should be settled before anyone compares accuracy. First, confirm with legal and privacy counsel whether your contracts, data protection obligations or sector rules allow audio to leave your environment, and whether hosted providers may retain or use it for training under their terms. Second, check language coverage for the languages your staff and clients actually speak. Third, weigh the capacity a self-hosted model needs, which depends on the model you choose, the number of concurrent meetings and whether it runs on GPU or CPU; ask the model vendor for sizing guidance rather than assuming. Fourth, measure latency, since captions that trail the speaker by a long delay lose their value. Finally, decide who operates the model, including patching, monitoring, scaling and what happens to transcription when the endpoint is unavailable.
Accuracy has to be tested on your own meetings, not on vendor demonstrations. Record a set of internal meetings with consent, covering the accents of your staff, your product names, acronyms, client and project terms, and typical background noise. Run the same recordings through each candidate backend and compare the transcripts. Score word accuracy where you can, and have reviewers check how well the key terms and names are captured, since those are what readers search for later. Measure end-to-end delay from speech to caption on the same network path your users take. Store these test recordings under the same access and retention controls you would apply to live meeting audio.
Before committing to a self-hosted endpoint, confirm its API compatibility with the Jitsi handbook's transcription documentation. Check the request format, the endpoint path, how authentication is passed, the shape of the response and whether partial results are supported, because the bridge-based service expects a specific interaction pattern. Confirm which settings the proxy passes through to the endpoint and which it ignores. Do not choose the deprecated Jigasi transcription path for a new deployment, because the Jitsi handbook says it will be removed in a future release and that new deployments should use the bridge-based path. Ask for the compatibility check, the test results and the operating runbook in writing before you fix the backend.
What to confirm before you enable transcription
Transcription depends on choices that the Jitsi handbook and your own environment settle, not on defaults you can assume. The cards below list what to confirm against the handbook, your chosen provider and your pilot results before you enable transcription for live meetings.
Supported transcription providers
The bridge-based service forwards each participant's audio to a provider that the Jitsi handbook lists. That list changes over time, so copy it from the handbook on the day you plan the build, not from an earlier design note. Confirm that each provider you intend to use is listed, that its contract and data terms cover meeting audio, and that its endpoint is reachable from your transcription host. If you plan to use a self-hosted OpenAI-compatible endpoint, confirm that the handbook's custom provider setting applies to your release.
Release and container layout
The bridge-based service must exist in the Jitsi release you run, and Jigasi transcription is deprecated and scheduled for removal. Compare your build, container names and .env variables with the handbook steps before editing anything. Docker deployments have run rootless with read-only filesystems since stable-11146, so paths for configuration, logs and custom files may differ from older guides. Record any mapping in your runbook so that an upgrade does not silently drop transcription.
Supported languages
Language coverage depends on the speech-to-text backend, not on Jitsi itself. Ask each provider, or read your self-hosted model's documentation, which languages and dialects it handles well and whether it detects language automatically or needs a fixed setting per meeting. Then test with recordings from your own participants, including accented speech, overlapping voices and domain terms such as product names or clinical vocabulary. Write down which languages are out of scope for the pilot.
Transcript latency under concurrent load
Transcript delay accumulates across the videobridge forwarding audio, the WebSocket hop to the transcription service, the provider's processing time and the return path into the conference. Measure the time from spoken words to transcript display at realistic numbers of concurrent meetings and participants per meeting. Latency that is acceptable for one meeting can degrade when many streams share one transcription host or when the provider queues requests. Ask the provider for its rate limits and concurrency terms in writing.
Provider outage behavior
Decide what participants see when the provider is slow or unreachable: whether the meeting continues without transcripts, whether the interface shows an error, and whether missing audio is retried or lost. Test this during a live pilot meeting by blocking the egress path to the provider, then confirm that audio, video and screen sharing keep working. Also confirm how the transcription service logs failures, so operators can alert on them before participants report gaps.
Capacity beyond the sizing guide
The Jitsi scalable setup guide suggests a 4 CPU, 8 GB machine for the central server and 4 or 8 CPU with 8 GB RAM for each videobridge, and it describes adding videobridges to scale out. Treat those figures as a starting point for conferencing alone. Transcription adds CPU load on the transcription service, network traffic per participant and charges from your provider. Pilot with your expected participant counts and measure CPU, network use and provider charges per participant before you choose a final size.
Questions teams ask before adding Jitsi transcription
What drives the cost of adding Jitsi transcription?
Cost comes from several separate components, and only some of them recur. Provider usage fees are charged by the speech-to-text service you choose, such as OpenAI, Deepgram, Google Gemini or xAI, and they grow with the amount of audio transcribed. If you run an in-house OpenAI-compatible model, the hardware that serves it is another cost, along with its power, cooling and maintenance. Service setup covers the transcription host, configuration, certificates and connection to your Jitsi Meet, and is usually one-time. Testing happens before launch, while ongoing operations, including updates to the transcription service and monitoring, recur. Ask any quote to list each component separately, state which party holds each provider account, and mark each item as one-time or recurring.
How long does adding Jitsi transcription take to implement?
No duration can be fixed until the inputs are known, and the schedule depends mainly on four things. The first is whether your Jitsi Meet deployment is already running and healthy. The second is whether you use a hosted provider or a self-hosted model, since the model adds hardware and load testing. The third is how quickly your own teams approve provider accounts, network changes and certificates. The fourth is testing, which must cover browsers, multi-participant meetings and failure behavior when the provider is unavailable. If you currently run Jigasi transcription, a migration step adds to that schedule. Ask for the work to be split into phases with named dependencies and a written acceptance step.
Can our engineers add Jitsi transcription using only the handbook?
A capable team can follow the Jitsi handbook's bridge-based transcription documentation, but the work involves more decisions than the configuration steps alone. The handbook covers the reference transcription service and the option to use an OpenAI-compatible endpoint, while your team still has to choose the provider, size the host, set access rules, test failure handling and keep the service updated after launch. Teams new to Jitsi operations often find that the surrounding pieces, such as HTTPS certificates, port planning and bridge configuration, take the most time. If nobody on your team has capacity to own the service after go-live, a fixed-scope engagement can cover the build and handover, with ongoing support available as a retainer.
What does our team need to provide for transcription work?
Plan to provide five things. First, a running Jitsi Meet deployment that your users already join, because transcription attaches to conferences on the videobridge. Second, valid HTTPS certificates for the public domain, since the Jitsi handbook says self-signed certificates cause problems for audio and video, especially on mobile clients. Third, a host for the transcription service with network access from the videobridge and outbound access to the provider you choose. Fourth, provider accounts with each speech-to-text service you plan to use, with keys issued to your organization. Fifth, test meetings with staff who can judge transcript accuracy, speaker handling and language settings. Confirm early who approves each account and who owns the host after launch.
Does self-hosted speech-to-text need its own GPU server?
It depends on the model you run, so confirm hardware requirements with the model's own documentation and test with your audio. The transcription service can call any OpenAI-compatible transcription API, which makes an in-house model an option when you want audio to stay within infrastructure you control. The model's hardware, which may include accelerators, memory, storage and redundancy, is a separate cost from the transcription host that relays audio to it. Capacity depends on how many meetings and participants you expect to transcribe at the same time, so load tests should use your busiest meeting patterns. Ask for the sizing assumptions in any quote and for the test results that support them.
How does the Jigasi migration change the transcription timeline?
The migration adds a step before your transcription can move to the newer path. The Jitsi handbook states that Jigasi transcription is deprecated and will be removed in a future release, and that new deployments should use the bridge-based path. If you already run Jigasi transcription, first inventory its current configuration, including the speech provider, language settings and how it is deployed alongside any SIP dial-in use, since dial-in is a separate Jigasi function. Then run the bridge-based path in parallel, test it with your meetings and cut over with a rollback step. The handbook does not name the removal release, so confirm the timing against the release notes for the version you run.
Does transcription change how we handle meeting data and privacy?
Yes. With transcription enabled, the videobridge forwards each participant's Opus audio to the transcription service, which relays it to the provider you configured, so audio and transcripts leave your Jitsi host for that path. Jitsi's default protection of audio and video, DTLS-SRTP, still applies between clients and the bridge, but transcription creates a separate processing path that needs its own review. Check each provider's data handling and retention terms, decide where transcripts are stored and who can read them, and record those decisions for your privacy and compliance reviewers. DeployOpen prepares systems, controls and evidence for compliance assessments, but independent auditors and certification bodies issue the audit reports and certifications.
What should a written quote for Jitsi transcription include?
A quote should follow from a written scope and show each cost and effort item on its own line. Ask for the in-scope components, such as the transcription service setup, configuration of the bridge-based path, the chosen provider integration, HTTPS and network checks, and the test plan. Require a separate line for each cost you will pay: provider usage fees, which you pay directly to the provider, any hardware for a self-hosted model, setup effort, testing and handover, and ongoing operations. Ask which items are one-time and which recur, what the provider accounts require from your side, what the Jigasi migration adds, and which acceptance tests close the fixed-scope work. DeployOpen does not publish a price list, so the quote is the source of the figures.
How DeployOpen scopes and delivers Jitsi transcription
DeployOpen scopes Jitsi transcription as a fixed-scope piece of work on your own Jitsi deployment, starting from how your meetings run and where speech data may be processed. The work moves from choosing the speech-to-text backend to a tested bridge-based service, documented operations and an agreed support arrangement.
How we scope
- Confirm whether you need the bridge-based transcription path or are migrating from deprecated Jigasi transcription
- Record which speech-to-text backend is approved, including any self-hosted OpenAI-compatible endpoint you operate
- Agree in writing the deployment hosts, network paths, certificates and test meetings covered by the fixed scope
How we build
- Deploy the transcription service and connect it to the videobridge over WebSocket on your own infrastructure
- Configure backend credentials and endpoint settings through environment variables, keeping secrets out of configuration files
- Test transcription across multi-participant meetings, language settings and failure cases, then record the results
How we hand over
- Provide written runbooks covering configuration, backend switching, service restarts and log locations
- Document the data flow of participant audio to each chosen backend so your privacy and compliance team can review it
- Walk your operations team through monitoring, troubleshooting and the steps to retire any legacy Jigasi transcription
How we support
- Ongoing support, upgrades and testing are available as a retainer after handover
- Retainers can cover tracking Jitsi and transcription service releases and planning upgrade windows with your team
- Confirm during scoping what response expectations and access arrangements your organization needs before work starts

