Skip to main content
Paid plans only Daily’s transcription feature streams speech-to-text output to all participants in a call. It is powered by Deepgram and supports a wide range of languages, models, and configuration options. In Daily React, the useTranscription hook gives you reactive state and helper functions for managing transcription — without writing manual event listener boilerplate.

Transcription permissions

Only meeting owners and participants with canAdmin: 'transcription' can start or stop transcription. The permission can be granted via a meeting token at join time or dynamically via updateParticipant() during the call. See the Permissions guide for the full details. Use usePermissions to gate your transcription controls on the local participant’s permission:

Starting transcription

Destructure startTranscription from useTranscription and call it when you are ready to begin:
startTranscription is a thin wrapper around the daily-js startTranscription() method, so it accepts the same DailyTranscriptionDeepgramOptions object described below.

Start Options

DailyTranscriptionDeepgramOptions
language
string
default:"'en'"
BCP-47 language tag. Examples: 'en', 'es', 'fr', 'de', 'ja', 'pt-BR'. The available languages depend on the Deepgram model tier in use.
model
string
Deepgram model name. Examples: 'nova-2', 'nova', 'enhanced', 'base'. Higher-tier models offer better accuracy at higher cost.
tier
string
deprecated
Deepgram tier. Deprecated in favor of specifying model directly, but still accepted for backwards compatibility.
profanity_filter
boolean
When true, Deepgram replaces profane words with asterisks.
redact
Array<string> | Array<boolean> | boolean
Entities to redact from the transcript. Pass true to redact all supported entities, or an array of entity type strings (e.g. ['pci', 'ssn']).
endpointing
number | boolean
Controls how long Deepgram waits for silence before ending an utterance. Pass a number (milliseconds) or true/false to enable/disable.
punctuate
boolean
When true, Deepgram adds punctuation to the transcript.
extra
Record<string, any>
Arbitrary key-value pairs forwarded directly to the Deepgram API. Use this to pass advanced Deepgram options not exposed directly.
includeRawResponse
boolean
When true, each transcription message includes the full raw Deepgram response object in the rawResponse field of the event passed to onTranscriptionMessage.
instanceId
string
Identifier for this transcription instance. Required when running multiple simultaneous transcriptions.
participants
string[]
Array of session IDs. When provided, only those participants’ audio is transcribed. Omit to transcribe everyone.

Language and model selection

Check out Deepgram’s language support documentation for the model/language combination that works best for your use case.

Handling transcription messages

Pass an onTranscriptionMessage callback to useTranscription to receive transcript segments in real time. This is the React equivalent of listening to the transcription-message event on the call object.

Message Format

DailyEventObjectTranscriptionMessage

Updating transcription

To change which participants are being transcribed while transcription is already running, use useDaily to access the call object directly and call updateTranscription:
participants
string[]
required
Array of session IDs to transcribe going forward. Pass an empty array to transcribe all participants. This field is required.
instanceId
string
The instance to update. Omit to update the default instance.

Stopping transcription

Destructure stopTranscription from useTranscription:
To stop a named instance, pass the call object directly via useDaily:

Events

Pass event callbacks directly to useTranscription. The hook handles subscribing and unsubscribing automatically as your component mounts and unmounts.

onTranscriptionStarted

Called for all participants when transcription begins. Use it to show a “live captions” indicator in your UI. The event object mirrors DailyEventObjectTranscriptionStarted and includes fields such as language, model, startedBy, and instanceId.

onTranscriptionStopped

Called for all participants when transcription ends. Use it to hide the captions UI and clear any status text.

onTranscriptionError

Called when the transcription service encounters an error. The event includes instanceId and errorMsg.
You can pass all callbacks together in a single useTranscription call:

Complete example

1

Set up useTranscription with callbacks

2

Display captions from onTranscriptionMessage

3

Show status from onTranscriptionStarted/Stopped

4

Start/stop button