Skip to content
CutConvert

How to convert Whisper JSON to SRT subtitles

By Greg Thompson, Founder, CutConvertPublished

The fastest way to convert Whisper JSON to SRT is the free JSON to SRT converter: drop the JSON from OpenAI's transcription API (verbose_json), whisper.cpp, or any timed-transcript pipeline, and download clean, numbered SRT cues with the timing preserved — speaker labels included when your JSON carries them. This guide covers that route, when you don't need it at all (Whisper can sometimes write SRT directly), and the timing details that bite people who convert by hand.

First: maybe you don't need a converter

Honesty before tooling. If you're running the open-source whisper CLI yourself, it can write subtitles natively:

whisper interview.mp3 --output_format srt

whisper.cpp does the same with -osrt. If you control the transcription step and only want subtitles, ask for SRT at the source and skip the conversion entirely.

The JSON→SRT problem is real in every other situation:

  • You called the API. OpenAI's transcription endpoint returns JSON (verbose_json for timestamps) — there's no .srt file to be had after the fact without converting.
  • The JSON already exists. A pipeline stored transcripts as JSON last month, and now someone needs captions.
  • You need what JSON preserves. Word-level timestamps, speaker labels from a diarization step (WhisperX, pyannote) — richer data than the CLI's SRT writer uses.

What Whisper JSON actually looks like

A verbose_json response is a list of segments, each with floating-point start/end times in seconds:

{
  "segments": [
    { "start": 0.0, "end": 4.32, "text": " We're live in three, two, one." },
    { "start": 4.8, "end": 7.1, "text": " Welcome back to the show." }
  ]
}

SRT wants something structurally different — numbered cues with millisecond comma-decimal timestamps (00:00:00,000 --> 00:00:04,320) and readable line lengths. The conversion is exactly that restructuring.

The fast route: the JSON to SRT converter

  1. Open the free JSON to SRT converter.
  2. Drop the .json file — OpenAI verbose_json, whisper.cpp output, and generic {start, end, text} transcript shapes are all detected automatically.
  3. Press Convert and download the .srt. Long segments are split into readable cues, seconds become millisecond timestamps, and speaker fields survive as labels.

Batches work too — drop a season's worth of episode transcripts and download one ZIP of SRTs.

Converting by hand (and what goes wrong)

The DIY version is a dozen lines of Python — read segments, format timestamps, number the cues. The classic mistakes, so you can check any script you inherit:

  • Truncated milliseconds. 4.32 seconds is 00:00:04,320 — scripts that format with %d or floor the fraction drift cues visibly out of sync over a long video.
  • Comma vs dot. SRT uses 00:00:04,320; WebVTT uses a dot. Players reject the wrong one.
  • Marathon cues. Whisper segments can run 15+ seconds; dumping one segment per cue produces wall-of-text subtitles. Good converters re-split on length and pauses.
  • The leading space. Whisper's segment text usually starts with a space — cosmetic in JSON, ugly in captions.

From SRT onward

Once you have the SRT, the rest of the site's pipeline applies: SRT into Premiere as a transcript for text-based editing, SRT into Final Cut Pro as captions or titles, SRT to Word for review and translation, or SRT to VTT for web players.

FAQ

How do I convert Whisper JSON to SRT? Drop the JSON on the free JSON to SRT converter — OpenAI verbose_json, whisper.cpp output, and generic timed-transcript JSON are detected automatically — and download numbered, millisecond-accurate SRT cues.

Can Whisper output SRT directly? Yes, when you run it yourself: --output_format srt on the openai-whisper CLI, -osrt on whisper.cpp. The converter is for when you have JSON instead — API responses, stored pipeline output, or diarized transcripts with data the CLI writer doesn't use.

Does the OpenAI API return SRT? The transcription API can return srt as a response format, but most pipelines request verbose_json for the timestamps and store that. If JSON is what you saved, converting it is the way back to subtitles.

Do speaker labels survive? When the JSON carries a speaker field per segment (as WhisperX and diarization pipelines produce), yes — cues come out labeled. Plain Whisper output has no speaker data, so there's nothing to preserve.

Why are my hand-converted subtitles slowly drifting out of sync? Almost always millisecond truncation — a script flooring 4.32 to 4 seconds, or formatting the fraction wrong. Check the timestamp math first; source timing from Whisper is usually fine.

Is word-level timing used? Cue boundaries are built from segment timing, with long segments split into readable cues. Word timestamps, when present, improve the split points rather than producing one cue per word.

Is it free? Free to start. Guests convert up to 3 files per batch at up to 1 MB each; a free account raises that to 5 files and 30 conversions a month, and paid plans support 20 MB files and larger batches.

Greg Thompson · Founder, CutConvert

Greg builds CutConvert, the post-production file converter — including the first working decoder for Premiere Pro’s binary .prtranscript format. He writes these guides from the format specs and real editor workflows.

↑ Back to top