Muse Voice Transcribe API: Pricing, Documentation

by Meta

Muse Voice Transcribe API gives developers a production-ready speech recognition endpoint that turns recorded audio into structured, speaker-attributed text. It transcribes across more than 70 languages and switches between them inside a single sentence, so bilingual meetings and mixed-language interviews do not need to be split or pre-tagged. Beyond a flat transcript, the API segments a recording into turns with millisecond timings and can label each turn with a speaker, resolving more than twenty distinct voices in a single file. Recognition accuracy can be steered without fine-tuning by naming the languages you expect and the vocabulary that matters to you, which is what makes proper nouns, product names and domain jargon come back spelled correctly. Requests are asynchronous: a submit returns a request id, and the finished transcript is delivered as a JSON file you fetch when the job completes. Billing is measured on the length of the audio you send, not on how long transcription takes or how much text comes back.

Get API Key
Muse Voice API

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

No strings attached — add funds and get $5 bonus instantly

Claim Your $5 →

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Speech to Text - Muse Voice Transcribe

Request Code

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"
}

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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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

ParameterRequiredTypeDefaultAllowed values / rangeDescription
audio_urlYesstringhttps URL, file up to 32 MBPublic URL of the audio to transcribe. The file is fetched by the gateway, so the URL must be reachable without authentication.
audio_encodingYesstringWAV, PCM_16KHZ, PCM_24KHZFormat 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.
modeNostringPUSH_TO_TALKPUSH_TO_TALK, ENDPOINTING, DIARIZATIONHow 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_biasNoarray 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.
keywordsNoarray of stringsup to 100 entriesNames, 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

Modeturns[]speakerUse it for
PUSH_TO_TALKemptyA single utterance or dictation, where you only want the text.
ENDPOINTINGpopulatedLong recordings you want split at natural speech boundaries, with timings.
DIARIZATIONpopulatedpopulatedMeetings 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"
}
FieldTypeDescription
transcriptstringThe full transcript, with punctuation and capitalisation. Present in every mode.
turnsarraySegments of the transcript. Populated in ENDPOINTING and DIARIZATION; empty in PUSH_TO_TALK.
turns[].turnIdnumberZero-based index of the segment.
turns[].startMsnumberStart of the segment, in milliseconds from the beginning of the audio.
turns[].endMsnumberEnd of the segment, in milliseconds.
turns[].transcriptstringText of that segment.
turns[].speakerstringSpeaker label, e.g. A or B. Present only in DIARIZATION.
audio_duration_msnumberLength of the transcribed audio in milliseconds. This is the quantity you are billed on.
modestringThe 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
audio_url or audio_encoding missing, or the wrong typesynchronous 400
audio_encoding outside WAV / PCM_16KHZ / PCM_24KHZsynchronous 400
language_bias or keywords outside their size boundssynchronous 400
audio_url not https, not reachable, or not publicstatus: "ERROR"
Audio longer than 10 minutes, or a body over 32 MBstatus: "ERROR"
audio_encoding does not match the actual bytesstatus: "ERROR"
Audio not mono, or not 16-bitstatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request.
output.media_urlstringURL of the transcript JSON file.
output.media_typestringapplication/json.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is FAILED/ERROR.

Status Values & Flow

QUEUEDPROCESSINGCOMPLETED (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.

Muse Voice Transcribe API Pricing

Your request will cost $0.0033 per minute of audio.

⚡ Performance

Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).

Show data for the last
Generations
500last 30d
~17 per day
Success rate
100.0%
of completed generations
Generation time
74.0savg
p95 77.6s
Requests
Aug 22max 300Sep 20
Muse Voice TranscribeAvg 17/day
Generation Time
Aug 22max 2.1minSep 20
Muse Voice TranscribeAvg 74.0s
Error Rate
Aug 22max 5.0%Sep 20
Muse Voice TranscribeAvg 0.0%

〰 Uptime

Percent of generations that succeeded over the selected period, per model version.

Avg. Success Rate (30d)
100.00%
across all generations of this model family
Uptime
Aug 22max 100%Sep 20
SuccessfulAvg 100.00%