Convert JSON to SRT or VTT
Have a transcription in JSON — from Whisper, whisper.cpp, a Hugging Face pipeline or another speech-to-text tool — and need subtitles? Paste it below to turn it into an SRT or WebVTT file. The tool reads the segments array of start, end and text, writes HH:MM:SS,mmm cues, and can regroup word-level timings if your JSON has them. Runs entirely in your browser.
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.
Transcription JSON, turned into subtitles
Speech-to-text tools return structured JSON, not subtitles. The shape most of them share is the one OpenAI's Whisper made common: a segments array where each item has a start and end in seconds and a line of text. This tool reads that array and writes a correctly formatted subtitle file — SubRip .srt or WebVTT .vtt — turning the floating-point seconds into proper timestamps. To get this JSON from Whisper, request verbose_json from the OpenAI audio API (add timestamp_granularities: ["word"] for word timings), or run the CLI with --output_format json (--word_timestamps True for words); whisper.cpp and WhisperX exports work as-is.
It understands several common variants: OpenAI Whisper and the OpenAI audio API's verbose JSON, whisper.cpp's transcription output (with millisecond offsets), Hugging Face's chunks with [start, end] timestamp pairs, and a bare top-level array of segments. If word-level timestamps are present, word mode regroups them into caption-sized cues by a max-characters-per-line and max-seconds-per-cue rule.
If the JSON isn't a shape it recognises, it says so with a clear message rather than writing a broken file — so you know to check for a segments (or words) array. Whether you need SubRip for a desktop player or WebVTT for an HTML5 <track>, pick the output format above the download button. Everything runs on your device; nothing is uploaded.
FAQ
Which JSON structures are supported?
Whisper and OpenAI verbose_json (a segments array of start, end, text), whisper.cpp (transcription with millisecond offsets), Hugging Face pipelines (chunks with [start, end] timestamp pairs), and a plain array of segments. Word-level words arrays are read too.
What if my tool's JSON is different?
If there's no recognisable segments (or words) array, the tool tells you instead of guessing. Most speech-to-text exports can be coaxed into the Whisper shape — an array of objects with numeric start and end (seconds) and a text field.
How do word timestamps become subtitles?
In word mode the tool walks the word list and starts a new cue whenever the current line would exceed your max characters, or the cue would exceed your max seconds. That turns raw word timings into readable, well-sized captions.
Are the timestamps in seconds or milliseconds?
Whisper-style JSON uses seconds (a float like 12.48); the tool converts those to SRT's HH:MM:SS,mmm. It also handles whisper.cpp's millisecond offsets automatically.
Can I get a WebVTT file instead of SRT?
Yes. Set Output format to WebVTT and the same conversion writes a .vtt — the format HTML5 <track> players expect — instead of a .srt. The cue timing and text are identical either way.
Is my transcript uploaded anywhere?
No. Parsing 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 .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.