Convert Whisper JSON to SRT

Ran audio through Whisper and got a wall of JSON you can't drop into a video player? Paste it below to turn the transcription into a proper SRT subtitle file — segment timings become HH:MM:SS,mmm cues, and if your JSON has word-level timestamps you can regroup them into tidy captions. It runs entirely in your browser.

Drop your Whisper JSON file here
or click to choose a file · or paste the text below

By default each transcription segment becomes one cue with its original timing. Switch to word mode to rebuild cues from word-level timestamps, capped by characters per line and seconds per cue. It all runs in your browser — nothing is uploaded.

From Whisper's JSON to real subtitles

OpenAI's Whisper (and the many tools built on it — whisper.cpp, faster-whisper, WhisperX, the OpenAI audio API) can output a rich JSON transcript, but a video player wants an .srt, not JSON. This tool bridges that gap: it reads the segments array — each with a start, end (in seconds) and text — and writes a correctly formatted SubRip file, converting the floating-point seconds into HH:MM:SS,mmm timestamps.

If you transcribed with word timestamps on (the API's timestamp_granularities: ["word"], or --word_timestamps True on the CLI), your JSON also carries a words array. Switch to word mode and the tool regroups those words into caption-sized cues, breaking to a new cue when a line would run past your character limit or a cue would run longer than your chosen number of seconds. That's handy when Whisper's own segments are too long to read comfortably.

Nothing is uploaded — the JSON is parsed and the subtitles are built in JavaScript on your device. If the timings need nudging against your video afterward, load the result into the Shift or Reading Speed tools.

FAQ

What Whisper output do I paste here?

The JSON transcript. On the OpenAI API that's the verbose_json response format; with the open-source whisper CLI it's the .json file it writes alongside the audio. Both contain a segments array with start, end and text, which is what this tool reads.

My JSON has word-level timestamps — can I use them?

Yes. Choose "Words (regroup by rule)" and the tool builds cues from the word timings instead of the segments, starting a new cue whenever a line would exceed your max characters or a cue would exceed your max seconds. If no words array is present it tells you and you can stay on segment mode.

Why doesn't it just use Whisper's segments as-is?

By default it does — one segment, one cue. Word mode is only there for when the segments are too long or oddly broken and you'd rather rebuild shorter, more readable captions from the word timings.

It says the JSON isn't a shape it recognises. What now?

The tool expects Whisper-style output with a segments array of { start, end, text }. It also reads Hugging Face chunks and whisper.cpp transcription output. If yours is a different structure, the message will say so rather than produce a broken file — check that segments (or words) are present.

Is my transcript uploaded anywhere?

No. Parsing the JSON and building the .srt happen entirely in your browser. Your transcript never leaves your device and no server is involved.

Can I batch convert multiple files at once?

Yes. Drop several Whisper .json files together and they'll each be converted and returned in a single ZIP, all in your browser. It's the same conversion as single files, just in bulk.

You might also need