Real-time transcription

Daily's real-time transcription engine generates a live transcript (closed captions) during a meeting session. Additionally, the service gives you the ability to store the transcript to an S3 bucket in WebVTT format.

This guide will cover:

  • Starting transcription and listening to events transcription generation
  • Enabling domains & rooms for transcription storage (WebVTT)
  • Enabling custom buckets to store transcriptions

Start transcription

There are 3 ways to start transcription:

  1. During a Daily Call you can use the daily-js method - startTranscription();
  2. Transcriptions can be invoked using our REST API.
  3. You can invoke live transcriptions by creating a meeting token containing the auto_start_transcription property for any meeting owner. You can set the transcription configuration using the auto_transcription_settings.

Here is the list for the full set of transcription parameters.

Daily JS Example

Transcription can be started by calling the startTranscription() method. The event "transcription-started" is triggered once server starts the transcription process.

The transcriptId is returned in the transcription-started event, which can be used with /transcript REST APIs.

Example API return from the transcription-started event

Generated transcriptions are broadcasted to the call via "app-message".

Setting transcription permissions

In order to start transcribing a meeting using startTranscription(), the user must have the permission of canAdmin: 'transcription' set. Meeting owners always have this permission set; in fact, they have all admin privileges available. Non-owners can become transcription admins through two ways:

  • The user joins with a meeting token, where the permissions property is configured to include canAdmin: 'transcription'.
  • A meeting owner grants the transcription permission by calling updateParticipant() and setting the canAdmin: 'transcription' permission.

For example, if you want to add closed captions to your meeting and you want any user to initiate the captioning, you can either:

  • Configure the room to auto start the transcription. In this case, transcription will always be occurring.
  • Set all users with the transcription admin privilege via a meeting token, so any user can initiate the transcription. In this case, you can call startTranscription() so that transcription happens on demand.

Handling transcription messages

Transcription messages are emitted through an event called transcription-message. These events are emitted for all participants when a new transcription snippet is available.

Learn more about transcription-message here.

An alternative approach to handling transcription messages:

  • Transcription messages can also be received via the "app-message" event. Unlike transcription-message which just contains the transcription text, the app-message contains a data payload specifying more about the transcription state.
  • These transcription "app-message" events will have a fromId of "transcription".
  • By listening to "app-message" events emitted from the transcription service, text can be received and handled by your application.
    • It's helpful to also listen for the is_final attribute to receive only completed sentences instead of sentence fragments.

The properties that the data of a transcription "app-message" contains are as follows:

PropertyTypeDescription
is_finalbooleanWhether the event contains a completed sentence or a sentence fragment
session_idstringThe session ID of the participant being transcribed
textstringThe contents of the transcription
timestampstringTimestamp of transcription generation
user_idstringThe user ID of the participant being transcribed

Below is an example of listening and logging transcription messages in the browser console:

Enabling domains & rooms for transcription storage

This is an optional step and only required if you want to save the live transcript from your session into a file.

The default for enable_transcription_storage is false. Meaning, with enable_transcription_storage: false, transcripts are generated and broadcasted but not saved.

To save the transcript, set the enable_transcription_storage property to "true" at the room level or at domain level.

Enabling for a specific room

Enabling at the domain level

Enabling custom buckets to store transcriptions

By default, transcripts are stored in Daily's cloud storage. You can change where your transcripts are stored & managed through the transcription_bucket domain property.

This is similar to setting up your own custom S3 storage for recordings. See the full guide here.

Enabling a custom bucket for transcription