Skip to content
ChatterlayerDiscord captions for OBS

Free desktop app · Windows, macOS, Linux

Your viewers can see who said what.

Chatterlayer joins your Discord voice call, transcribes the people you switch on, and renders colour-coded captions into an OBS browser source. It runs on your own PC, it's free, and it always will be.

OBS · Browser sourceOn air

A preview of the overlay: each person in the call is captioned in their own colour as they speak. The default speech model punctuates and capitalises; an in-progress guess appears faded first, then the line is rewritten in place once it settles.

Background
transparent — your scene sits behind it
Caption delay
~150 ms
Live word-by-word
250–500 ms

The short version

Six things worth knowing before you download it.

Free
No paid tiers, no licence keys, no accounts, no API keys, no per-minute billing. MIT licensed — fork it, ship it, stream with it.
Runs on your PC
Speech recognition happens on your own machine. After the one-time model download Chatterlayer doesn’t need an internet connection to caption, and the caption server listens on 127.0.0.1 — your machine and nothing else — unless you deliberately turn on sharing. The only request it makes on its own is a once-a-day check for a new version, and that has a switch.
Sharing, if you want it
Everyone in a co-op stream can show the same captions without everyone running the app: one person turns on a share link, the rest paste it into OBS. It’s off by default, never starts on its own, and dies when you close the app. Audio still never leaves your machine — only the finished caption text goes out.
Nine speech models
Four speech engines, from a 40 MB model that keeps up with a seven-person call to a 2.5 GB one that gets close to a paid cloud service. The default punctuates and capitalises. Install several and switch between them without re-downloading.
Nobody by default
Everyone in the call starts switched off. You turn on the people who’ve agreed to it, and you can flip them in and out mid-call without reconnecting anything.
Just a browser source
The overlay is a normal OBS browser source with a transparent background. No plugins, no capture tricks. It reconnects on its own, so you can add it before the app is even running.

Why it exists

It started with one viewer.

A streamer I watch has a regular viewer who's deaf. When it's just the streamer talking, they can follow along. When the Discord call fills up and four people start talking over each other, they can't — and on a lot of streams, that's most of the stream.

There isn't much you can do about that from the viewer's side. Twitch doesn't caption anything on its own, and the tools that do usually only hear the streamer's own mic — not the four friends they're playing with. So the conversation everyone else is listening to simply isn't there.

Chatterlayer is a fix for that one specific thing. It turns out to be useful for other people too — anyone watching muted at work, or on a connection that's chewing up the audio, or just trying to keep up with a chaotic group call — but that isn't why it exists.

It won't make a stream accessible on its own and it won't catch every word. A rough caption with the right name on it still beats silence.

How it works

Audio comes in from the call. Text goes out to OBS.

  1. Discord

    A bot sits in your call

    Chatterlayer brings a bot into your voice channel and receives each person’s audio as its own stream. Everyone is transcribed separately, so two people talking at once never get spliced into one sentence.

  2. Your PC

    It transcribes locally

    Audio is decoded, resampled and handed to the speech engine on a dedicated worker thread. You pick the model — nine of them, across four engines — and it is loaded once and shared by everyone in the call, so a seventh speaker doesn’t mean a seventh copy of the weights.

  3. OBS

    Captions appear on stream

    Each line gets that speaker’s colour and goes out over a local WebSocket to the browser source. An in-progress guess appears faded first, then the line is rewritten in place when it settles — on Vosk that happens word by word as they’re spoken.

both stages run on your machine — the caption server only listens on 127.0.0.1, and after the model download it works with no internet at all

Choosing who gets captioned

Everyone in the voice channel appears as a strip you switch in or out of the mix, live, without reconnecting. Click a name in the app to change how it appears on stream — ruptz_45454 can show up as Ruptz — and click the swatch to override their colour.

Channels

0 on
Overlaynothing to show

Nobody is switched on, so the overlay stays empty. Switch someone on to see what your viewers would get.

Colours are worked out automatically from each person's Discord ID, so the same friend is the same colour every stream, on every machine — and no two people in a call ever share one, up to 16 people.

Setup

Five steps, once.

