Skip to content

Live captions for your Discord call, straight into OBS.

ChatterLayer puts a bot in your Discord voice call, transcribes whoever you switch on, and draws their words into OBS in their own colour. Or skip the bot and caption just your mic. The speech never leaves your PC.

Runs on
Windows, macOS, Linux
Costs
Nothing. MIT licensed
Sends your audio
Nowhere
On air
A browser source in OBS, 1920 × 1080, transparent background. Faded text is the guess the model makes while someone is still talking.
01

The short version

Free
No tiers, no licence key, no account, no API key, nothing metered. It’s MIT licensed, so fork it and ship your own if you want to.
It runs on your PC
Your voices never leave the machine. ChatterLayer downloads a speech model once and does the listening itself, so after that it doesn’t need the internet to caption at all. The caption server answers on 127.0.0.1 and nowhere else, unless you deliberately switch sharing on. The app makes one request of its own accord, a version check at launch, and there’s a switch for that.
Sharing, if you want it
Co-streaming? One person runs the app and sends the others a link to paste into OBS, and everyone shows the same captions. It’s off until you turn it on, it never starts by itself, and it stops when you close the app. Only the finished text goes down the tunnel. The audio stays on your PC.
Nine speech models
Four engines, nine models, 40 MB to 2.5 GB. The small one keeps up with a seven-person call. The big one gets close to what you’d pay a cloud service for. Both of the recommended ones punctuate. Keep several installed and switch between them without downloading anything again.
Nobody by default
Everyone in the call starts switched off. You turn on the people who’ve said yes, and you can change that mid-call without reconnecting.
Light on your PC
It’s a 30 MB download and takes about 95 MB once installed. Waiting in the tray, it uses next to no CPU. While it captions, nearly all the work is the speech model, and since 0.5 that runs as native code: on Parakeet it uses about 15% less CPU than 0.4 did, and the first caption arrives about 4 seconds sooner.
It’s just a browser source
The overlay is an ordinary OBS browser source with a transparent background. No plugin, no window capture, nothing to configure. It reconnects on its own, so you can add it before the app is even open.
02

Why it exists

It started with one viewer.

A streamer I watch has a regular in chat who’s deaf. When it’s just the streamer talking, they can follow along fine. When the Discord call fills up and four people talk over each other, they can’t. On a lot of streams, that’s most of the stream.

There isn’t much you can do about that from where they’re sitting. Twitch doesn’t caption anything by itself, 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 just isn’t there.

ChatterLayer fixes that one thing. It turns out to be handy for other people as well, anyone watching on mute at work, or on a connection that’s mangling the audio, or trying to keep up with a call that has gone completely off the rails. But that isn’t why I built it.

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.

What to expect

This runs offline on your own PC, so it won’t match a paid cloud service. There are nine models to choose from, both of the recommended ones punctuate, and the best one gets close. The real numbers are further down.

03

How it works

Three hops, and the middle one is the only place your voices are ever decoded.

  1. Discord

    A bot sits in your call

    ChatterLayer brings a bot into your voice channel, and Discord hands it every person’s audio as a separate stream. Everyone gets transcribed on their own, so two people talking at once never get spliced into one sentence.

  2. Your PC

    Your PC does the listening

    Discord’s audio is decoded straight to the format the speech engine wants and handed to it on its own thread. You choose the model, nine of them across four engines. It loads once and serves the whole call, so a seventh person doesn’t mean a seventh copy of it sitting in memory.

  3. OBS

    Captions land on stream

    Every line goes out over a local WebSocket in that person’s colour. The phrase models show a faded guess first and rewrite the line once it settles. Vosk writes it word by word as they speak.

Your call, your mic, or both

Discord call

Everyone in the voice channel you switch on, through the bot.

My mic

Just you, straight from your microphone. No bot, no Discord sign-in, nothing leaves your PC.

Both

The call and your mic together. Mute in Discord or let go of push-to-talk to read chat out, and Discord hears nothing, so those words would go uncaptioned. Your mic still hears them.

In Both, press “This is me” on your own Discord row. Your mic captions you from then on, so you never appear twice.

