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.005/min

Gemini 3.5 Transcribe

Google Gemini

Batch

Google Gemini batch transcription with word timestamps, optional speaker labels and custom vocabulary.

Transcribe with this modelCompare in playground

72 languages · benchmarked

About Gemini 3.5 Transcribe

Gemini 3.5 Transcribe is a speech-to-text model from Google Gemini. In our standardized benchmarks it reaches 10.43% word error rate, ranking #8 of 40 models tested. It supports 72 languages and runs at $0.005/min — cheaper than most alternatives.

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

Overall Score

69.4

#8 of 40

Word Error Rate

10.43%

Character Error Rate

6.94%

Match Error Rate

9.78%

Word Info Lost

14.62%

Avg Latency

5.1s

Benchmarks Run

35

Cost vs. accuracy

overall WER · 40 models

Gemini 3.5 Transcribe

field · 39 models

lower-left is better

Performance by category

8 categories

WER

lower is better

Medical

1.9%

Legal

2.2%

Technical

2.6%

Conversational

5.9%

Finance

6.8%

General

9.4%

Noisy Environment

23.6%

Code-Switching

26.7%

CategoryWERCERMERWILLatencyBenchmarks

Code-Switching

26.73%
20.79%
25.96%
31.85%

6.1s

2

Conversational

5.94%
3.93%
5.66%
7.75%

5.7s

2

Finance

6.77%
2.96%
6.68%
10.93%

5.5s

2

General

9.39%
6.20%
9.27%
15.01%

4.9s

19

Legal

2.17%
1.28%
2.14%
3.14%

5.4s

2

Medical

1.94%
1.15%
1.94%
2.57%

5.3s

2

Noisy Environment

23.59%
15.38%
19.07%
26.73%

4.2s

4

Technical

2.63%
1.74%
2.61%
3.53%

6.2s

2

Performance by accent

5 accents

AccentWERBenchmarks

African

24.62%

1

Australian

18.46%

1

Indian

25.40%

1

British

4.48%

1

American

18.87%

1

Pricing

pay per second

Rate

$0.005

/min

Cost estimator

1 hour

$0.30

10 hours

$3.02

100 hours

$30.24

1,000 hours

$302.40

Billed per second of audio processed.

API & usage

POST /api/v1/transcriptions

Model ID

gemini/gemini-3.5-transcribe

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 gemini/gemini-3.5-transcribe.
Set it up first:
npm install -g @opentranscription/cli
ot login
npx skills add opentranscription/skills
Then run:
ot transcribe <my-file> --model gemini/gemini-3.5-transcribe
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.
This model can also label speakers with --diarize, and take a vocabulary of names and jargon with --vocab "Kubernetes,Sanjay". Offer those one at a time, and only if I have not already said.
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: 'gemini/gemini-3.5-transcribe',
language: 'af',
diarization: true,
customWords: ['Kubernetes', 'Grafana', 'Sanjay Bhattacharya'],
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.

diarization

boolean

Label speakers (A, B, …) in the output.

word_timestamps

boolean

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

custom_words

string[]

Names, jargon and product terms to bias the model toward. Up to 1000 entries.

vocabulary_list_id

uuid

A vocabulary list saved in your workspace. Merged with custom_words when both are sent.

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.",
"speaker": "A"
}
],
"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

6.5s

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 →

Cheaper

Whisper Large V3 Turbo

Cloudflare

12.90% WER

$0.0005/min

Compare →

Compare Gemini 3.5 Transcribe with…

same benchmark, every match

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

Supported Languages

AfrikaansAmharicArabicArmenianAssameseAzerbaijaniBelarusianBengaliBosnianBulgarianBurmeseCatalanKhmerCroatianCzechDanishDutchEnglishEstonianPersianTagalogFinnishFrenchGalicianGeorgianGermanGreekGujaratiHausaHebrewHindiHungarianIcelandicIndonesianItalianJapaneseJavaneseKannadaKazakhKoreankyLatvianLingalaLithuanianMacedonianMalayMalayalamMalteseChineseMarathiMongolianNepaliNorwegianOdiaPolishPortuguesePunjabiRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishTajikTeluguThaiTurkishUkrainianUzbekVietnamese

Supported Formats

wavmp3aiffaacoggflacmpegm4al16opusalawmulawwebm

Features

Auto-detectDiarizationCode-switching+2

Limits

Max file size

No documented limit

Max duration

30 min