About ten minutes, most of which is waiting for a download. After this, Chatterlayer signs in by itself at launch and OBS remembers the source.

  1. Install Chatterlayer

    There’s a normal installer and a portable build if you’d rather not install anything. About ten minutes for the whole setup, most of it waiting for a download.

    Releases

    The builds aren’t code-signed, so Windows SmartScreen shows a blue box on first launch — More info → Run anyway. On macOS, right-click the app → Open, or run xattr -cr /Applications/Chatterlayer.app.

  2. Pick a speech model

    On first launch Chatterlayer asks which model to download. There are nine, across four speech engines, and they range from 40 MB to 2.5 GB — you only need one, which is why none are bundled. Pick Moonshine Base unless you have a reason not to; it’s the one the app offers by default.

    You can install several and switch between them in the Speech model dropdown without re-downloading anything. They live in your user data folder and survive app updates, and Remove frees the disk space again. Switching engines needs a reconnect.

  3. Create a Discord bot

    Chatterlayer needs a bot account to sit in your voice channel and listen. It’s free and takes about two minutes.

    • New Application → name it whatever you like → Bot tab → Add Bot.
    • Reset Token, then Copy. Treat it like a password.
    • Leave every Privileged Gateway Intent switched off — Chatterlayer doesn’t need them.
    • OAuth2 → URL Generator: scope bot, permissions View Channel and Connect. It never talks, so it doesn’t need Speak.
    • Open the generated URL and invite the bot to your server.

    Discord Developer Portal

  4. Paste the token and pick a channel

    Paste the bot token into the Source panel. It signs in, and the Server and Voice channel dropdowns fill with everywhere your bot can go. Pick one and hit Connect. There’s no channel ID to copy and no Developer Mode to turn on — channels your bot can’t join are greyed out with the missing permission named.

    Your token is stored encrypted in your operating system’s own keystore — DPAPI on Windows, Keychain on macOS, libsecret on Linux — so you only paste it once.

  5. Add the overlay to OBS

    Sources → + → Browser. Set the width and height to match your canvas, normally 1920 × 1080, and use the URL from Chatterlayer’s Output panel:

    http://127.0.0.1:8777/overlay
    • Tick Shutdown source when not visible and Refresh browser when scene becomes active.
    • Captions render bottom-left with a small margin, so leaving the source at full canvas size positioned at 0,0 usually just works.

    The overlay reconnects on its own, so you can add the source before Chatterlayer is running, and it survives you restarting the app mid-stream.

Once it's running

Closing hides it
Pressing × drops Chatterlayer to the system tray instead of ending the call, so a stray click can’t cut your captions mid-stream. Minimising behaves normally, Quit on the tray icon always means quit, and you can turn the whole behaviour off in App settings.
It tells you about new versions
The running version sits in the top-right of the control panel. Once a day Chatterlayer asks GitHub whether a newer release exists, and the stamp turns amber if there is one — clicking it opens the release page. Nothing downloads and nothing self-installs. It’s the only request the app makes on its own, which is why it’s a visible switch: Output → Check for updates.

Co-op streams

One person runs it. Everyone else gets a link.

When four people in the same call are all live, you don’t need four copies of Chatterlayer. It saves the others a bot, a speech model and the CPU to run it — and every stream shows the same captions, instead of four slightly different transcriptions of the same conversation.

This is off by default, and it never starts on its own. Chatterlayer is offline software and stays that way unless you deliberately do this, every time — the tunnel is closed again the next time the app starts, however you left the tick box.

  1. Tick the box

    Open Remote overlay and tick “Let other streamers use these captions”. Nothing has opened yet — this only reveals the controls.

  2. Start the tunnel

    The first time, Chatterlayer downloads cloudflared — about 35 MB, kept for next time. If you already have it on your PATH, that copy is used instead.

  3. Send the link

    Your co-streamers paste it into an OBS browser source, exactly like the local one. Press Stop tunnel, or just close Chatterlayer, and the link dies.

The link carries its own key

The ?k= on the end is an access key. Without a valid one the page returns 401 and the caption feed refuses the connection.

What a share link looks like
https://calm-river-quiet-1f4c.trycloudflare.com/overlay?k=Xk3pQ7rTvB2nL9wYzA4hMg

One link, one session. The key is generated fresh every time you press Start and only ever exists in memory — it’s never written to your config file. Stop the tunnel, or close the app, and it’s gone for good. There’s no old key sitting on disk, and last week’s link is dead twice over since the hostname was random too.

