Skip to main content
Modulate has three transcription models.
  • Multilingual Transcription carries per-utterance timing, speaker labels, and optional emotion, accent, deepfake, and PII/PHI signals. Batch and streaming.
  • English Fast Transcription is English-only and tuned for throughput and latency. Batch and streaming.
  • Multilingual Fast Transcription returns a transcript in any supported language with no metadata. Batch only.
Every signal is off by default except speaker diarization, which defaults to true on Multilingual Transcription and to false on English Fast Transcription.

Multilingual Transcription (batch)

Returns application/json. text, duration_ms, and utterances are always present. text may be an empty string and utterances an empty array when no speech was recognized. Language is detected per utterance, so a file where speakers switch languages reports each utterance in the language actually spoken.

Try it

The example above enables emotion and accent. With every signal off, the response shape is identical and emotion, accent, and deepfake_score are null.

What you can configure

custom_terms travels only inside the JSON config field. There is no top-level form field for it.

Audio formats

Accepted extensions: .aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm. Maximum file size is 100 MB. Empty files are rejected with 400.

Multilingual Transcription (streaming)

Utterances arrive as JSON text messages while audio streams in. Each partial_utterance carries text, start_ms, speaker, emotion, accent, and deepfake_score. Any of those except text may be null before a value is available. Each partial replaces the previous one for the active utterance, and the finalized utterance supersedes all partials before it. Send audio as binary WebSocket frames in any chunk size. Send an empty text frame ("") to end the stream.

Try it

WebSocket endpoints cannot be exercised with cURL. For command-line testing use websocat.

What you can configure

An optional JSON configuration can be sent as the first text frame, before any audio. Any field there overrides the matching query parameter, and it is the only way to pass custom_terms on this endpoint. A binary first frame is treated as audio and the query-parameter defaults apply, so binary-first clients keep working unchanged.

Audio formats

Self-describing formats. wav, mp3, ogg, flac, webm, aac, aiff. Auto-detected from headers when audio_format is omitted. sample_rate and num_channels must not be sent for these. Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw. Headerless, so audio_format, sample_rate, and num_channels are all required. sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000.

English Fast Transcription (batch)

Returns application/json. text and duration_ms are always present. utterances is present only when speaker_diarization is enabled, and may be an empty array when no transcribable speech is found. With diarization enabled, text becomes the time-ordered concatenation of the utterance texts. This model produces no emotion, accent, deepfake, PII/PHI, or custom vocabulary output.

Try it

Without speaker_diarization, the response is text and duration_ms only. The utterances key is absent rather than empty.

What you can configure

Audio formats

Accepted extensions: .aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm. Maximum file size is 100 MB. Files above it are rejected with 413. Empty files are rejected with 400.

Behavior

With diarization enabled, quiet background speech on far-field or multi-party audio can surface as additional utterances. Overlapping speech is attributed to a single speaker per time span.

English Fast Transcription (streaming)

The lowest-latency option, and the one for cases where a person is waiting on the text. Text in both message types is already auto-capitalized and auto-punctuated. Render text directly.
Each partial_utterance contains the complete transcript of its scope so far, not a delta. Replace the displayed text on every partial. Never append. The last few words, including their capitalization and punctuation, can be revised in the next partial as the model receives more context.
Every connection ends with at least one final utterance. A stream containing no speech yields a single final with empty text.

Try it

WebSocket endpoints cannot be exercised with cURL. For command-line testing use websocat.

What you can configure

With endpointing=false, the connection produces a single final utterance at end of stream covering the whole stream with start_ms=0, and each partial reflects the whole stream so far. With endpointing=true, trailing silence closes the current utterance and starts a new one. The server emits one final utterance per speech segment, each with its own start_ms and duration_ms, and each partial reflects the current segment. The full transcript is the concatenation of the final texts. This is what makes the endpoint usable for live conversation.

Audio formats

audio_format is required on every connection, including containers. Omitting it closes the connection with 1003. Container formats. wav, mp3, ogg, flac, webm, aac, aiff. The header determines sample rate and channel count, and sample_rate and num_channels are ignored. Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw. sample_rate and num_channels are both required. sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000. For the lowest end-to-end latency use audio_format=s16le&sample_rate=16000&num_channels=1, which bypasses the server’s audio decoder. Sending container bytes while declaring a raw PCM format closes the connection with 4002.

Multilingual Fast Transcription (batch)

Returns application/json. All three fields are always present. For audio containing more than one language, language reports the predominant one. The transcript still reflects each part in the language spoken there. This model produces no diarization, utterance breakdown, or enrichment signals.

Try it

What you can configure

Audio formats

Accepted extensions: .aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm. Maximum file size is 100 MB. Files above it are rejected with 413. Empty files are rejected with 400.

Error codes

This endpoint returns 401 for a missing or invalid key, where the other transcription endpoints return 403. It also returns 502 when the request cannot be completed and 504 on timeout.

Signals

Speaker diarization

speaker_diarization, boolean. Identifies distinct speakers and assigns each utterance a 1-indexed speaker. Numbers are consistent within one request: speaker 1 in one utterance is the same person as speaker 1 in another from the same audio. They are not consistent across separate requests or files. Diarization is independent of language detection. In a multilingual conversation a speaker keeps one label across a language switch.

Emotion

emotion_signal, boolean. Classifies the emotional tone of each utterance from the voice signal, into emotion. Classification is acoustic, so two utterances with identical text can receive different labels if the delivery differs. Neutral, Calm, Happy, Amused, Excited, Proud, Affectionate, Interested, Hopeful, Frustrated, Angry, Contemptuous, Concerned, Afraid, Sad, Ashamed, Bored, Tired, Surprised, Anxious, Stressed, Disgusted, Disappointed, Confused, Relieved, Confident. For a whole-file label with no transcript, see Emotion Detection.

Accent

accent_signal, boolean. Classifies the regional or national accent of each utterance’s speaker, into accent. Results are typically stable for a speaker with a consistent accent, and vary more on short or acoustically difficult segments. American, British, Australian, Southern, Indian, Irish, Scottish, Eastern_European, African, Asian, Latin_American, Middle_Eastern, Unknown. For a whole-file label with no transcript, see Accent Detection.

Deepfake score

deepfake_signal, boolean. Scores each utterance for the likelihood it contains AI-generated speech, into deepfake_score. This is one score per utterance. For frame-level verdicts across a whole file, explicit no-content handling for silence, or verdicts on live audio without a transcript, see Deepfake Detection.

PII/PHI tagging

pii_phi_tagging, boolean. Wraps personally identifiable and personal health information in the transcript text with entity tags. Transcript content is preserved and only markup is added. To also silence the corresponding audio ranges, use PII/PHI Redaction instead.

Language hint

language, ISO 639-1 code. By default the language is detected per utterance. Passing a code hints the expected language. BCP 47 region and script subtags such as en-US are accepted, but only the primary subtag is used. Case-insensitive. Transport differs by endpoint, and getting it wrong produces a 400 or a silently ignored value: An invalid code is rejected with 400 on batch endpoints, and closes streaming connections with 1003. English Fast Transcription accepts no language parameter in either mode.

Custom vocabulary

custom_terms, array. Biases transcription toward domain terms and names that would otherwise be mistranscribed. Each entry is a plain string or an object: At most 1000 entries, and the term strings serialized together as JSON must total under 8000 characters. Blank terms and blank pronunciations are dropped.
The other transcription endpoints and both redaction endpoints do not accept custom vocabulary.

API reference