---
type: AI Model
id: muse-voice
title: Muse Voice API
provider: Meta
description: "Muse Voice Transcribe is Meta's speech-to-text model. It turns a recording into text, splits it into turns with speaker labels, and biases towards the languages and keywords you name. It reads mono 16-bit PCM or WAV audio up to ten minutes per request."
resource: https://www.pixazo.ai/models/muse-voice
docs_url: https://www.pixazo.ai/models/muse-voice
latest_version: 1.0
tags:
  - speech-to-text
  - meta
variants:
  - id: muse-voice-transcribe
    name: Muse Voice Transcribe
    version: 1.0
    capabilities:
      - Speech to Text
timestamp: 2026-09-19T12:37:58.999Z
---

# Muse Voice API

> Provider: **Meta**
> Source: https://www.pixazo.ai/models/muse-voice

Muse Voice Transcribe is Meta's speech-to-text model. It turns a recording into text, splits it into turns with speaker labels, and biases towards the languages and keywords you name. It reads mono 16-bit PCM or WAV audio up to ten minutes per request.

## Muse Voice Transcribe

### Speech to Text

## Muse Voice Transcribe API Documentation

Transcribe speech to text with speaker diarization across 70+ languages, with code-switching inside a single sentence. Asynchronous: submit returns a `request_id`; poll the status endpoint until the request is `COMPLETED`. The transcript is returned as a JSON file.

```
POST https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text
```

## Authentication

All requests require an API key passed via header.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Speech to Text - Muse Voice Transcribe

## Request Code

HTTP Python JavaScript cURL

```
POST https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "audio_url": "https://example.com/interview.wav",
  "audio_encoding": "WAV",
  "mode": "DIARIZATION"
}
```

```
import requests

url = "https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text"
headers = {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
  "audio_url": "https://example.com/interview.wav",
  "audio_encoding": "WAV",
  "mode": "DIARIZATION"
}

resp = requests.post(url, json=data, headers=headers)
print(resp.json())
```

```
const res = await fetch("https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
  },
  body: JSON.stringify({
  "audio_url": "https://example.com/interview.wav",
  "audio_encoding": "WAV",
  "mode": "DIARIZATION"
})
});
console.log(await res.json());
```

```
curl -X POST 'https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  --data-raw '{"audio_url": "https://example.com/interview.wav", "audio_encoding": "WAV", "mode": "DIARIZATION"}'
```

## Output

```
{
  "request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=muse-voice-transcribe&operation=speech-to-text)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"audio_url": "https://example.com/interview.wav", "audio_encoding": "WAV", "mode": "DIARIZATION"}'
```

### Callback Payload (success)

```
{
  "request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "muse-voice-transcribe",
  "output": {
    "media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json",
    "media_type": "application/json"
  },
  "created_at": "2026-09-04T11:18:56.746Z",
  "completed_at": "2026-09-04T11:19:32.000Z"
}
```

### Failure callback shape

