Fast Speech to Text: Parallel Whisper Transcription
Pricing
Pay per usage
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
Maintained by CommunityActor 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
_overlapflags 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"}
Quick start — warm batch worker (recommended)
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
| Field | Default | Notes |
|---|---|---|
source | — | required. https:// URL or kv:<storeId>/<key> |
start_sec | 0 | offset of this window on the original timeline |
duration_sec | 240 | window length. 240–300 s is the measured sweet spot |
overlap_sec | 1.5 | extra tail audio; those words are flagged _overlap |
language | auto | ISO code (en, vi, …) |
preset | fast | fast | adaptive | balanced | accurate |
model | large-v3-turbo | also distil-large-v3 (English only), medium |
vad_filter | false | skip silence before decoding |
cpu_threads | 4 | best value on a 16 GB run (≈4 vCPU) |
batch_size | 8 | VAD chunks decoded in parallel; 0/1 = sequential |
allow_empty | true | silent windows return 0 words instead of failing |
mode | "" | "" one window, batch window list, pool_worker queue |
windows | — | window list for mode: "batch" |
queue_id, dataset_id, worker_label | — | pool_worker wiring |
idle_sec, max_life_sec, max_jobs | 25, 600, 64 | worker 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
reason | Meaning | What to do |
|---|---|---|
BAD_INPUT | missing source, invalid window | check the payload |
UPSTREAM_BLOCKED | host refused the range request | host the audio yourself first |
TIMEOUT | window too long for the run timeout | reduce duration_sec |
OOM_LIMIT | not enough memory | run with 16 GB |
INTERNAL | unexpected failure | retry 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.