AWS Transcribe

How to set up AWS Transcribe with Recall.ai

🚧

Important: This guide only applies to workspaces with v1.10 API access

The v1.10 API is only available to Recall accounts created before May 28, 2025.

Do not use this documentation unless the workspace has access to the v1.10 API. If the workspace creation date is unknown, stop and clarify. All other workspaces must use the v1.11 API documentation instead.

Setup

To use AWS transcribe, you must create a new user in your AWS account with a secret key/access key. Once you have those credentials, add them in the transcription section of the Explorer Dashboard:

Next follow the guides below to add an IAM policy to allow AWS Transcribe access to the newly created user.

❗️

The IAM policies for realtime and async transcription are different! Make sure you use the right one!

Realtime Transcription

Policies

We typically recommend developers add the default AmazonTranscribeFullAccess policy to your AWS IAM User. For a minimal config, ensure that you have the transcribe:StartStreamTranscription and transcribe:StartStreamTranscriptionWebSocket actions allowed

Below is a minimal policy to have this working

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowRealtimeStreaming", // Name here is arbitrary
            "Effect": "Allow",
            "Action": [
                "transcribe:StartStreamTranscription",
                "transcribe:StartStreamTranscriptionWebSocket"
            ],
            "Resource": "*"
        }
    ]
}

Example Request

To successfully make a real-time request using AWS Transcribe, specify exactly one of:

  • language_code for one known language (for example, en-US)
  • identify_language: true with at least two candidates in language_options to detect one dominant language
  • identify_multiple_languages: true with at least two candidates in language_options for code-switching

Include only one dialect per language in language_options; for example, do not include both en-US and en-AU.

Here's an example request body:

{
  "recording_config": {
    "transcript": {
      "provider": {
        "aws_transcribe_streaming": {
          "language_code": "en-US"
        }
      }
    }
  }
}

To detect one dominant language, set identify_language to true:

{
  "recording_config": {
    "transcript": {
      "provider": {
        "aws_transcribe_streaming": {
          "identify_language": true,
          "language_options": "en-US,es-US",
          "preferred_language": "en-US"
        }
      }
    }
  }
}

To transcribe a stream where speakers may switch languages, set identify_multiple_languages to true:

{
  "recording_config": {
    "transcript": {
      "provider": {
        "aws_transcribe_streaming": {
          "identify_multiple_languages": true,
          "language_options": "en-US,es-US"
        }
      }
    }
  }
}

Async Transcription

Policies

For a minimal config, ensure that you have the transcribe:GetTranscriptionJob, transcribe:StartTranscriptionJob and s3:GetObject on external buckets is allowed.

❗️

Unlike realtime transcription, AmazonTranscribeFullAccess does not provide enough access. You will additionally need at least AmazonS3ReadOnlyAccess, but we do not recommend this approach as it provides too much access to your account's buckets.

Below is a minimal policy to have this working:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TranscribeServiceAccess",
            "Effect": "Allow",
            "Action": [
                "transcribe:GetTranscriptionJob",
                "transcribe:StartTranscriptionJob"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3AccessForTranscribe",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "s3:ResourceAccount": "YOUR_AWS_ACCOUNT_ID"
                }
            }
        }
    ]
}

Replace YOUR_AWS_ACCOUNT_ID with the output of aws sts get-caller-identity --query Account --output text.

Example Request

To successfully make an async request using AWS Transcribe, specify exactly one of:

  • language_code for one known language (for example, en-US)
  • identify_language: true to detect one dominant language
  • identify_multiple_languages: true for code-switching

To detect one dominant language:

curl --request POST \
     --url https://us-west-2.recall.ai/api/v2beta/bot/{BOT_ID}/analyze \
     --header "Authorization: $RECALLAI_API_KEY" \
     --header "accept: application/json" \
     --header "content-type: application/json" \
     --data '{
  "aws_transcribe_async_transcription": {
    "identify_language": true
  }
}'

To transcribe audio where speakers may switch languages, set identify_multiple_languages to true. You can optionally restrict detection with language_options:

{
  "aws_transcribe_async_transcription": {
    "identify_multiple_languages": true,
    "language_options": ["en-US", "es-US"]
  }
}

Did this page help you?