Skip to main content
Deepfake Detection classifies segments of single-speaker audio as naturally produced human speech or synthetic speech. Synthetic speech covers text-to-speech systems, voice cloning, and other AI voice generation. Classification is acoustic: the model analyzes how the audio sounds, not the words spoken. Audio is scored in windows rather than as a whole, so the response locates synthetic speech in time instead of returning one verdict per file.
Synthetic speech is not itself evidence of harm or deception. The model cannot distinguish someone using an accessibility tool to communicate from someone using voice cloning to defraud. Interpret results against the use case.

Deepfake Detection (batch)

Returns application/json. Every field is always present. confidence is confidence in the verdict given, not the probability that the audio is synthetic. A frame with verdict: "non-synthetic" and confidence: 0.97 means the model is 97% confident the speech is natural. It does not mean a 3% chance of being synthetic.

Try it

What you can configure

Audio formats

Accepted extensions: .3gp, .3gpp, .aac, .aiff, .amr, .au, .flac, .m4a, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm, .wma. Maximum file size is 100 MB. Empty files are rejected with 400.

Behavior and constraints

Audio under 0.5 seconds is rejected with 422. Audio shorter than one 4-second window is accepted and padded before inference. Each batch frame covers a 4-second window, and the file is windowed from start to finish. Leading and trailing silence is trimmed before windowing. Frame timestamps still refer to positions in the original file, so start_time_ms and end_time_ms line up against the source audio with no offset arithmetic. no-content frames are classified before inference rather than by the model, so silence produces an explicit verdict instead of an arbitrary synthetic or non-synthetic guess. Filter them out when aggregating a clip-level verdict. Recommended clip length is 4 to 60 seconds.

Deepfake Detection (streaming)

Frames arrive as JSON text messages while audio streams in. A closing done message reports total duration and frame count. Send audio as binary WebSocket frames of any size; the server buffers and windows internally. Send an empty text frame ("") to end the stream. The server then flushes remaining audio, delivers final frames, sends done, and closes.

Try it

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

What you can configure

Audio formats

audio_format is required on every connection, including self-describing containers. Omitting it closes the connection with code 1003. This differs from Transcription and Redaction streaming, which auto-detect containers.
Container formats. wav, mp3, ogg, flac, webm, aac, aiff, au, wma, opus, amr, mp4, m4a, 3gp, 3gpp. The stream carries sample rate and channel count, so sample_rate and num_channels must be omitted. The MP4-family values (mp4, m4a, 3gp, 3gpp) must be sent in a streamable layout. Anything else ends the connection with an audio-processing error. Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw. These are headerless, so sample_rate and num_channels are both required. sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000. Common raw configurations: s16le at 16 kHz mono is passed through without conversion. Every other format is decoded and resampled to 16 kHz mono first. Output is identical either way, so this only affects latency. Capture at s16le 16 kHz mono where the pipeline allows it. To convert a file:

Behavior and constraints

The first prediction is emitted once the minimum audio duration has arrived. Each subsequent prediction follows one second later, with the window growing from time zero. Once the window reaches full length it slides forward, holding a constant size. Verdicts therefore arrive incrementally rather than at end of stream. Format parameters are validated twice: at connection time, which closes with 1003, and again while decoding audio, which closes with 4002. The second catches both undecodable audio and a mismatch between the declared audio_format and the bytes actually sent.

Frame-level detection compared with the transcription signal

Multilingual Transcription accepts deepfake_signal=true, which adds a deepfake_score to each utterance. That is one score per utterance, available only when transcribing, and null for utterances under 0.5 seconds. The endpoints on this page score every frame across the file, return explicit no-content verdicts for silence, and work on live audio without producing a transcript. Use deepfake_signal when detection is a secondary signal alongside a transcript. Use these endpoints when detection is the goal.

API reference