Skip to content
Cloudflare Docs

Transcription

RealtimeKit provides two transcription modes powered by Cloudflare Workers AI:

ModeModelUse Case
Real-timeDeepgram Nova-3Live captions during meeting
Post-meetingWhisper Large v3 TurboAccurate offline transcription

Real-time transcription

Streams transcripts to participants as they speak using Deepgram Nova-3 via Cloudflare AI Gateway.

Enable via preset

Set transcription_enabled: true in the participant's preset:

{
"name": "webinar_host",
"transcription_enabled": true
}

Only participants with this flag will have their audio transcribed.

Configure

Pass ai_config.transcription when creating a meeting:

{
"title": "Team Standup",
"ai_config": {
"transcription": {
"language": "en-US",
"keywords": ["RealtimeKit", "Cloudflare"],
"profanity_filter": false
}
}
}
OptionTypeDefaultDescription
languagestringen-USLanguage code for transcription
keywordsstring[][]Terms to boost recognition (names, jargon)
profanity_filterbooleanfalseFilter offensive language

Supported languages

Supports all languages available in Deepgram Nova-3

Consume transcripts

Client SDK

JavaScript
// Get all transcripts
const transcripts = meeting.ai.transcripts;
// Listen for new transcripts
meeting.ai.on("transcript", (data) => {
if (data.isPartialTranscript) {
// Interim result - speaker still talking
updateLiveCaption(data.peerId, data.transcript);
} else {
// Final result
appendToHistory(data);
}
});

Transcript payload

{
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "Alice",
"peerId": "4f5g6h7i-8j9k-0lmn-opqr-1234567890st",
"userId": "uvwxyz-1234-5678-90ab-cdefghijklmn",
"customParticipantId": "abc123xyz",
"transcript": "Hello everyone",
"isPartialTranscript": false,
"date": "2024-08-07T10:15:30.000Z"
}
FieldDescription
isPartialTranscripttrue = interim (still speaking), false = final
peerIdChanges if participant rejoins
userIdPersistent participant ID
customParticipantIdYour custom ID from Add Participant API

Post-meeting transcription

Generates transcripts after the meeting ends using Whisper Large v3 Turbo. Transcripts from all participants are consolidated into a unified timeline and delivered via webhook or REST API.

Supported languages

Supports all languages in Whisper Large v3 Turbo. Uses ISO 639-1 language codes.

Output formats

FormatUse Case
CSVSpreadsheets, data analysis
SRTVideo subtitle files
VTTWeb video captions (<track> element)
JSONProgrammatic access

CSV example

Timestamp,Participant ID,User ID,Custom Participant ID,Participant Name,Transcript
2024-08-07T10:15:30.000Z,peer-123,user-456,cust-789,Alice,Hello everyone
2024-08-07T10:15:35.000Z,peer-234,user-567,cust-890,Bob,Hi Alice

JSON example

[
{
"startTime": 0,
"endTime": 2.5,
"sentence": "Hello everyone",
"peerData": {
"id": "peer-123",
"userId": "user-456",
"displayName": "Alice",
"cpi": "cust-789"
}
}
]

Fetch transcripts

Webhook

Configure meeting.transcript event in webhooks:

{
"event": "meeting.transcript",
"meetingId": "meeting-123",
"sessionId": "session-456",
"transcriptDownloadUrl": "https://...",
"transcriptDownloadUrlExpiry": "2024-08-14T10:15:30.000Z"
}

REST API

Refer to Fetch the complete transcript for a session.

Terminal window
curl -X GET "https://api.cloudflare.com/client/v4/accounts/{account_id}/realtime/kit/{app_id}/sessions/{session_id}/transcript" \
-H "Authorization: Bearer {api_token}"

Transcripts are available for 7 days after meeting ends.