```
{
  "request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "muse-voice-transcribe",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on each status change.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`audio_url`

Yes

string

—

https URL, file up to 32 MB

Public URL of the audio to transcribe. The file is fetched by the gateway, so the URL must be reachable without authentication.

`audio_encoding`

Yes

string

—

`WAV`, `PCM_16KHZ`, `PCM_24KHZ`

Format of the audio at `audio_url`. Required, and it must match the file you send — the model reads only mono 16-bit PCM and the format cannot be inferred from the URL. **Use `WAV`**: a RIFF/WAVE container holding mono 16-bit PCM at 16 kHz or 24 kHz. Convert other formats before uploading. The `PCM_*` values are accepted by this endpoint but are the encodings of the provider's realtime interface; send a WAV container unless you have confirmed otherwise.

`mode`

No

string

`PUSH_TO_TALK`

`PUSH_TO_TALK`, `ENDPOINTING`, `DIARIZATION`

How the transcript is segmented. `PUSH_TO_TALK` returns one transcript; `ENDPOINTING` splits it into turns at speech boundaries; `DIARIZATION` splits it into turns and labels each with a speaker.

`language_bias`

No

array of strings

— (auto-detected)

1–25 language names, e.g. `["English", "French"]`

Languages to bias recognition towards, given as language **names** — a list of languages, not locale codes such as `en-US`, and not free-form context. Omit it and the language is detected automatically; the model code-switches mid-sentence either way.

`keywords`

No

array of strings

—

up to 100 entries

Names, product terms, acronyms or jargon that appear in the audio. Biases recognition towards this vocabulary, which improves accuracy on proper nouns and domain terminology. Keywords bias recognition but do not guarantee an exact spelling.

### Audio requirements

-   Audio must be **mono**, **signed 16-bit little-endian PCM**, at **16 kHz or 24 kHz**. Stereo and 8-bit audio fail once the file is read, reported as `status: "ERROR"`. Audio is not converted for you.
-   At most **10 minutes** per request, and at most **32 MB**. Split longer recordings and submit each part.
-   `audio_encoding` must match the bytes at `audio_url`. A declaration that disagrees with the file — `WAV` for headerless audio, or a `PCM_*` value for a RIFF/WAVE file — fails once the file is read, reported as `status: "ERROR"`.
-   `audio_url` must be an `https` URL and publicly reachable.
-   Cost scales with the length of the audio; the current rate is in the pricing panel on this page.

### Choosing a mode

Mode

`turns[]`

`speaker`

Use it for

`PUSH_TO_TALK`

empty

—

A single utterance or dictation, where you only want the text.

`ENDPOINTING`

populated

—

Long recordings you want split at natural speech boundaries, with timings.

`DIARIZATION`

populated

populated

Meetings and interviews, where you need to know who said what. Handles 20+ speakers.

An empty `turns[]` under `PUSH_TO_TALK` is expected behaviour, not a failure.

## Transcript Format

The completed request returns `output.media_url`, a JSON file containing the transcript. Fetch that URL to read the result.

```
{
  "request_id": "50ad7353-7814-4a9f-a059-1465e86c12dd",
  "transcript": "Good morning everyone. Thanks for joining. Let's start with the quarterly numbers.",
  "turns": [
    {
      "turnId": 0,
      "startMs": 60,
      "endMs": 2180,
      "transcript": "Good morning everyone. Thanks for joining.",
      "speaker": "A"
    },
    {
      "turnId": 1,
      "startMs": 2240,
      "endMs": 5010,
      "transcript": "Let's start with the quarterly numbers.",
      "speaker": "B"
    }
  ],
  "audio_duration_ms": 5010,
  "mode": "DIARIZATION"
}
```

Field

Type

Description

transcript

string

The full transcript, with punctuation and capitalisation. Present in every mode.

turns

array

Segments of the transcript. Populated in `ENDPOINTING` and `DIARIZATION`; empty in `PUSH_TO_TALK`.

turns\[\].turnId

number

Zero-based index of the segment.

turns\[\].startMs

number

Start of the segment, in milliseconds from the beginning of the audio.

turns\[\].endMs

number

End of the segment, in milliseconds.

turns\[\].transcript

string

Text of that segment.

turns\[\].speaker

string

Speaker label, e.g. `A` or `B`. Present only in `DIARIZATION`.

audio\_duration\_ms

number

Length of the transcribed audio in milliseconds. This is the quantity you are billed on.

mode

string

The mode the request ran in.

Speech that is silent or below the confidence floor transcribes to an empty string rather than failing. That is a successful, billable request.

## Example Request

```
{
  "audio_url": "https://example.com/interview.wav",
  "audio_encoding": "WAV",
  "mode": "DIARIZATION"
}
```

## Example Response

```
{
  "request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
```

## Request Headers

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Bad request — `audio_url` or `audio_encoding` missing, of the wrong type, or an `audio_encoding` outside the accepted values. Anything checkable from the request body alone.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance.

429

Too many requests.

500

Internal server error.

Only what can be judged from the request body itself is rejected synchronously. Everything that needs the audio to be fetched and read is reported through the status endpoint instead, as `status: "ERROR"`. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

`audio_url` or `audio_encoding` missing, or the wrong type

synchronous `400`

`audio_encoding` outside `WAV` / `PCM_16KHZ` / `PCM_24KHZ`

synchronous `400`

`language_bias` or `keywords` outside their size bounds

synchronous `400`

`audio_url` not https, not reachable, or not public

`status: "ERROR"`

Audio longer than 10 minutes, or a body over 32 MB

`status: "ERROR"`

`audio_encoding` does not match the actual bytes

`status: "ERROR"`

Audio not mono, or not 16-bit

`status: "ERROR"`

Note the two `audio_encoding` failures are different checks at different moments: an **unrecognised value** is caught before the request is accepted, while a **value that disagrees with the file** can only be caught once the audio has been downloaded.

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` (or `FAILED`/`ERROR`), then fetch `output.media_url` for the transcript.

```
curl 'https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'
```

### Completed response

```
{
  "request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "muse-voice-transcribe",
  "output": {
    "media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json",
    "media_type": "application/json"
  },
  "created_at": "2026-09-04T11:18:56.746Z",
  "completed_at": "2026-09-04T11:19:32.000Z"
}
```

## Response Fields

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.

model\_id

string

The model that handled the request.

output.media\_url

string

URL of the transcript JSON file.

output.media\_type

string

`application/json`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is FAILED/ERROR.

## Status Values & Flow

`QUEUED` → `PROCESSING` → `COMPLETED` (success) or `FAILED`/`ERROR` (failure).

### How billing is measured

Billing is measured on the **length of the audio you submit**, rounded up to the next whole minute — not on the size of the transcript, and not on how long transcription takes. A hold is placed when the request is submitted, because the audio length is not known until the file has been read; the hold is reduced to the real cost once the duration is known, and released in full if the request fails.

The current rate is shown in the pricing panel on this page.