Speech to pixels

Caption delay on the recommended models150–290 ms
Word by word, on Vosk Medium250–500 ms

Measured on a Ryzen 5 5600X.

04

Setup

About ten minutes, and most of that is a download bar.

  1. Install it

    On Windows there’s an installer, or a zip if you’d rather not install anything. Macs get a .dmg, and Linux an AppImage or a .deb. The whole setup runs about ten minutes, and most of that is watching a download bar.

    Get the download

    None of the builds are code-signed, so Windows SmartScreen throws up a blue box the first time you run it: click More info, then Run anyway. On macOS, Gatekeeper may call the app damaged; one Terminal command clears that, and it’s shown right after you download.

  2. Pick a speech model

    First launch asks which model to download. There are nine, across four engines, and they run from 40 MB to 2.5 GB. You only need one, which is why none of them ship with the app. ChatterLayer checks your RAM and CPU and marks the one that suits your machine: Parakeet TDT 0.6B if you have 16 GB or more, which most streaming PCs do, and Moonshine Base on lighter ones.

    Install as many as you like and switch between them in the dropdown without downloading anything again. They live in your user data folder and survive app updates, and Remove gives you the disk space back. Switching to a different engine needs a reconnect.

  3. Make a Discord bot

    The bot is the thing that sits in your voice channel and listens. Making one is free and takes about two minutes.

    • New Application, name it whatever you like, then the Bot tab and Add Bot.
    • Reset Token, then Copy. Treat it like a password.
    • Leave every Privileged Gateway Intent switched off. ChatterLayer doesn’t need them.

    Discord Developer Portal

    Only captioning your own mic? Skip this step and the next: pick My mic under Source and go straight to OBS.

  4. Paste the token, pick a channel

    Drop the bot token into the Source panel and it signs in on its own. Press Invite the bot to a server, pick your server in the browser tab that opens, and it shows up in the Server dropdown by itself. Choose a voice channel and hit Connect. There’s no channel ID to copy and no Developer Mode to turn on, and channels your bot can’t join are greyed out with the missing permission named.

    The token goes into your operating system’s own keystore, DPAPI on Windows, Keychain on macOS, libsecret on Linux, so you paste it once and never think about it again.

  5. Add the overlay to OBS

    Sources, then +, then Browser. Set the width and height to match your canvas, usually 1920 × 1080, and paste the URL from ChatterLayer’s Output panel:

    • Tick Shutdown source when not visible and Refresh browser when scene becomes active.
    • Captions sit bottom-left with a small margin, so a full-canvas source at 0,0 usually just works.

    The overlay reconnects by itself. You can add the source before ChatterLayer is running, and it will survive you restarting the app mid-stream.

Two things that surprise people

Closing hides it
The × 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 switch the whole behaviour off in App settings.
It tells you about new versions
The version you’re running sits in the top right of the control panel. Once per launch the app asks GitHub whether there’s a newer release, and that stamp turns amber if there is. Click it and the release page opens. Nothing downloads and nothing installs itself. It’s the only request the app makes on its own, which is why it gets a visible switch: Output, then Check for updates.

Stuck on any of it? Open an issue and say where it went wrong. There’s no support queue and no forum — it’s one person reading them.

05

Sharing with co-streamers

Off until you switch it on. It never starts by itself, and it stops when you close the app.

In a co-op stream, only one person needs to run ChatterLayer. They turn on a share link and everyone else pastes it into a browser source, so the whole lineup shows the same captions with the same colours.

  1. Tick the box

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

  2. Start the tunnel

    The first time, ChatterLayer fetches cloudflared, about 35 MB, and keeps it for next time. If you already have it on your PATH, it uses that copy instead.

  3. Send the link

    Your co-streamers paste it into a browser source, exactly like the local one. Press Stop tunnel, or just close ChatterLayer, and the link stops working.

What your co-streamers get

https://calm-river-quiet-1f4c.trycloudflare.com/overlay?k=Xk3pQ7rTvB2nL9wYzA4hMg

That one is dead. The hostname is random per tunnel and the key is minted fresh every time you start it.