New access key mints a replacement mid-stream and immediately disconnects anyone using the old link — that’s the case it’s for, cutting someone off while you’re still live. Your own local OBS source is never affected by any of this and never needs a key.

Treat the link like a password: anyone you send it to can watch your voice channel’s captions for as long as the tunnel is up.

Key strength
128 bits from a cryptographic random source, as 22 URL-safe characters.
Comparison
Hashed, then compared in constant time, so a near-miss leaks nothing through timing.
Rate limiting
20 failed attempts per caller per minute, then a minute of 429s. Keyed on an address the caller can’t forge.
Connection cap
16 remote viewers at once. Your own OBS is never counted and never refused, so flooding the tunnel can’t cost you your own overlay.
Transport
The overlay refuses to open the caption feed if the page arrived over plain HTTP from anywhere but your machine, so the key is never on the wire in clear text.
Read-only
The feed is one-directional — there’s no handler for inbound messages at all. A link grants watching, never controlling.
Logging
The Log panel records the bare tunnel hostname and never the keyed link, so it’s safe to screenshot into a bug report.

The rate limiting is there to stop a scanner wasting your CPU mid-stream, not to stop key guessing — at 128 bits, guessing was never the realistic attack.

Each streamer sizes it for their own scene

Your sliders are the default for everyone, which is rarely what you want when one person has full-screen gameplay and another has a big face cam. Anyone can override the styling for their own browser source by adding parameters to the end of their copy of the link. These stick even when you move your sliders mid-stream, and they affect nobody else.

&size=42
Text size in px (8–200)
&hold=5
Seconds a caption stays up (0.5–120)
&lines=2
How many captions are visible at once (1–20)
&partials=0
Finished lines only — no live in-progress text
&names=0
Hide speaker names

Before you rely on it

  • The link changes every time you start the tunnel — the hostname is random — so your co-streamers re-paste after you restart Chatterlayer. Sort it out before you go live, not during.
  • Cloudflare makes no uptime promise for these free quick tunnels. They need no account and no domain, and that’s the trade.
  • Audio still never leaves your machine. What goes through the tunnel is the finished caption text — the same words already on your stream — and nothing else.
  • Changing the overlay port stops the tunnel, since the old link would point at nothing. Start it again for a new one.

The tunnel is cloudflared running one of Cloudflare's free quick tunnels — no account, no domain, nothing to configure.

How good are the captions, really?

Better to know now than to find out on stream.

Chatterlayer ships nine speech models across four engines — Vosk, Moonshine, Whisper and Parakeet — and every one of them runs entirely on your own machine.

That rules out the very best cloud models, but it no longer means what it used to. Moonshine, Whisper and Parakeet all land meaningfully closer to a paid service than Vosk does, and they punctuate.

  • Vosk gets roughly 85–92% of words right for a clear speaker on a decent mic in a quiet room, as a lowercase stream with no punctuation. Moonshine, Whisper and Parakeet all do better than that, and are much better on names.
  • Paid cloud services get 93–97% on the same audio, so there’s still a gap at the top. Parakeet on clear speech gets close to closing it.
  • Every engine degrades with background noise, music, strong accents and people talking over each other — the offline ones faster than the paid ones.
  • Game jargon, usernames and memes are hard for all of them. The vocabulary is fixed and can’t be nudged toward your community’s slang.
  • Mic quality matters more than model size. A friend on a bad headset is the weak link whichever model you run.
The same eleven-second clip of speech, through five of the nine models.

Parakeet TDT 0.6B

And so, my fellow Americans. Ask not. What your country can do for you. Ask what you can do for your country.

Moonshine Base

And so my fellow Americans. Ask not. What your country can do for you ask what you can do for your country

Whisper Tiny

And so am I fellow Americans. Ask, not! What your country can do for you, ask what you can do for your country.

Vosk Medium

and so my fellow american ask not what your country can do for you ask what you can do for your country

Vosk Small

and so my fellow americans as not what your country can do for you ask what you can do for your country

Where the small models slip: Whisper Tiny hears “am I” for “my”, Vosk Small hears “as not” for “ask not”, and Vosk Medium drops the plural on “Americans”.

Offline is still the right trade for this job: nothing to meter, nothing to expire mid-stream, your friends' voices never leave your machine, and no round-trip to a server to slow it down.

