Transcribe Your Zoom Meetings
This guide creates a Node.js service that captures audio from Zoom Real-Time Media Streams (RTMS) and provides both real-time and asynchronous transcription using AssemblyAI.
Zoom RTMS Documentation
For complete Zoom RTMS documentation, visit https://developers.zoom.us/docs/rtms/
Features
- Real-time Transcription: Live transcription during meetings using AssemblyAI’s streaming API
- Asynchronous Transcription: Complete post-meeting transcription with advanced features
- Flexible Audio Modes:
- Mixed stream (all participants combined)
- Individual participant streams transcribed
- Multichannel Audio Support: Separate channels for different participants
- Configurable Processing: Enable/disable real-time or async transcription independently
Setup
Prerequisites
- Node.js 16+
- FFmpeg installed on your system
- Zoom RTMS Developer Preview access
- AssemblyAI API key
- ngrok (for local development and testing)
Installation
- Clone the example repository and install dependencies:
- Configure environment variables:
Fill in your .env
file:
Local development with ngrok
For testing and development, you can use ngrok to expose your local server to the internet:
-
Install ngrok: Download from ngrok.com or install via package manager:
-
Start your local server:
-
In a separate terminal, start ngrok:
-
Copy the ngrok URL: ngrok will display a forwarding URL like:
-
Use the ngrok URL in your Zoom app webhook configuration:
Configuration options
Real-time transcription
REALTIME_ENABLED
: Enable/disable live transcription (default:true
)REALTIME_MODE
:mixed
: Single stream with all participants combinedindividual
: Separate streams per participant
Audio settings
AUDIO_CHANNELS
:mono
ormultichannel
AUDIO_SAMPLE_RATE
: Audio sample rate in Hz (default:16000
)TARGET_CHUNK_DURATION_MS
: Audio chunk duration for streaming (default:100
)
Async transcription
ASYNC_ENABLED
: Enable/disable post-meeting transcription (default:true
)
Usage
Start the service
The service will start on the configured port (default: 8080) and display:
Configure Zoom webhook
-
In your Zoom App configuration, set the webhook endpoint to:
-
Subscribe to these events:
meeting.rtms_started
meeting.rtms_stopped
Testing with ngrok
When using ngrok for testing:
- Keep ngrok running: The ngrok tunnel must remain active during testing
- Update webhook URL: If you restart ngrok, you’ll get a new URL that needs to be updated in your Zoom app configuration
- Monitor ngrok logs: ngrok shows incoming webhook requests in its terminal output
- Free tier limitations: The free ngrok tier has some limitations; consider upgrading for heavy testing
Real-time output
During meetings, you’ll see live transcription:
Post-meeting files
After each meeting, the service generates:
transcript_[meeting_uuid].json
- Full AssemblyAI response with metadatatranscript_[meeting_uuid].txt
- Plain text transcript
Advanced configuration
AssemblyAI features
Modify the ASYNC_CONFIG
object in the code to enable additional features:
See AssemblyAI’s API documentation for all available options.
Audio processing modes
Mixed mode (default)
- Single audio stream combining all participants
- Most efficient for general transcription
- Best for meetings with clear speakers
Individual mode
- Separate transcription stream per participant
- Better speaker attribution
- Higher resource usage
Multichannel audio
- Separate audio channels for different participants
- Enables advanced speaker separation
- Requires
AUDIO_CHANNELS=multichannel
API endpoints
POST
/webhook
Handles Zoom RTMS webhook events:
- URL validation
- Meeting start/stop events
- Automatic RTMS connection setup
Error handling
The service includes comprehensive error handling:
- Automatic reconnection for dropped connections
- Graceful cleanup on meeting end
- Audio buffer flushing to prevent data loss
- Temporary file cleanup
Monitoring
Real-time logs
- Connection status updates
- Audio processing statistics
- Transcription progress
- Error notifications
Example log output
Development workflow
- Start your local server:
npm start
- Start ngrok in another terminal:
ngrok http 8080
- Update your Zoom app webhook URL with the ngrok URL
- Test with Zoom meetings
- Monitor logs in both your app and ngrok terminals