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 withcanAdmin: '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
DestructurestartTranscription 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
BCP-47 language tag. Examples:
'en', 'es', 'fr', 'de', 'ja', 'pt-BR'. The available languages depend on the Deepgram model tier in use.Deepgram model name. Examples:
'nova-2', 'nova', 'enhanced', 'base'. Higher-tier models offer better accuracy at higher cost.Deepgram tier. Deprecated in favor of specifying
model directly, but still accepted for backwards compatibility.When
true, Deepgram replaces profane words with asterisks.Entities to redact from the transcript. Pass
true to redact all supported entities, or an array of entity type strings (e.g. ['pci', 'ssn']).Controls how long Deepgram waits for silence before ending an utterance. Pass a number (milliseconds) or
true/false to enable/disable.When
true, Deepgram adds punctuation to the transcript.Arbitrary key-value pairs forwarded directly to the Deepgram API. Use this to pass advanced Deepgram options not exposed directly.
When
true, each transcription message includes the full raw Deepgram response object in the rawResponse field of the event passed to onTranscriptionMessage.Identifier for this transcription instance. Required when running multiple simultaneous transcriptions.
Array of session IDs. When provided, only those participants’ audio is transcribed. Omit to transcribe everyone.
Language and model selection
Handling transcription messages
Pass anonTranscriptionMessage 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, useuseDaily to access the call object directly and call updateTranscription:
Array of session IDs to transcribe going forward. Pass an empty array to
transcribe all participants. This field is required.
The instance to update. Omit to update the default instance.
Stopping transcription
DestructurestopTranscription from useTranscription:
useDaily:
Events
Pass event callbacks directly touseTranscription. 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.
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