Fast Speech to Text: Parallel Whisper Transcription avatar

Fast Speech to Text: Parallel Whisper Transcription

Pricing

Pay per usage

Go to Apify Store
Fast Speech to Text: Parallel Whisper Transcription

Fast Speech to Text: Parallel Whisper Transcription

Transcribes one audio window per run so long videos can be split and transcribed in parallel. Whisper large-v3-turbo on CPU with word timestamps; supports Standby HTTP mode.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Andrew Babo

Andrew Babo

Maintained by Community

Actor stats

0

Bookmarked

2.3K

Total users

1.2K

Monthly active users

5 days ago

Last modified

Categories

Share

Fast Speech to Text — Parallel Whisper Transcription for Long Audio & Video

Transcribe long media fast by splitting it into windows and running many workers at once. Each run transcribes one window — or a whole list of windows with the model kept warm — using faster-whisper (large-v3-turbo) on CPU with word-level timestamps.

Use it for: hour-long podcasts, webinars, lecture archives, call recordings, or any pipeline where waiting for a single sequential transcription is too slow.

  • Word timestamps and confidence, 90+ languages
  • One window per run, a batch of windows per warm worker, or a queue-driven worker pool
  • Tail overlap with _overlap flags so merged shards de-duplicate cleanly
  • Range-reads the source when the server supports it — no need to host the whole file per shard
  • Optional Standby HTTP mode for low-latency requests

Quick start — one window

{
"source": "https://example.com/audio16k.mp3",
"start_sec": 0,
"duration_sec": 240,
"overlap_sec": 1.5,
"language": "en",
"preset": "fast",
"model": "large-v3-turbo"
}

One run loads the model once and processes every window in the list:

{
"source": "https://example.com/audio16k.mp3",
"mode": "batch",
"windows": [
{ "job_id": "j1", "shard_index": 0, "source": "https://example.com/audio16k.mp3", "start_sec": 0, "duration_sec": 240, "overlap_sec": 1.5 },
{ "job_id": "j1", "shard_index": 1, "source": "https://example.com/audio16k.mp3", "start_sec": 240, "duration_sec": 240, "overlap_sec": 1.5 }
]
}

Start N runs like this in parallel and a 60-minute file finishes in minutes.

Input

FieldDefaultNotes
sourcerequired. https:// URL or kv:<storeId>/<key>
start_sec0offset of this window on the original timeline
duration_sec240window length. 240–300 s is the measured sweet spot
overlap_sec1.5extra tail audio; those words are flagged _overlap
languageautoISO code (en, vi, …)
presetfastfast | adaptive | balanced | accurate
modellarge-v3-turboalso distil-large-v3 (English only), medium
vad_filterfalseskip silence before decoding
cpu_threads4best value on a 16 GB run (≈4 vCPU)
batch_size8VAD chunks decoded in parallel; 0/1 = sequential
allow_emptytruesilent windows return 0 words instead of failing
mode"""" one window, batch window list, pool_worker queue
windowswindow list for mode: "batch"
queue_id, dataset_id, worker_labelpool_worker wiring
idle_sec, max_life_sec, max_jobs25, 600, 64worker leashes

distil-large-v3 is English-only and is automatically downgraded to large-v3-turbo for non-English audio.

Output

One dataset row per window:

{
"status": "success",
"shard_index": 0,
"start_sec": 0,
"duration_sec": 240,
"language": "en",
"words": [
{ "text": "Hello", "startMs": 120, "endMs": 410, "confidence": 0.97 },
{ "text": "everyone", "startMs": 420, "endMs": 760, "confidence": 0.95, "_overlap": true }
],
"segments": [{ "startMs": 120, "endMs": 4120, "text": "Hello everyone, welcome back" }],
"meta": { "model": "large-v3-turbo", "rtf": 4.7, "decode_sec": 51.2 }
}

All timestamps are already offset back to the original timeline, so merging shards is: concatenate, drop words flagged _overlap that duplicate the next shard's first words, sort by startMs.

Worker pool mode

For very large fan-outs, put the windows in an Apify request queue and start N workers with mode: "pool_worker". fetch_next_request is atomic, so two workers never take the same window, and every worker pushes rows into one shared dataset.

{
"source": "https://example.com/audio16k.mp3",
"mode": "pool_worker",
"queue_id": "<requestQueueId>",
"dataset_id": "<datasetId>",
"worker_label": "w1",
"idle_sec": 25,
"max_life_sec": 600,
"max_jobs": 64
}

Queue mode requires the workers to run under the same account with full permissions.

Error handling

reasonMeaningWhat to do
BAD_INPUTmissing source, invalid windowcheck the payload
UPSTREAM_BLOCKEDhost refused the range requesthost the audio yourself first
TIMEOUTwindow too long for the run timeoutreduce duration_sec
OOM_LIMITnot enough memoryrun with 16 GB
INTERNALunexpected failureretry that window only

Retries are cheap: a failed window is one shard, not the whole file.

Performance

16 GB run (≈4 vCPU), large-v3-turbo, preset: fast, batch_size: 8:

  • real-time factor ≈ 4.7× (a 240 s window decodes in ≈50 s)
  • 60-minute file, 15 parallel workers → ≈3–5 minutes wall clock
  • windows shorter than ~60 s waste fixed overhead; 240–300 s is optimal

FAQ

One window or batch mode? Batch, whenever you have more than a couple of windows — the model is loaded once instead of per run.

How do I prepare the audio? Extract a mono 16 kHz track once (see the Video & Audio Toolkit actor, op: "audio_full") and point every shard at that one URL.

Do I need a GPU? No. CPU only.

Can I get speaker labels? Not here — pair the merged transcript with the Speaker Diarization actor.