Zero server upload / No 2 MB file cap / Instant Blob download

OpenAI Whisper JSON to WebVTT Converter

Convert Whisper JSON transcripts directly into standards-compliant .vtt caption tracks for HTML5 <video>, Plyr, Video.js, HLS.js, and Cloudflare Stream without server round-trips.

Quick Workflow Mode One click sets format, line width, line count, and speaker tags
No 2 MB cap / Zero upload
Detected: OpenAI Whisper verbose_json | 3 cues | Duration: 00:09.4 (9.4s) | Size: 3.1 KB
Line-Fit (<=42c) 100% (3/3)
Reading Speed 21.6 CPS (2 >20 CPS)
Words / Cues 25 words / 3 cues
Track Duration 00:09.4 (9.4s)
Auto-converts on edit or file drop

Cue Timing, Reading Speed & Line-Width Preview (First 25 Cues)

Showing 3 of 3 cues
# Start End Max Chars Speed Cue Lines
1 00:00:00.180 00:00:02.120 40 20.6 CPS
Welcome back to the engineering podcast,
2 00:00:02.940 00:00:05.120 42 28.4 CPS
today we convert raw Whisper JSON directly
inside your browser.
3 00:00:05.840 00:00:09.420 36 17.9 CPS
Word timestamps keep fast short-form
captions crisp and readable.

Browser-Local Pipeline

How It Works in 3 Steps

Pre-tuned for Whisper JSON to VTT with instant client-side conversion and zero file size caps.

  1. 01

    Paste or Drop Local ASR JSON

    Drop a .json file onto the highlighted upload box, paste raw API output, or pick one of five built-in ASR dialect samples. Multi-megabyte multi-hour files parse in local browser RAM with zero server upload.

  2. 02

    Select a Layout Pill & Check CPS Health

    Tap a one-click mode pill (Broadcast 42c x 2, TikTok/Shorts 16c x 1, Podcast Speaker Tags, or WebVTT Player) and watch the live Cue Health Summary flag >20 CPS fast cues and line-fit compliance.

  3. 03

    Verify Timings & Download Subtitles

    Inspect exact timestamps and per-cue character counts in the preview table, apply a positive or negative millisecond sync offset if needed, then copy or download .srt, .vtt, .txt, or .csv immediately.

Preset Specification & Field Mapping

JSON Schema Notes & Format Field Reference for Whisper JSON to VTT

Detailed parser behavior for this workflow alongside field references for all five supported speech-to-text JSON dialects.

Active preset rules (/whisper-json-to-vtt/)

  • Prepends the mandatory UTF-8 WEBVTT file header followed by a blank line as required by the W3C WebVTT specification and browser <track kind="captions"> parsers.
  • Formats cue timings with a period before milliseconds (HH:MM:SS.mmm --> HH:MM:SS.mmm) rather than SubRip commas, preventing silent caption load failures in Safari, Chrome, and Firefox.
  • Outputs clean cue timing blocks ready for browser <track> elements, HLS playlists, and web player caption menus.
  • Supports optional speaker prefixes and millisecond sync offsets when embedding diarized or trimmed video clips on the web.
verbose_json Float seconds (1.62)

OpenAI Whisper & faster-whisper

  • segments[].start / end / text
  • words[].word / start / end
  • segments[].words[]

Uses exact word timings when present and falls back to proportional word-boundary splitting on segment-only payloads.

Diarized JSON Float seconds (4.36)

WhisperX + pyannote.audio

  • segments[].speaker
  • segments[].words[].speaker
  • word_segments[]

Splits cues on speaker turn changes and interpolates missing timestamps on unaligned digits or currency symbols.

-oj / -ojf Integer ms (4220)

whisper.cpp Local CLI

  • transcription[].offsets.from / to
  • transcription[].timestamps.from / to
  • transcription[].text

Prioritizes integer millisecond offsets for drift-free timing and falls back to HH:MM:SS,mmm string parsing.

REST / SDK JSON Float seconds (5.44)

Deepgram Nova-2 & Nova-3

  • results.channels[0].alternatives[0].words[]
  • results.utterances[].speaker
  • words[].punctuated_word

Prefers punctuated_word capitalization and maps integer speaker indices into clean Speaker N prefixes.

Utterances JSON Integer ms (6120)

AssemblyAI Transcripts

  • utterances[].start / end / speaker
  • utterances[].words[]
  • words[].text / start / end

Auto-scales integer millisecond word and utterance timings to seconds without colliding with float Whisper schemas.

4 Export Targets Comma vs dot ms

SRT, WebVTT, CSV & TXT Output

  • SRT: HH:MM:SS,mmm
  • VTT: WEBVTT + HH:MM:SS.mmm
  • CSV: index,start,end,speaker,text

Clamps negative sync offsets safely at 00:00:00,000 and guarantees minimum 50 ms cue duration for NLE timelines.

Internal Subtitle Tool Matrix

Switch between all six specialized Whisper and ASR subtitle converters with pre-tuned line widths, speaker diarization labels, and export formats.

Technical FAQ for openai whisper json to vtt

What is the exact syntax difference between SRT and WebVTT output from Whisper JSON?
WebVTT starts with a mandatory WEBVTT header line and separates seconds from milliseconds with a dot (00:00:01.250 --> 00:00:03.800), whereas SRT has no header line and separates milliseconds with a comma (00:00:01,250 --> 00:00:03,800). HTML5 <track> elements reject comma-formatted timestamps.
How do I attach the downloaded .vtt file to an HTML5 video element?
Place a <track kind="captions" src="/captions.vtt" srclang="en" label="English" default> element inside your <video> tag and ensure your static host serves .vtt files with the text/vtt MIME type and CORS headers if hosted on another origin.
Can I also convert WhisperX or Deepgram JSON to WebVTT on this page?
Yes. Although this preset defaults to WebVTT output with an OpenAI Whisper sample, the input box and file uploader accept all five supported ASR JSON dialects and export any of them as .vtt.

Why browser-local parsing beats 2 MB paywalled cloud converters

An hour-long Whisper transcript with word-level timestamps routinely reaches 3 MB to 8 MB of JSON. Cloud upload tools meter that file size behind subscriptions while exposing private audio transcripts to remote storage.

Capability JSON to SRT Local Engine Paywalled Cloud Converters
JSON file size limit No artificial cap; parses >5 MB multi-hour transcripts in milliseconds Blocks uploads over 1 MB or 2 MB without a paid plan
Data privacy & NDA compliance Zero bytes leave your browser tab; safe for client, legal, and medical audio Uploads raw transcript JSON to remote servers and third-party buckets
ASR dialect coverage Auto-detects OpenAI verbose_json, WhisperX, whisper.cpp, Deepgram, AssemblyAI Breaks when segments[] is missing or timestamps use integer milliseconds
Cue line-width wrapping Live 8 to 84 char wrapping, 1 or 2 lines per cue, word-level timing split Exports raw 100-character decoder blocks that overflow video frames
Speaker labels & sync offset Instant [SPEAKER_XX] prefixes, turn-boundary breaks, and millisecond offset Drops pyannote speaker fields or requires manual desktop retiming