Which speech model should I pick?

Moonshine Base, unless you have a reason not to — it's the one the app offers by default. The reason you might: Vosk puts words on screen as they're spoken rather than a phrase at a time. That difference matters more than the model sizes do.

StreamingVosk
Vosk updates the caption word by word as someone talks, so text appears with essentially no delay. The trade is a lowercase stream with no punctuation, and each person needs their own recogniser, so memory grows with the number of people in the call.
A phrase at a timeMoonshine · Whisper · Parakeet
These wait for you to finish a thought, then return a properly punctuated, capitalised sentence a fraction of a second later. It reads like writing rather than a transcript, and one copy of the model serves everyone in the call.
ModelDownloadRAMCaption delaySpeakersPunctuation
Vosk Small40 MB170 MB + 12/speakerlive7no
Vosk Medium128 MB420 MB + 51/speakerlive7no
Vosk Large1.8 GB~5 GBlive4no
Vosk Gigaspeech2.3 GB6.8 GBlive3no
Moonshine Basepick this251 MB550 MB~150 ms6yes
Whisper Tiny43 MB420 MB~650 ms2yes
Whisper Base79 MB700 MB~1 s1yes
Whisper Small251 MB1.8 GB~2.2 s1yes
Parakeet TDT 0.6B2.5 GB2.6 GB~290 ms4yes

Measured on a Ryzen 5 5600X against real speech. RAM is the peak with one person captioned — on the three phrase-at-a-time engines each extra speaker costs about 3 MB, because the model is loaded once and shared, so Parakeet is 2.5 GB in total and not 2.5 GB per person. The speaker counts are a latency judgement rather than a memory one: how many people can be captioned before captions start arriving late. The app warns rather than refuses when you go over.

Moonshine Base
The default, and the right answer for most people. It beats Vosk Medium on every measured axis except immediacy: more accurate, punctuated and capitalised, a caption in about 150 ms, a tenth of the CPU per second of speech — and because one shared model serves the whole call, it uses less memory than Vosk Medium once more than three people are on.
Vosk Medium
The one to pick if you want text appearing as the words are spoken rather than at the end of each phrase. That immediacy is a real difference on stream, and it’s the only thing Vosk still wins on.
Parakeet TDT 0.6B
The most accurate here, and quicker than you’d expect at about 290 ms a caption — it transcribes the phrase rather than a padded window. The cost is a 2.5 GB download and ~2.6 GB of RAM, loaded once and shared however many people are on.
The Whisper models
Hard to recommend over Moonshine. Every Whisper caption pays for a padded 30-second window whatever the phrase length, so Tiny is slower than its size suggests and Base takes about a second while being less accurate than Moonshine. They’re here because Whisper is what people ask for by name — and Small is genuinely accurate for one person, if you don’t mind waiting two seconds.

Download

Free, and staying that way.

No tiers, no upsell, no “pro” version holding the good features hostage. Windows, macOS and Linux builds, plus a portable Windows build if you’d rather not install anything.

OS
Windows, macOS (Intel or Apple Silicon), or Linux
Disk
~350 MB for the app, plus the model you pick (40 MB – 2.5 GB), plus ~35 MB for cloudflared if you ever share captions
RAM
~570 MB for a 7-person call on the default model
Also
A free Discord bot, and any recent OBS

You don't need Node.js, a compiler, Python, a paid speech API, or an account with anyone. The builds aren't code-signed, so Windows SmartScreen warns on first launch and macOS may claim the app is damaged — the release notes explain how to get past both.

Support the project

Chatterlayer is free. It stays free.

No tiers, no licence keys, no upsell, no “pro” version holding the good features hostage. Nothing here is locked and nothing is going to be.

If it's earned you a coffee

One-off, any amount, no account needed. It goes to the person who writes this, and it's entirely optional — nothing in the app changes either way.

ko-fi.com/ruptz

Bug reports and feature ideas are worth more than the coffee. A stream where the captions broke, a model that misheard something badly, a setup step that read as gibberish — those are the things that actually make the next version better. Open an issue.

It's MIT licensed, so the other useful things you can do are star the repo so other streamers find it, or fork it and build something better.

There's a matching cup in the bottom corner of the app itself, if you'd rather find it there.