> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://murf.ai/api/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://murf.ai/api/docs/_mcp/server.

# AWS Marketplace (SageMaker)

> Subscribe to Falcon 2.1 on AWS Marketplace and deploy it as a SageMaker endpoint in your AWS account. Text and audio stay in your account.

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.

#### [Subscribe on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-52dsyzqmc6bjg)

Review the offer, accept it, and copy the model package ARN for your Region.

#### [GitHub guide and notebook](https://github.com/murf-ai/murf-falcon-sagemaker)

Deploy, list voices, stream, run a batch job, and clean up from the sample notebook.

> **Note**
>
> 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](/api/docs/text-to-speech/on-premise).

## 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](https://github.com/murf-ai/murf-falcon-sagemaker/blob/main/Murf-Falcon-TTS-on-SageMaker.ipynb) does the same steps: paste the ARN into the first cell and run the rest.

#### Subscribe and copy the ARN

Open the [listing](https://aws.amazon.com/marketplace/pp/prodview-52dsyzqmc6bjg), 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.

#### 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.

```python
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.

#### Generate speech

```python
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`](https://github.com/murf-ai/murf-falcon-sagemaker/blob/main/examples/invoke.py):

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

#### Delete the endpoint when you are done

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

```python
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](/api/docs/voices-styles/voice-library).

```python
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`).

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

## Ways to call the endpoint

| Mode                    | API                                     | Use it for                                                                 |
| ----------------------- | --------------------------------------- | -------------------------------------------------------------------------- |
| Real-time               | `InvokeEndpoint`                        | Complete audio in one response, up to 3,000 characters                     |
| Response streaming      | `InvokeEndpointWithResponseStream`      | Audio as it is generated, up to 20,000 characters                          |
| Bidirectional streaming | `InvokeEndpointWithBidirectionalStream` | Text arriving in pieces, such as LLM tokens; audio comes back per sentence |
| Batch transform         | `CreateTransformJob`                    | A 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](https://github.com/murf-ai/murf-falcon-sagemaker#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

| Instance                      | GPU                | Concurrent streams |
| ----------------------------- | ------------------ | ------------------ |
| `ml.g6e.xlarge` (recommended) | NVIDIA L40S 48 GB  | 32                 |
| `ml.g6.xlarge`                | NVIDIA L4 24 GB    | 16                 |
| `ml.g5.xlarge`                | NVIDIA A10G 24 GB  | 16                 |
| `ml.g6.12xlarge`              | 4× NVIDIA L4 24 GB | 64                 |

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](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling.html).

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

| Concurrent streams | Median time to first audio |
| ------------------ | -------------------------- |
| 1                  | 44 ms                      |
| 10                 | 60 ms                      |
| 32                 | 84 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

> **Note**
>
> 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](https://aws.amazon.com/marketplace/pp/prodview-52dsyzqmc6bjg).

## Troubleshooting

| Symptom                                                             | Fix                                                                                       |
| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `ResourceLimitExceeded` when creating the endpoint or transform job | Request a quota increase for that instance type, or use `ml.g6.xlarge` or `ml.g5.xlarge`. |
| `InsufficientInstanceCapacity`                                      | Retry later, or change instance type or Region.                                           |
| Endpoint fails its health check                                     | Keep `ContainerStartupHealthCheckTimeoutInSeconds` at 900.                                |
| HTTP 429 `capacity_exceeded`                                        | More concurrent requests than the instance allows. Add instances or enable auto scaling.  |
| HTTP 404 `voice_not_found`                                          | Unknown `voice_id`. Call `list_voices`.                                                   |
| HTTP 422 `unsupported_locale` or `unsupported_style`                | That voice does not speak that language or style. The message lists valid options.        |
| HTTP 400 `text_too_long`                                            | Over 3,000 characters (real-time) or 20,000 (streaming). Split the text, or stream it.    |
| HTTP 503 `not_ready`                                                | The 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](https://github.com/facebookresearch/audioseal) watermark that marks it as synthetic speech.

## Support

Murf cannot see your requests, text, or audio. Email [support@murf.ai](mailto: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.

#### [Email](mailto:support@murf.ai)

[support@murf.ai](mailto:support@murf.ai)

#### [Contact Sales](https://murf.ai/enterprise?src=d_contact_sales_api_docs)

Private offers, custom terms, or a Murf-licensed deployment