OpenTranscription
OpenTranscription
RankerModelsPlayground
OpenTranscription
OpenTranscription

One API to every speech-to-text model worth using. Compare them on your audio, route to the best one, pay per second.

Platform status

Product

RankerModelsTranscriptionsPlaygroundBlog

Developers

DocumentationReliabilityAPI VersioningStatus

Legal

Privacy PolicyTerms of ServiceSupport
© 2026 OpenTranscription
Back to Models$0.0005/min

Whisper Large V3 Turbo

Cloudflare

Batch

OpenAI Whisper large-v3-turbo hosted by Cloudflare Workers AI, with word-level timestamps and automatic language detection.

Transcribe with this modelCompare in playground

12 languages · benchmarked

About Whisper Large V3 Turbo

Whisper Large V3 Turbo is a speech-to-text model from Cloudflare. In our standardized benchmarks it reaches 12.90% word error rate, ranking #10 of 37 models tested. It supports 12 languages and runs at $0.001/min — the cheapest in the catalog.

Its nearest benchmarked alternative is MAI-Transcribe-2 (preview). Best suited for accuracy-critical work and high-volume, cost-sensitive pipelines.

Overall Score

76.7

#10 of 37

Word Error Rate

12.90%

Character Error Rate

9.21%

Match Error Rate

11.87%

Word Info Lost

16.31%

Avg Latency

5.3s

Benchmarks Run

33

Cost vs. accuracy

overall WER · 37 models

Whisper Large V3 Turbo

field · 36 models

lower-left is better

Performance by category

8 categories

WER

lower is better

Medical

2.1%

Legal

2.8%

Technical

5.2%

Finance

6.7%

Conversational

10.0%

General

10.7%

Code-Switching

23.2%

Noisy Environment

36.3%

CategoryWERCERMERWILLatencyBenchmarks

Code-Switching

23.15%
14.58%
22.50%
30.97%

8.1s

2

Conversational

9.99%
6.79%
9.97%
11.77%

3.0s

2

Finance

6.67%
3.09%
6.55%
10.41%

11.1s

2

General

10.65%
8.56%
9.76%
14.50%

5.1s

17

Legal

2.75%
1.95%
2.74%
3.42%

4.7s

2

Medical

2.10%
0.99%
2.10%
3.22%

7.2s

2

Noisy Environment

36.25%
24.38%
31.97%
39.63%

2.9s

4

Technical

5.17%
3.03%
5.17%
6.76%

3.8s

2

Performance by accent

5 accents

AccentWERBenchmarks

African

24.62%

1

Australian

36.92%

1

Indian

23.81%

1

British

5.97%

1

American

9.43%

1

Pricing

pay per second

Rate

$0.0005

/min

Cost estimator

1 hour

$0.03

10 hours

$0.32

100 hours

$3.24

1,000 hours

$32.40

Billed per second of audio processed.

API & usage

POST /api/v1/transcriptions

Model ID

cloudflare/whisper-large-v3-turbo

Get an API key

Authenticate every request with your secret API key as a Bearer token. Issue a key from your dashboard.

Use it with your agent

Paste this into Claude Code, Cursor, Codex or any agent with a shell. It installs the CLI and the OpenTranscription skill, then transcribes with this model.

Transcribe an audio file for me with OpenTranscription, using the model cloudflare/whisper-large-v3-turbo.
Set it up first:
npm install -g @opentranscription/cli
ot login
npx skills add opentranscription/skills
Then run:
ot transcribe <my-file> --model cloudflare/whisper-large-v3-turbo
Ask me one question at a time, and give me options to pick from rather than open questions. Look for audio files here before asking which one I mean. Leave the language alone unless I tell you what it is, since the model detects it.
The login step opens my browser and waits for me to approve it, so stop and tell me when you reach it. The skill covers the rest.
Agent SkillTypeScript SDKPython SDKCLI on npm

Quickstart

Upload your audio, create a job with this model, then poll the job or set a webhook_url to be notified when it completes.

// npm install @opentranscription/sdk
import { readFile } from 'node:fs/promises';
import { OpenTranscription } from '@opentranscription/sdk';
const ot = new OpenTranscription({ apiKey: process.env.OT_API_KEY! });
// Uploads the audio and opens the job. The signed-URL round trip is inside.
const job = await ot.transcribe({
file: await readFile('interview.mp3'),
fileName: 'interview.mp3',
model: 'cloudflare/whisper-large-v3-turbo',
language: 'en',
webhookUrl: 'https://your-app.com/webhooks/ot',
});
// We POST a signed event to that URL when the job finishes: no polling required.

