Home/Products/Real-time audio and transcripts

Real-time meeting audio and transcripts over WebSocket

Real-time meeting audio reaches your server over a WebSocket while people are still talking. One API call puts a bot in a Zoom, Meet or Teams call, 200 milliseconds behind the room.

48 kHz PCM16 mono~200 ms behind the roomSpeaker ID on every frameZoom, Meet, Teams

What real-time meeting audio means

Most meeting APIs work after the call: the bot leaves, artefacts land, you fetch them.

Real-time means the bot forwards the room's audio to your WebSocket while people are still talking, so your product can respond during the call.

MeetingBotin the call/audio socketPCM16 and speakerYour serverSTT, agent, coachingControl socketsendaudio, sendchat
Audio flows one way to you; the control channel lets your server talk back through the bot.

The audio transport, byte by byte

A handshake firstShort JSON, naming the botThen binary framesOne frame, one messageSpeaker on every frameID and display namePCM16 at 48 kHzMono, little-endian
What arrives on the audio socket, in the order it arrives.

Give the bot a WebSocket URL when you create it, and it connects to your endpoint as it joins. Every message after the handshake is binary:

One binary message is one frame.0x01typelenu16 LEspeaker_idUTF-8lenu16 LEspeaker_nameUTF-8PCM16 LE samples48 kHz monoread in order, no delimiters
Each binary message is one frame: read the two-byte length, take exactly that many bytes, repeat, and the rest is audio.
PropertyValue
EncodingSigned 16-bit PCM, little-endian
Sample rate48,000 Hz
ChannelsMono
Frame sizeUsually 1,000 to 50,000 samples, based on platform buffering
AcknowledgementFire and forget
CloseCode 1000 when the bot leaves the meeting
Forward compatibilityOnly type 0x01 is defined; check byte 0 and skip unknown types
Open the audio channelbash
curl -X POST https://api.meetstream.ai/api/v1/bots/create_bot \
  -H "Authorization: Token $MEETSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_link": "https://meet.google.com/abc-defg-hij",
    "bot_name": "Live Assistant",
    "live_audio_required": { "websocket_url": "wss://your-server.example.com/audio" },
    "callback_url": "https://your-server.example.com/meetstream"
  }'

Decode it in twenty lines

API PLAYGROUNDThe MeetStream API Playground with the bot builder open
Set the meeting link and the streaming options in the API Playground, then send the request.
Decode a frame (Python)Real-time audio streaming guide: request, response and options in the docs

The streaming guide has the same decoder in Node, Go and Java. It adds WAV writing and a 48 kHz to 16 kHz resampler, which is what most speech services want.

Can I stream one participant's audio?

Every frame carries a speaker ID and a display name, straight from the platform.

ZoomSDK node IDsGoogle MeetParticipant IDsMicrosoft TeamsThe dominant speaker
Where the name on each frame comes from.

That is enough to caption a call, to know who asked a question, and to feed a speaker-aware voice agent.

The live stream carries the meeting's mixed audio, and overlapping speech goes to whoever the platform reports as dominant.

Full isolation arrives after the call. Turn on separate streams and you get one WebM file per participant, fully isolated on Zoom.

Products that want both run the live stream in the call and the per-participant files for the record.

Lifecycle

Live transcripts to your webhook

If you want text rather than audio, pick a streaming engine and MeetStream connects it for you.

SentenceThe default chunkWordFor low-latency captionsRawWhatever the engine emits
Chunks are POSTed to your webhook during the call, not pushed over the audio socket.
EngineModelChunk modesNotes
Deepgram Streamingnova-2sentence (default), word, rawword mode for low-latency captions
AssemblyAI Streaminguniversal-streaming-englishraw (default), sentenceEnglish
Live transcript chunks to your webhookWebhooks and events guide: request, response and options in the docs

A streaming engine delivers its whole transcript live. For a stored final transcript, run the recording through a post-call engine afterwards.

The transcription integration lists all six engines. For your own speech model, take the raw audio channel instead.

The control channel: speak, post, interrupt

Give the bot a second WebSocket URL and it opens a control connection, then waits for JSON commands.

Play audioThrough the bot micPost a messageInto the meeting chatPost as a roleAssistant or userInterruptClear the playback queueShow an imageOn the video tileSend text inStraight to the agent
Six commands travel the control channel, so an interrupt goes out while audio frames stream.
CommandKey fields
Play audioBase64 PCM16 little-endian, mono, at 48 kHz
Post a messageThe message text
Post as a roleAssistant or user, the text, and a final flag
InterruptClears the queue on Google Meet, and is accepted on Zoom and Teams
Show an imageBase64 image data, or a URL

Chunk long audio into half-second to two-second pieces and pace it below real time.

A MIA voice agent runs the whole loop for you, and the control-pattern docs carry the command names.

Platform notes

ZoomGoogle MeetMicrosoft Teams
Live audioMixed, dominant speaker taggedMixed, dominant speaker taggedMixed, dominant speaker tagged
Speaker ID sourceSDK node IDParticipant IDDominant speaker name
Post-call per-participant audioFull isolation, one raw stream per participantSpeaker-attributed, up to 3 concurrentSpeaker-attributed
Control interruptAcceptedClears the queueAccepted
ZoomA Marketplace app once,then OBF per userGoogle MeetReady to goMicrosoft TeamsReady to go
What each platform asks for before your first streaming bot.

Each platform's admission rules and capture details live on the Zoom, Google Meet and Teams pages.

FAQ

Frequently asked questions

What arrives on the real-time audio WebSocket?

Binary frames: a type byte, the speaker ID and display name with their lengths in front, then signed 16-bit PCM at 48 kHz, mono, little-endian. The first message is a short JSON handshake naming the bot.

Is the live audio per participant?

The live stream carries the meeting's mixed audio. Each frame names the dominant speaker at capture time. Separate audio and video per participant land after the call, and the media endpoints hand them straight to you.

How far behind the room is it?

Roughly 200 milliseconds from the meeting to your socket. Frames usually hold 1,000 to 50,000 samples, depending on platform buffering.

How do I get live transcripts rather than audio?

Pick Deepgram Streaming or AssemblyAI Streaming when you create the bot, and give it a webhook URL. Text chunks then reach that webhook during the call. Streaming engines deliver the whole transcript live, so run the recording through a post-call engine when you also want one stored.

Can the bot speak or act, not just listen?

Yes. Open the control channel with a second WebSocket URL and send JSON commands to play audio, post a chat message, show an image, or interrupt the playback queue. Or attach a MIA agent and let MeetStream run the loop.

Do I need to acknowledge frames?

Frames are fire and forget, and the connection closes with code 1000 when the bot leaves. Check the first byte and skip unknown types to stay forward compatible.

Which platforms?

Zoom, Google Meet and Microsoft Teams, same frame format on all three. Speaker IDs are platform-native: Meet participant IDs, Zoom SDK node IDs, Teams dominant-speaker names.

What does it cost?

Real-time audio is part of the bot-hour: $0.35 per hour, $0.45 with MeetStream transcription, toward $0.25 at volume. Use your own Deepgram or AssemblyAI key for streaming and the add-on is waived.

Stream your first meeting today

$5 of free credit, one API call with a WebSocket URL, and the room's audio is on your server.