Skip to navigation

AWS Marketplace (SageMaker)

Run Falcon 2.1 in your own AWS account as an Amazon SageMaker endpoint.

Falcon 2.1 is available on AWS Marketplace as an Amazon SageMaker model package. You subscribe with your AWS account, deploy an endpoint in that account, and call it directly. There is no Murf API key, and no Murf server is in the request path. The container runs with SageMaker network isolation, so text and audio never leave your endpoint. AWS bills you and pays Murf.

The package ships the same production voice prompts as the Murf API: 141 voices across 42 locales and 35 languages. Streaming first audio is about 50 ms on a recommended instance.

This package is Falcon 2.1 text-to-speech only. Speech to Text is not included. For a Murf-licensed deployment on your own servers, see On-Premise deployment.

Regions

As of November 2026, the listing is available in 16 AWS Regions:

us-east-1, us-east-2, us-west-1, us-west-2, ca-central-1, sa-east-1, eu-west-1, eu-west-2, eu-west-3, eu-central-1, eu-north-1, ap-south-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2.

Pick the Region on the listing configuration page and copy the model package ARN from there. The ARN is different in every Region.

Prerequisites

  • Subscribe. AWSMarketplaceManageSubscriptions, or the aws-marketplace:ViewSubscriptions, Subscribe, and Unsubscribe actions.
  • Deploy. AmazonSageMakerFullAccess and iam:PassRole on a SageMaker execution role. SageMaker Studio and notebook instances already have a role you can use.
  • GPU quota. In Service Quotas → Amazon SageMaker, set ml.g6e.xlarge for endpoint usage to at least 1. For batch transform, ml.g6e.xlarge for transform job usage is often 0 until you request it. Quota increases can take a day or more. If ml.g6e is not available in your Region, use ml.g6.xlarge or ml.g5.xlarge.

Quickstart

About 15 minutes, most of it waiting for the endpoint to start. The notebook does the same steps: paste the ARN into the first cell and run the rest.

1

Subscribe and copy the ARN

Open the listing, choose Continue to subscribe, review pricing and the EULA, then Accept offer. Choose Continue to configuration, pick your Region, and copy the product ARN.

Already subscribed? AWS Marketplace → Manage subscriptions → Murf Falcon 2.1 → Configure, select AWS CLI and your Region, and copy the ARN.

2

Deploy the endpoint

EnableNetworkIsolation keeps the container off the network. The startup health check needs 900 seconds because the model takes a few minutes to load.

import boto3, time
region = "us-east-1" # the Region you copied the ARN for
model_package_arn = "<model package ARN from the listing>"
role = "arn:aws:iam::<account-id>:role/<sagemaker-execution-role>"
name = f"murf-falcon-{time.strftime('%Y%m%d-%H%M%S')}"
sm = boto3.client("sagemaker", region_name=region)
sm.create_model(
ModelName=name,
ExecutionRoleArn=role,
PrimaryContainer={"ModelPackageName": model_package_arn},
EnableNetworkIsolation=True,
)
sm.create_endpoint_config(
EndpointConfigName=name,
ProductionVariants=[{
"VariantName": "AllTraffic",
"ModelName": name,
"InstanceType": "ml.g6e.xlarge",
"InitialInstanceCount": 1,
"ContainerStartupHealthCheckTimeoutInSeconds": 900,
}],
)
sm.create_endpoint(EndpointName=name, EndpointConfigName=name)
sm.get_waiter("endpoint_in_service").wait(
EndpointName=name, WaiterConfig={"Delay": 30, "MaxAttempts": 60}
)

The endpoint is ready in about 8–10 minutes.

3

Generate speech

import base64, json
runtime = boto3.client("sagemaker-runtime", region_name=region)
resp = runtime.invoke_endpoint(
EndpointName=name,
ContentType="application/json",
Body=json.dumps({
"text": "Hello from Murf Falcon 2.1 on Amazon SageMaker.",
"voice_id": "en-US-gordon",
"format": "wav",
}),
)
body = json.loads(resp["Body"].read())
open("hello.wav", "wb").write(base64.b64decode(body["audio"]))

Or from a terminal, with examples/invoke.py:

python examples/invoke.py "$ENDPOINT" realtime --text "Hello there." --out hello.wav
4

Delete the endpoint when you are done

You pay AWS for the GPU instance while the endpoint exists, whether or not you send requests. Delete test endpoints when you finish.

sm.delete_endpoint(EndpointName=name)
sm.delete_endpoint_config(EndpointConfigName=name)
sm.delete_model(ModelName=name)

The subscription stays active, so you can deploy again later. To end it, delete your models first, then cancel under AWS Marketplace → Manage subscriptions.

Voices, languages, and styles

Ask the endpoint for its catalog. Voice IDs match the production Falcon catalog (for example en-US-gordon), and you can preview the same voices in the Voice Library.

voices = json.loads(runtime.invoke_endpoint(
EndpointName=name,
ContentType="application/json",
Body=json.dumps({"action": "list_voices"}),
)["Body"].read())["voices"]

Each voice includes:

  • locale: the language it speaks by default, such as en_US.
  • supported_locales: every language it can speak, and the styles available in each. Many voices speak more than one language.
  • styles: speaking styles for the default locale.