Key parameters

file_path

string

required

Storage path returned by the upload step.

model

string

required

The model to run this job on.

models

string[]

Ordered fallback chain: primary first, then backups tried in order if a provider fails.

language

string

ISO 639-1 language code. Omit to auto-detect.

word_timestamps

boolean

Per-word start, end and confidence. Defaults to true; send false to leave them out.

webhook_url

string

HTTPS URL notified with the result when the job completes. Delivered events are signed (X-OT-Signature).

title

string

Display name for this job in the dashboard. Falls back to the file name.

Response

A completed job returns the transcript in the OpenTranscription Unified Schema (OTUS).

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"transcript": {
"text": "Welcome to the meeting, everyone.",
"language": "en",
"confidence": 0.97,
"segments": [
{
"id": 0,
"start": 0,
"end": 3.5,
"text": "Welcome to the meeting, everyone."
}
],
"word_timestamps": "available",
"words": [
{
"text": "Welcome",
"start": 0,
"end": 0.42,
"confidence": 0.99
}
]
}
}

Webhooks — skip polling

We POST a signed event to your webhook_url when a job completes or fails; verify the X-OT-Signature (HMAC-SHA256, reject if older than 300 s) and dedupe on the event id, then fetch the full transcript via GET /api/v1/transcriptions/{id}.

import { createHmac, timingSafeEqual } from "node:crypto";
// Your signing secret from Settings → API keys.
const SECRET = process.env.OT_WEBHOOK_SECRET ?? "";
function verify(
rawBody: string,
header: string,
nowSeconds = Math.floor(Date.now() / 1000),
): boolean {
const segments = header.split(",");
// Exactly one t= segment, finite, within the replay window.
const tValues = segments.filter((s) => s.startsWith("t=")).map((s) => s.slice(2));
if (tValues.length !== 1) return false;
const t = Number(tValues[0]);
if (!Number.isFinite(t) || Math.abs(nowSeconds - t) > 300) return false;
const expected = createHmac("sha256", SECRET)
.update(`${t}.${rawBody}`)
.digest("hex");
// Header may carry multiple v1 sigs (key rotation). Match any.
return segments
.filter((s) => s.startsWith("v1="))
.some((s) => {
const got = Buffer.from(s.slice(3), "hex");
const exp = Buffer.from(expected, "hex");
return got.length === exp.length && timingSafeEqual(got, exp);
});
}
// Express example. Use the RAW body buffer, not the parsed JSON.
// The X-OT-Signature header carries t=<unix>,v1=<hmac-hex>.
app.post("/webhooks/ot", express.raw({ type: "application/json" }), (req, res) => {
const sig = req.headers["x-ot-signature"] as string;
if (!verify(req.body.toString(), sig)) {
return res.sendStatus(400);
}
const event = JSON.parse(req.body.toString());
// Dedupe on event.id (at-least-once delivery), then enqueue + return 2xx fast.
res.sendStatus(200);
});
Get your signing secret

Rate-limited per tier — see the X-RateLimit-* response headers.

Full API reference

Reliability

rolling 30 days

Uptime · 30d

100.00%

Error rate

0.00%

Avg latency

78.3s

Last incident

None in 30d

Similar models

from the same field

More accurate

MAI-Transcribe-2 (preview)

Microsoft Azure

7.77% WER

$0.0017/min

Compare →

Compare Whisper Large V3 Turbo with…

same benchmark, every match

vs MAI-Transcribe-2 (preview)vs Soniox STT (Async)vs Whisper Large V3 Turbo (Groq)vs GPT Transcribevs Chirp 3vs Speechmatics Enhancedvs Azure Speechvs Scribe v2vs Gladia Solaria-3vs Voxtral Mini Transcribevs Qwen3 ASR Flashvs Amazon Transcribevs GPT-4o Mini Transcribevs GPT-4o Transcribe Diarizevs Speechmatics Standard

Supported Languages

EnglishSpanishFrenchGermanItalianPortugueseDutchPolishRussianChineseJapaneseKorean

Supported Formats

mp3wavflacm4aoggwebm

Features

Auto-detectWord Timestamps

Limits

Max file size

25 MB

Max duration

No documented limit