Speech-to-text API
Send us an audio file, get back what was said. One HTTP request, no queue to poll and no SDK of ours to install — it is the same endpoint and the same request shape as OpenAI’s, so most codebases change a base URL and nothing else.
What this actually does
You have a recording — a support call, a meeting, a voice note someone left in your app, the audio track of a video — and you need the words as text. You upload the file; a few seconds later you have a transcript. There is no conversation to manage, no prompt to write, and nothing to keep open between requests.
The model doing the work is Whisper large-v3 turbo, the fast member of OpenAI’s Whisper family, released under the MIT licence and run on our own hardware. It listens in 99 languages and writes the transcript in whichever one it hears. It is good at the things that defeat naive speech recognition: accents, crosstalk, background noise, and speakers who trail off mid-sentence.
What people build with it
- Call and meeting records — a searchable transcript, and the input to whichever model writes the summary.
- Subtitles and captions — ask for
srtorvttand the response is the subtitle file, timings included. - Voice input in your own product — the user talks, you store text.
- The ear of a voice agent — speech in here, text through a chat model, and speech back out through text-to-speech.
- Podcast and archive search — transcribe once, index the text, and the back catalogue becomes searchable.
Call it
POST /v1/audio/transcriptions, as multipart/form-data — you are uploading a file, so there is no JSON body and no Content-Type header to set by hand. In curl, -F is what makes the request multipart and lets curl choose its own boundary.
curl https://api.infersia.com/v1/audio/transcriptions \
-H "Authorization: Bearer $INFERSIA_API_KEY" \
-F model=openai/whisper-large-v3-turbo \
-F file=@meeting.m4a \
-F response_format=jsonThe same call with the official OpenAI SDK. No plugin, no fork — a different base_url and a model id:
from openai import OpenAI
import os
client = OpenAI(
base_url="https://api.infersia.com/v1",
api_key=os.environ["INFERSIA_API_KEY"],
)
with open("meeting.m4a", "rb") as audio:
transcript = client.audio.transcriptions.create(
model="openai/whisper-large-v3-turbo",
file=audio,
)
print(transcript.text)What you can send
wav, mp3, m4a/mp4, flac, ogg (opus or vorbis) and webm, up to 100MB per request. A video container is fine — we read the audio track out of it.
Duration is read from the container header before anything is dispatched, so the charge is known before the work starts and a file we cannot measure is refused with a 400 rather than billed on a guess. Whisper itself hears in 30-second windows, but that chunking happens on our side: you send one file and get one transcript back.
Two optional fields are worth knowing. language skips detection when you already know the answer, and prompt biases spelling — pass a list of the product names, drug names or surnames the recording is full of and they come back spelled the way you spell them.
What comes back
response_format decides the shape of the response, and it is the parameter most worth reading twice:
| response_format | You get |
|---|---|
| json | The default. JSON with a single text field. |
| verbose_json | JSON with duration, language, text, segments, words and usage. The only format that carries timings. |
| text | The bare transcript as plain text. Not JSON. |
| srt | A SubRip subtitle file, ready to save next to the video. |
| vtt | A WebVTT subtitle file, for the HTML video element. |
If you want to know when something was said — to jump to a moment, highlight a clip, or line the transcript up against the audio — verbose_json is the one. It is also the only format that reports the duration we measured, which is the quantity you were billed on.
with open("meeting.m4a", "rb") as audio:
result = client.audio.transcriptions.create(
model="openai/whisper-large-v3-turbo",
file=audio,
response_format="verbose_json",
)
print(result.language, result.duration)
for segment in result.segments:
print(f"[{segment.start:7.2f}s] {segment.text}")And for subtitles, the response body already is the file — write it straight to disk rather than parsing it:
curl https://api.infersia.com/v1/audio/transcriptions \
-H "Authorization: Bearer $INFERSIA_API_KEY" \
-F model=openai/whisper-large-v3-turbo \
-F file=@interview.mp4 \
-F response_format=srt \
--output interview.srtHow fast
A 480-second recording — eight minutes of speech — came back in 11.8 seconds measured end to end, on the hardware serving this model. Most of that was the upload rather than the transcription.
That is one measurement of one file, not a benchmark, and your own numbers will move with file size and connection. It is here because it is the figure we actually recorded, and because “faster than real time” is a claim worth being able to check.
What it costs
How that compares
Transcription is one of the few parts of this market where everyone quotes the same unit, so the comparison is arithmetic rather than argument. Every figure below was read off the vendor’s own pricing page on 7 August 2026.
| Provider | Model | Published price |
|---|---|---|
| OpenAI | whisper-1 | $0.006 / minute |
| OpenAI | gpt-4o-transcribe OpenAI's estimate; sold per audio token | $0.006 / minute |
| OpenAI | gpt-4o-mini-transcribe OpenAI's estimate; sold per audio token | $0.003 / minute |
| Deepgram | Nova-3 monolingual pre-recorded, pay-as-you-go | $0.0077 / minute |
| Deepgram | Nova-3 monolingual streaming, pay-as-you-go | $0.0048 / minute |
Sources, fetched 7 August 2026: developers.openai.com/api/docs/pricing and deepgram.com/pricing. Prices change and this table does not update itself — check the source before you make a decision on it.
The row worth reading carefully is whisper-1: those are the same weights, from the same lab, under the same MIT licence. What differs is who is running them and what they charge to do it. OpenAI’s cheaper transcription model, gpt-4o-mini-transcribe, is not Whisper and is not open — comparable on price, not on what you can inspect or move.
Where to go next
The model
Precision served, accepted parameters, measured latency and licence.
whisper-large-v3-turbo →The playground
Drop a file in the browser and read the transcript before writing any code.
Open the playground →Your audio is not retained
What we keep about a transcription is the duration we billed you on, its cost and whether it succeeded. Our usage table has no column an upload or a transcript could be written into, so keeping one would take a schema migration rather than a lapse. That is not a setting to find — it is the default, and the reasoning is set out in full on the transparency page.