locale and style are optional. The default is the voice’s own locale and the first style listed for it. Locale codes use an underscore (hi_IN), not the hyphenated form the hosted API uses (hi-IN).

{
"text": "ನಮಸ್ಕಾರ, ನಾನು ನಿಮಗೆ ಹೇಗೆ ಸಹಾಯ ಮಾಡಬಹುದು?",
"voice_id": "kn-IN-harshitha",
"locale": "kn_IN"
}

Ways to call the endpoint

ModeAPIUse it for
Real-timeInvokeEndpointComplete audio in one response, up to 3,000 characters
Response streamingInvokeEndpointWithResponseStreamAudio as it is generated, up to 20,000 characters
Bidirectional streamingInvokeEndpointWithBidirectionalStreamText arriving in pieces, such as LLM tokens; audio comes back per sentence
Batch transformCreateTransformJobA folder of JSON requests in S3, one audio file per request

Response streaming. Send "stream": true. The response is the audio itself (mp3 by default, or wav, ogg_opus, or raw PCM). "stream_format": "ndjson" returns JSON lines instead: {"type": "chunk", ...}, {"type": "timestamps", ...}, and a final {"type": "done"}. Word timestamps need ndjson.

Bidirectional streaming. One session carries many turns. Send a config frame, then text frames as tokens arrive. flush ends a turn and speaks any remaining text. cancel stops speech for barge-in. close ends the session. boto3 does not support this API yet. Use examples/invoke.py ... bidi, which needs aws-sdk-sagemaker-runtime-http2 and Python 3.12+.

Batch transform. One JSON request per S3 object, ContentType application/json, SplitType None, and "response_format": "binary" for playable files. The notebook has a full example.

Field names, audio formats, sample rates, and error codes are in the request reference. Real-time responses are JSON with base64 audio, duration_s, usage.characters, and request_id. words is present only when add_timestamps is true.

Instances and performance

InstanceGPUConcurrent streams
ml.g6e.xlarge (recommended)NVIDIA L40S 48 GB32
ml.g6.xlargeNVIDIA L4 24 GB16
ml.g5.xlargeNVIDIA A10G 24 GB16
ml.g6.12xlarge4× NVIDIA L4 24 GB64

The 2xlarge and 4xlarge sizes of these families, and ml.g6e.12xlarge, are also supported. Batch transform runs on ml.g6e.xlarge, ml.g6.xlarge, and ml.g5.xlarge.

Requests beyond the concurrent streams queue for up to 2 seconds, then return HTTP 429 capacity_exceeded. Add instances or use SageMaker auto scaling.

Measured on one ml.g6e.xlarge in November 2026, streaming 157-character requests from a client in the same Region:

Concurrent streamsMedian time to first audio
144 ms
1060 ms
3284 ms

English intelligibility on that run was 1.0–1.4% word error rate for en-US-natalie, en-AU-estelle, and en-UK-hazel, with 10 concurrent streams. That figure is for those English passages only.

Differences from the Murf API

The catalog matches production Falcon voices, with these exceptions:

  • No voice cloning or custom voices. The catalog is fixed.
  • No romanized Hindi. hi-LATN is not supported. Send Hindi in Devanagari with locale hi_IN.
  • No Romanian.
  • No pronunciation dictionaries, inline IPA, dashboard, API keys, or Murf-hosted regions. Send plain text. The container normalizes numbers, dates, currencies, and abbreviations when normalize_text is true (the default).
  • Different request shape. Fields are snake_case (voice_id, sample_rate). Locales use underscores (en_US). This is not the /v1/speech/stream schema.

Not every voice speaks every language. A 422 unsupported_locale or unsupported_style response lists the values that voice accepts.

Pricing

Real-time and streaming endpoints are billed per 1,000 input characters. Batch transform jobs are billed per instance-hour. Both charges are in addition to the SageMaker instance cost, which you pay to AWS. Current prices are on the listing.

Troubleshooting

SymptomFix
ResourceLimitExceeded when creating the endpoint or transform jobRequest a quota increase for that instance type, or use ml.g6.xlarge or ml.g5.xlarge.
InsufficientInstanceCapacityRetry later, or change instance type or Region.
Endpoint fails its health checkKeep ContainerStartupHealthCheckTimeoutInSeconds at 900.
HTTP 429 capacity_exceededMore concurrent requests than the instance allows. Add instances or enable auto scaling.
HTTP 404 voice_not_foundUnknown voice_id. Call list_voices.
HTTP 422 unsupported_locale or unsupported_styleThat voice does not speak that language or style. The message lists valid options.
HTTP 400 text_too_longOver 3,000 characters (real-time) or 20,000 (streaming). Split the text, or stream it.
HTTP 503 not_readyThe model is still loading. Retry shortly.

The endpoint writes one line per request to CloudWatch Logs (/aws/sagemaker/Endpoints/<endpoint-name>) with character count, audio length, and latency. Text is never logged.

Security and privacy

  • Text and audio stay in your account. With network isolation, the container has no network access and sends nothing to Murf or any third party.
  • Everything the model needs is inside the model package. Nothing is downloaded at start-up.
  • Generated audio carries an inaudible AudioSeal watermark that marks it as synthetic speech.

Support

Murf cannot see your requests, text, or audio. Email support@murf.ai with the AWS Region, model package version, the request_id from the response, and the error message. Billing disputes go through AWS Marketplace.