What stands between that link and someone who wasn’t sent it

Key strength
128 bits from a cryptographic random source, written as 22 URL-safe characters.
Comparison
Hashed, then compared in constant time, so a near miss gives nothing away 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 only goes one way. There’s no handler for inbound messages at all, so a link lets someone watch and never control.
Logging
The Log panel records the bare tunnel hostname and never the keyed link, so it’s safe to screenshot into a bug report.

Everyone sizes it for their own scene

Add these to the end of the URL. They change how the overlay draws on that machine only, so nobody has to match anyone else’s canvas.

&size=42
Text size in px (8–200)
&hold=5
Seconds a caption stays up (0.5–120)
&lines=2
How many captions show at once (1–20)
&partials=0
Finished lines only, no live guesses
&names=0
Hide speaker names
  • The link changes every time you start the tunnel, because the hostname is random, so your co-streamers have to re-paste it after you restart ChatterLayer. Sort that 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.
  • The 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.
06

Nine models, four engines

You need exactly one. The app marks the one that fits your PC, and you can change your mind later.

Word by wordVosk
Vosk updates the caption as each word is spoken, so text appears with almost no delay. The trade is a lowercase stream with no punctuation, and every person needs their own recogniser, so memory grows with the size of the call.
A phrase at a timeMoonshine, Whisper, Parakeet
These wait for someone to finish a thought, then hand back a punctuated, capitalised sentence a fraction of a second later. It reads like writing rather than a transcript, and one copy of the model serves everybody in the call.
Every speech model ChatterLayer can download, with its size, memory use, caption delay and how many simultaneous speakers it keeps up with.
ModelDownloadRAMDelaySpeakersPunctuation
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 BaseBest pick under 16 GB of RAM251 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.6BBest pick on 16 GB and up2.5 GB2.6 GB~290 ms4Yes

Measured on a Ryzen 5 5600X against real speech. Speakers is the point at which captions start arriving late, not a hard limit. Vosk Large and Gigaspeech are extrapolated from model size.

Parakeet TDT 0.6B
The one to pick if your PC has 16 GB of RAM or more, which covers most streaming machines and not just the expensive ones. It’s the most accurate model here by a distance and still quick, about 290 ms a caption, because it transcribes the phrase itself rather than a padded window. The cost is a 2.5 GB download and around 2.6 GB of RAM, loaded once no matter how many people are on.
Moonshine Base
The one to pick on lighter machines, like an 8 GB laptop. It beats Vosk Medium everywhere except immediacy: more accurate, punctuated, capitalised, a caption in about 150 ms and 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 talking.
Vosk Medium
Pick this if you want text appearing as the words are spoken instead of at the end of each phrase. That immediacy reads very differently on stream, and it’s the one thing Vosk still wins 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 the name people ask for, and because Small is genuinely accurate for one person if you don’t mind waiting two seconds.

The same clip, five ways

The same eleven seconds 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”.

What you should expect

  • 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 they’re 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 gets worse with background noise, music, strong accents and people talking over each other. The offline ones get worse faster.
  • Game jargon, usernames and memes are hard for all of them. The vocabulary is fixed and there’s no way to nudge it towards 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.
07

Get it

An installer, or a zip if you'd rather not install anything.

The builds aren’t code-signed, because certificates cost money this project isn’t spending. Windows will show a SmartScreen warning the first time: More info, then Run anyway. On macOS the app can clear Gatekeeper’s quarantine flag for you.

There’s a Ko-fi, if you want one

ChatterLayer is free and it stays free. Nothing is held back, nothing is gated, and there’s no pro version coming. If it earned its keep on your stream, you can throw something at ko-fi.com/ruptz.

OS
Windows, macOS (Intel or Apple Silicon), or Linux
Disk
~350 MB for the app, plus the model you pick (40 MB to 2.5 GB), plus ~35 MB for cloudflared if you ever share captions
RAM
~2.6 GB on Parakeet, or ~570 MB for a seven-person call on Moonshine Base
Also
Any recent OBS, plus a free Discord bot to caption a call (not needed for your mic alone)