# Real-time Transcriptions for Video

> \[!IMPORTANT]
>
> The information in this document could change. Twilio might add or update features before the product becomes Generally Available. Beta products don't have a Service Level Agreement (SLA). Learn more about [beta product support](https://help.twilio.com/articles/115002413087-Twilio-Beta-product-support). During the Public Beta, Twilio doesn't charge you to use Real-Time Transcriptions. When the feature becomes Generally Available, usage charges apply. The rate is similar to that of [Streaming Transcription for Programmable Voice](https://www.twilio.com/en-us/voice/pricing/us).

> \[!WARNING]
>
> Real-Time Transcriptions uses artificial intelligence or machine learning technologies. By enabling or using any of the features or functionalities within Twilio Video that are identified as using artificial intelligence or machine learning technology, you acknowledge and agree that your use of these features or functionalities is subject to the terms of the [Predictive and Generative AI/ML Features Addendum](https://www.twilio.com/en-us/legal/ai-terms/predictive-generative-ai-features).

## Overview

Real-Time Transcriptions converts speech from any participant in a Video Room into text and sends that text to the Video Client SDKs (JavaScript, iOS, and Android). Your application can render the text in any style and format. Twilio supports multiple speech models and you can choose the model that best fits your use case.

Your app can implement transcriptions in two ways:

* Start automatically when your app creates a Video Room.
* Start, stop, or restart on demand while the Room is active.

You enable Real-Time Transcriptions at the Video Room level, so every participant is transcribed. You configure the spoken language and speech model, and the settings remain in effect until the Room ends. You can also set a default configuration in the Twilio Console.

When transcription is active, Twilio delivers the transcribed text, along with the Participant `SID`, to every participant in the Room.

If you enable partial results, the transcription engine delivers interim results so that your app can refresh the UI in near real time.

## REST APIs

### Transcription resource

Transcription is a subresource of the Room resource that represents a Room's transcript. The resource URI is:

`/v1/Rooms/{RoomNameOrSid}/Transcriptions/{TranscriptionTtid}`

| Property        | Type                 | Description                                                                                                                                                                                                                                                        |
| --------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ttid`          | `ttid`               | The Twilio Type ID of the Transcription resource. It is assigned at creation time using the following format: `video_transcriptions_{uuidv7-special-encoded}`.                                                                                                     |
| `room_sid`      | `SID<RM>`            | The ID of the room instance parent to the Transcription resource.                                                                                                                                                                                                  |
| `account_sid`   | `SID<AC>`            | The account ID that owns the Transcription resource.                                                                                                                                                                                                               |
| `status`        | `enum<string>`       | The status of the Transcription resource. It can be: `started`, `stopped` or `failed`. The resource is created with status `started` by default.                                                                                                                   |
| `configuration` | `object<string-map>` | Key value map with configuration parameters applied to audio tracks transcriptions. The following body parameters are supported: `PartialResults`, `LanguageCode`, `TranscriptionEngine`, `ProfanityFilter`, `SpeechModel`, `Hints`, `EnableAutomaticPunctuation`. |
| `date_created`  | `string<date-time>`  | The date and time in GMT when the resource was created, specified in ISO 8601 format.                                                                                                                                                                              |
| `date_updated`  | `string<date-time>`  | The date and time in GMT when the resource was last updated, specified in ISO 8601 format. Null if the resource hasn’t been updated since creation.                                                                                                                |
| `start_time`    | `string<date-time>`  | The date and time in GMT when the resource was in state `started` and the first participant joined the Room, specified in ISO 8601 format.                                                                                                                         |
| `end_time`      | `string<date-time>`  | The date and time in GMT when transcription processing has paused in the Room, specified in ISO 8601 format. This happens when the resource is set to `stopped` or the last participant has left the Room.                                                         |
| `duration`      | `integer`            | The cumulative time in seconds that the transcripion resource has been in state `started` and at least one participant is in the Room. This is independent of whether audio tracks are published or audio tracks are muted.                                        |
| `url`           | `string<uri>`        | The absolute URL of the resource.                                                                                                                                                                                                                                  |

The Transcription resource transitions to status `failed` if an internal error is detected that prevents the transcriptions from being generated. The Twilio Console receives a debug event with the details of the failure. The resource can't be restarted once a failure is detected.

### Transcription `configuration` properties

| Name                         | Type    | Optional or Required | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ---------------------------- | ------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transcriptionEngine`        | string  | Optional             | Definition of the transcription engine to be used, among those supported by Twilio. Default is `"google"`.                                                                                                                                                                                                                                                                                                                                                                             |
| `speechModel`                | string  | Optional             | Recognition model used by the transcription engine, among those supported by the provider. Defaults to Google's `"telephony"`.                                                                                                                                                                                                                                                                                                                                                         |
| `languageCode`               | string  | Optional             | Language code used by the transcription engine, specified in BCP-47 format. Default is `"en-US"`. This attribute is useful for ensuring that the transcription engine correctly understands and processes the spoken language.                                                                                                                                                                                                                                                         |
| `partialResults`             | boolean | Optional             | Indicates whether to send partial results. Default is `false`. When enabled, the transcription engine sends interim results as the transcription progresses, providing more immediate feedback before the final result is available.                                                                                                                                                                                                                                                   |
| `profanityFilter`            | boolean | Optional             | Indicates if the server will attempt to filter out profanities, replacing all but the initial character in each filtered word with asterisks. Google [feature](https://cloud.google.com/speech-to-text/v2/docs/profanity-filter). Default is `true`.                                                                                                                                                                                                                                   |
| `hints`                      | string  | Optional             | This field may contain a list of words or phrases that the transcription provider can expect to encounter during a transcription. Using the `hints` attribute can improve the transcription provider's recognition of words or phrases that are expected during the video call. Up to 500 words or phrases can be provided in the list of hints, each entry separated with a comma. Each word or phrase may be up to 100 characters each. Separate each word in a phrase with a space. |
| `enableAutomaticPunctuation` | boolean | Optional             | The provider will add punctuation to the transcribed text. Default is `true`. When enabled, the transcription engine will automatically insert punctuation marks such as periods, commas, and question marks, improving the readability of the transcribed text.                                                                                                                                                                                                                       |

### Transcription engines and speech models

The following table lists the possible values for the `transcriptionEngine` and the associated `speechModel` properties.

| Transcription engine | Speech model                                                                                  | Description                                                                                                                                                                                                                                                                                           |
| -------------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `google`             | [`telephony`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)            | Use this model for audio that originated from an audio phone call, typically recorded at an 8 kHz sampling rate.                                                                                                                                                                                      |
| `google`             | [`medical_conversation`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model) | Use this model for conversations between a medical provider, for example, a doctor or nurse, and a patient.                                                                                                                                                                                           |
| `google`             | [`long`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)                 | Use this model for any type of long form content, such as media or spontaneous speech and conversations. Consider using this model instead of the `video` or the `default` model, especially if they aren't available in your target language.                                                        |
| `google`             | [`short`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)                | Use this model for short utterances that are a few seconds in length. It is useful for trying to capture commands or other single-short directed speech use cases. Consider using this model instead of the command and search model.                                                                 |
| `google`             | [`telephony_short`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)      | Dedicated version of the `telephony` model for short or even single-word utterances for audio that originated from a phone call, typically recorded at an 8 kHz sampling rate. Useful for utterances only a few seconds long in customer service, teleconferencing, and automated kiosk applications. |
| `google`             | [`medical_dictation`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)    | Use this model to transcribe notes dictated by a medical professional, for example, a doctor dictating notes about a patient's blood test results.                                                                                                                                                    |
| `google`             | [`chirp_2`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)              | Use the next generation of our Universal large Speech Model (USM) powered by our large language model technology for streaming and batch, and transcriptions and translations in diverse linguistic content and multilingual capabilities.                                                            |
| `google`             | [`chirp_telephony`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)      | Universal large Speech Model (USM) fine-tuned for audio that originated from a phone call (typically recorded at an 8 kHz sampling rate).                                                                                                                                                             |
| `google`             | [`chirp`](https://cloud.google.com/speech-to-text/v2/docs/transcription-model)                | Use our Universal large Speech Model (USM), for state-of-the-art non-streaming transcriptions in diverse linguistic content and multilingual capabilities.                                                                                                                                            |
| `deepgram`           | [`nova-2`](https://developers.deepgram.com/docs/models-languages-overview)                    | Recommended for most use cases.                                                                                                                                                                                                                                                                       |

**Notes**:

* The `google` transcription engine corresponds to the Google Speech-to-Text V2 API.
* Not all languages are available on all speech models. For valid combinations, see the following provider documentation:
  * [Google Speech-to-Text V2 supported languages](https://cloud.google.com/speech-to-text/v2/docs/speech-to-text-supported-languages)
  * [Deepgram Nova 2 supported languages](https://developers.deepgram.com/docs/models-languages-overview#nova-2)

### Create a Room with transcriptions enabled

To create a Video Room with Real-Time Transcriptions automatically enabled, add the following two parameters to the [Room `POST`](https://www.twilio.com/docs/video/api/rooms-resource#post-parameters) request:

| Parameter                         | Type    | Description                                                                                                                                                               |
| --------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TranscribeParticipantsOnConnect` | boolean | Whether to start real-time transcriptions when `Participants` connect. Default is `false`.                                                                                |
| `TranscriptionsConfiguration`     | object  | Key-value configuration settings for the transcription engine. For more information see [Transcriptio configuration properties](#transcription-configuration-properties). |

To automatically enable transcriptions on the Video Room, set the `TranscribeParticipantsOnConnect` parameter to `true`.

**Example**:

```bash
curl -X POST "https://video.twilio.com/v1/Rooms" \\--data-urlencode 'TranscriptionsConfiguration={"languageCode": "EN-us", "partialResults": true}' \\--data-urlencode "TranscribeParticipantsOnConnect=true" \\-u $API_Key_Sid:$API_Key_Secret
```

**Response**:

```json
{
  "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "audio_only": false,
  "date_created": "2025-06-12T15:42:32Z",
  "date_updated": "2025-06-12T15:42:32Z",
  "duration": null,
  "empty_room_timeout": 5,
  "enable_turn": true,
  "end_time": null,
  "large_room": false,
  "links": {
    "participants": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Participants",
    "recording_rules": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/RecordingRules",
    "recordings": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Recordings",
    "transcriptions": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions"
  },
  "max_concurrent_published_tracks": 170,
  "max_participant_duration": 14400,
  "max_participants": 50,
  "media_region": "us1",
  "record_participants_on_connect": false,
  "sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "status": "in-progress",
  "status_callback": null,
  "status_callback_method": "POST",
  "type": "group",
  "unique_name": "test",
  "unused_room_timeout": 5,
  "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "video_codecs": [
    "VP8",
    "H264"
  ]
}
```

### Start transcriptions on an existing Room

Create a Transcription with a `POST` request to the resource URI:

`/v1/Rooms/{RoomNameOrSid}/Transcriptions`

Path parameters

| Parameter | Type      | Description                                                            |
| --------- | --------- | ---------------------------------------------------------------------- |
| `RoomSid` | `SID<RM>` | The ID of the parent room where the Transcription resource is created. |

Request body parameters

| Parameter       | Type                 | Description                                                                                                                                 |
| --------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `Configuration` | `object<string-map>` | Object with key-value configurations. See property `configuration` of the Transcription resource above for a description of supported keys. |

**Example**:

```bash
curl -X POST "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions" \
--data-urlencode 'Configuration={"languageCode": "EN-us", "partialResults": true, "profanityFilter": true, "speechModel": "long"}' \
-u $API_Key_Sid:$API_Key_Secret
```

**Response**:

```json
{
  "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "configuration": {
    "languageCode": "EN-us",
    "partialResults": "true",
    "profanityFilter": "true",
    "speechModel": "long"
  },
  "date_created": "2025-07-22T14:14:35Z",
  "date_updated": null,
  "duration": null,
  "end_time": null,
  "room_sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "start_time": null,
  "status": "started",
  "ttid": "video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

### Stop transcription on a Room

Update a Transcription resource with a `POST` request to the resource instance URI:

`/v1/Rooms/{RoomSid}/Transcriptions/{ttid}`

To stop transcriptions on a Room, set the `Status` to `stopped`.

Path parameters

| Parameter | Type      | Description                                                                                                                                                             |
| --------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ttid`    | `ttid`    | The TTID of the Transcription resource being updated. Current implementation supports a single transcription resource, but this might change in future implementations. |
| `RoomSid` | `SID<RM>` | The ID of the parent room where the Transcription resource is updated.                                                                                                  |

Request body parameters

| Parameter | Type           | Description                                                                                                                                                                                     |
| --------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Status`  | `enum<string>` | New status of the Transcription resource. Can be: `started`, `stopped`. There is no state transition if the resource property status already has the same value or if the parameter is missing. |

**Example**:

```bash
curl -X POST "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" \
--data-urlencode "Status=stopped" \
-u ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

**Response**:

```json
{
  "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "configuration": {
    "languageCode": "EN-us",
    "partialResults": "true"
  },
  "date_created": "2025-07-22T12:55:30Z",
  "date_updated": "2025-07-22T12:56:02Z",
  "duration": null,
  "end_time": null,
  "room_sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "start_time": null,
  "status": "stopped",
  "ttid": "video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

### Restart transcriptions on a Room

To restart transcriptions on a Room that has a Transcription resource with a stopped state, update it with a `POST` request to the resource instance URI:

`/v1/Rooms/{RoomSid}/Transcriptions/{ttid}`

To restart transcription, set the `Status` to `started`.

Path parameters

| Parameter | Type      | Description                                                                                                                                                             |
| --------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ttid`    | `ttid`    | The TTID of the Transcription resource being updated. Current implementation supports a single transcription resource, but this might change in future implementations. |
| `RoomSid` | `SID<RM>` | The ID of the parent room where the Transcription resource is updated.                                                                                                  |

Request body parameters

| Parameter | Type           | Description                                                                                                                                                                                                |
| --------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Status`  | `enum<string>` | New status of the Transcription resource. Use `started` to restart transcriptions. There is no state transition if the resource property status already has the same value or if the parameter is missing. |

**Example**:

```bash
"https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" \
--data-urlencode "Status=started" \
-u ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

**Response**:

```json
{
  "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "configuration": {
    "languageCode": "EN-us",
    "partialResults": "true"
  },
  "date_created": "2025-07-22T12:57:24Z",
  "date_updated": null,
  "duration": null,
  "end_time": null,
  "room_sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "start_time": null,
  "status": "started",
  "ttid": "video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

### Retrieve the Transcription resource for a Room

Retrieve the Transcription resource in a Room with a `GET` request to the resource URI:

`/v1/Rooms/{RoomSid}/Transcriptions`

Real-Time Transcriptions supports only a single instance of the Transcription resource per Room, so the list will always have a single item.

Path parameters

| Parameter | Type      | Description                                                                 |
| --------- | --------- | --------------------------------------------------------------------------- |
| `RoomSid` | `SID<RM>` | The ID of the parent room from where Transcription resources are retrieved. |

**Example**:

```bash
curl -X GET "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions" \
-u $API_Key_Sid:$API_Key_Secret
```

**Response**:

```json
{
  "meta": {
    "first_page_url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions?PageSize=50&Page=0",
    "key": "transcriptions",
    "next_page_url": null,
    "page": 0,
    "page_size": 50,
    "previous_page_url": null,
    "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions?PageSize=50&Page=0"
  },
  "transcriptions": [
    {
      "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "configuration": {},
      "date_created": "2025-07-22T11:05:41Z",
      "date_updated": null,
      "duration": null,
      "end_time": null,
      "room_sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "start_time": null,
      "status": "started",
      "ttid": "video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
      "url": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    }
  ]
}
```

### Fetch a single Transcription resource

Retrieve a specific Transcription resource with a `GET` request to the instance resource URI:

`/v1/Rooms/{RoomSid}/Transcriptions/{ttid}`

Path parameters

| Parameter | Type      | Description                                                              |
| --------- | --------- | ------------------------------------------------------------------------ |
| `ttid`    | `ttid`    | The TTID of the Transcription resource being requested.                  |
| `RoomSid` | `SID<RM>` | The ID of the parent room where the Transcription resource is retrieved. |

**Example**:

```bash
curl -X https://video.twilio.com/v1/Rooms/$sid/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -u $API_Key_Sid:$API_Key_Secret
```

**Response**:

```json
{
  "account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "configuration": {
    "LanguageCode": "EN-us",
    "ProfanityFilter": "true"
  },
  "date_created": null,
  "date_updated": null,
  "duration": null,
  "end_time": null,
  "links": {
    "transcriptions": "https://video.twilio.com/v1/Rooms/RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Transcriptions/video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  },
  "room_sid": "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "start_time": null,
  "status": "created",
  "ttid": "video_extension_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

## Transcribed text delivery

Twilio delivers transcribed text to the client SDKs through callback events.

### JSON schema

The schema of the JSON delivery format contains a version number. Each event contains the transcription of a single utterance and details of the participant who generated the audio.

```text
properties:
  type:
    const: extension_transcriptions

  version:
    description: |
      Version of the transcriptions protocol used by this message. It is semver compliant

  track:
    $ref: /Server/State/RemoteTrack
    description: |
      Audio track from where the transcription has been generated.

  participant:
    $ref: /Server/State/Participant
    description: |
      The participant who published the audio track from where the
      transcription has been generated.

  sequence_number:
    type: integer
    description: |
      Sequence number. Starts with one and increments monotonically. A sequence
      counter is defined for each track to allow the receiver to identify 
      missing messages.

  timestamp:
    type: string
    description: |
      Absolute time from the real-time-transcription. It is
      conformant with UTC ISO 8601.

  partial_results:
    type: boolean
    description: |
      Whether the transcription is a final or a partial result.

  stability:
    type: double
    description: |
       Indicates how likely it is that this partial result transcript won't be updated again. The range is from `0.0` (unstable) to `1.0` (stable). This field is only provided when `partialResults` is `true`.

  language_code:
    type: string
    description: |
      Language code of the transcribed text. It is conformant with BCP-47.

  transcription:
    type: string
    description: |
      Utterance transcription 
```

**Example**:

```json
{
  "version": "1.0",
  "language_code": "en-US",
  "partial_results": false,
  "participant": "PA00000000000000000000000000000000",
  "sequence_number": 3,
  "timestamp": "2025-01-01T12:00:00.000000000Z",
  "track": "MT00000000000000000000000000000000",
  "transcription": "This is a test",
  "type": "extension_transcriptions"
}
```

### Partial results and stability

When the `partialResults` field is set to `true`, the transcription engine provides a series of partial results as it determines the text corresponding to the spoken utterance. The `stability` field provides an indication of how likely it is that the partial result provided will change again before the final result is delivered. The range is from `0.0` (unstable) to `1.0` (stable). In general, partial results with stability below `0.9` are preliminary and likely to change again. When building a UI element to display the transcribed text as captions or subtitles, it's best to filter out partial results with a stability value less than `0.9`, as this will avoid flickering on the text as the partial results are received.

### JavaScript SDK

#### Starting and stopping transcript events with the JavaScript SDK

To enable the flow of transcript events, set the `receiveTranscriptions` parameter in `connectOptions` to `true`. The default value is `false`. Once set to `true` and on condition that Real-Time Transcriptions is enabled at the Room level, callback events containing the transcribed text will start to flow.

**Example**:

```javascript
import { connect } from 'twilio-video';

const room = await connect(token, {
  name: 'my-room',
  receiveTranscriptions: true
});

room.on('transcription', (transcriptionEvent) => {
  console.log(`${transcriptionEvent.participant}: ${transcriptionEvent.transcription}`);
});
```

### iOS SDK

#### Starting and stopping transcript events with the iOS SDK

To enable the flow of transcript events, set the `receiveTranscriptions` parameter in `TVIConnectOptions` to `true`. The default value is `false`. The value can be retrived using the `isReceiveTranscriptionsEnabled` getter. Once set to `true` and on condition that Real-Time Transcriptions is enabled at the Room level, callback events containing the transcribed text will start to flow via the `transcriptionReceived(room:transcription:)` method in the RoomDelegate protocol.

**Example**:

```swift
let options = ConnectOptions(token: accessToken, block: { (builder) in
    builder.roomName = "test"
    builder.isReceiveTranscriptionsEnabled = true
})
```

### Android SDK

#### Starting and stopping transcript events with the Android SDK

To receive transcription events, set the `receiveTranscriptions` parameter in `ConnectOptions` to `true`. The default value is `false`. To check the current setting, call `isReceiveTranscriptionsEnabled()`.

Once set to `true` and Real-Time Transcriptions is enabled for the Room, callback events containing the transcribed text are delivered through the `onTranscription(@NonNull Room room, @NonNull JSONObject json)` method of the `Room.Listener` interface.

**Example**:

```java
ConnectOptions connectOptions = new ConnectOptions.Builder(accessToken)
        .receiveTranscriptions(true)
        .build();

Video.connect(context, connectOptions, roomListener);
```

## Twilio Console configuration

To enable and configure Real-time Transcriptions in the Twilio Console, navigate to the Video [Room settings page](https://console.twilio.com/us1/develop/video/manage/room-settings).

![Realtime Transcriptions settings with options to accept AI/ML features addendum and enable transcriptions by default.](https://docs-resources.prod.twilio.com/ed64acdd1e1fcbcd3f1bc7b8cc68d61977476a9c8c8e5903d3e9e251c3060ece.png)

## AI nutrition facts

> \[!NOTE]
>
> Real-Time Transcriptions for Video uses third-party artificial technology and machine learning technologies.
>
> [Twilio's AI Nutrition Facts](https://nutrition-facts.ai/) provide an overview of the AI feature you're using, so you can better understand how the AI is working with your data. The following **Speech to Text Transcriptions - Nutrition Facts** label outlines the AI qualities of Real-Time Transcriptions for Video. For more information, see [Twilio's AI Nutrition Facts page](https://nutrition-facts.ai/).

```json
{"name":"Speech to Text Transcriptions - Programmable Voice, Twilio Video, and Conversational Intelligence","description":"Generate speech to text voice transcriptions (real-time and post-call) in Programmable Voice, Twilio Video, and Conversational Intelligence.","modelType":"Generative and Predictive - Automatic Speech Recognition","optional":true,"baseModel":"Deepgram Speech-to-Text, Google Speech-to-Text, Amazon Transcribe","aiPrivacyLevel":null,"trustLayer":{"baseModelCustomerData":{"value":false,"comments":["Conversational Intelligence, Programmable Voice, and Twilio Video only use the default Base Model provided by the Model Vendor. The Base Model is not trained using customer data."]},"vendorModelCustomerData":{"value":false,"comments":["Conversational Intelligence, Programmable Voice, and Twilio Video only use the default Base Model provided by the Model Vendor. The Base Model is not trained using customer data."]},"trainingDataAnonymized":{"value":null,"comments":["Base Model is not trained using any customer data."]},"dataDeletion":{"value":true,"comments":["Transcriptions are deleted by the customer using the Conversational Intelligence API or when a customer account is deprovisioned."]},"auditing":{"value":true,"comments":["The customer views output in the Conversational Intelligence API or Transcript Viewer."]},"dataStorage":"Until the customer deletes","compliance":{"loggingAndAuditTrails":{"value":true,"comments":["The customer can listen to the input (recording) and view the output (transcript)."]},"guardrails":{"value":true,"comments":["The customer can listen to the input (recording) and view the output (transcript). "]}},"inputOutputConsistency":{"value":true,"comments":["The customer is responsible for human review."]}},"linksAndResources":"https://www.twilio.com/docs/conversational-intelligence"}
```

## Known beta issues

* The Google `medical_conversation` model requires that the `enableAutomaticPunctuation` field be set to `true`
* Transcriptions are incorrectly stopped when the [`MaxParticipantDuration`](https://www.twilio.com/docs/video/api/rooms-resource#resource-properties) time is reached. As a workaround, ensure that the `MaxParticipantDuration` field of the Room that is created is longer than the expected lifetime of the Room. By default this value is 4 hours.
* Video Insights incorrectly displays an extra "transcriber" participant in Video Rooms where real-time transcriptions are enabled.
