Transcribe
Turn a recording into text (multipart).
/api/v1/transcribeTurns a recording into text. Multipart in, JSON out. The language is detected — you never have to pick one first, and a sentence that switches mid-way still comes back whole.
Form fields
filefilerequiredThe recording. webm/opus, mp4, ogg, mp3, wav and flac all work — send what the browser recorded, no conversion needed. Up to 25 MB.
modelstringAn id from GET /transcribe/models. Left out, the server uses TRANSCRIBE_MODEL. This is also what decides whether the recording leaves the machine: whisper-local keeps it here, everything else goes to OpenAI.
languagestringISO code such as de or en. Normally unnecessary — the model detects it. Set it only when you already know, to skip the detection step.
Example
curl -X POST http://localhost:8000/api/v1/transcribe \
-F "file=@recording.webm" \
-F "model=gpt-transcribe"Response
{
"text": "Hallo, das ist ein Test der Transkription.",
"language": "de",
"duration_ms": 3200,
"model": "gpt-transcribe"
}textstringThe transcript as one flowing string.
languagestring | nullWhat the model heard, not what you asked for. null when the model does not report it — whisper-1 in plain JSON, for instance.
duration_msintegerLength of the recording in milliseconds, where the model reports it.
modelstringWhich entry actually did the work.
Availability
GET /api/v1/transcribe answers whether it can work at all, without sending a recording: { available, reason, model }. Pass ?model= to ask about a specific one — the answer differs, since whisper-local needs two programs installed and the hosted ones need a key. The frontend asks once on load and hides the microphone when the answer is no, rather than showing a button that is certain to fail.
200Transcribed successfully.
422The recording was empty, too large, or could not be decoded.
503Transcription is disabled (TRANSCRIBE_ENABLED=false).