About JSON to SRT and Our 100% Browser-Local Subtitle Architecture
JSON to SRT (jsontosrt.com) is an engineering utility built for video editors, podcast producers, localization teams, and speech-to-text developers who need accurate .srt, .vtt, .txt, and .csv subtitle files without uploading confidential transcripts to a third-party server.
Why We Built a Zero-Upload Browser Architecture
Automated speech recognition APIs output rich JSON structures containing word-level timestamps, confidence scores, token arrays, and speaker diarization turns. A single 60-minute podcast transcribed with OpenAI verbose_json or WhisperX routinely produces a 3 MB to 8 MB JSON file. Most online subtitle converters upload those files to remote servers and block files above 1 MB or 2 MB behind recurring paywalls.
Uploading raw transcripts also creates compliance problems when working with unannounced product interviews, client discovery calls, legal depositions, or academic research under non-disclosure agreements. JSON to SRT eliminates server round-trips entirely:
- Local file reading: Dropped or selected files are read directly inside your browser tab via the Web
File.text()API. No multipart form upload or remote storage bucket exists. - In-memory cue reflow: Dialect detection, timestamp normalization, pause-gap splitting, and character-width wrapping run synchronously in your device memory. Large multi-megabyte transcripts truncate only the visual textarea preview above 32 KB of input so typing and scrolling stay responsive while the export buffer retains every cue.
- Direct Blob downloads: Clicking download constructs a UTF-8
Bloband triggers a localURL.createObjectURL()save dialog that is revoked immediately after export.
How Timestamps and Word-Level Splitting Are Tested Against SRT and WebVTT Specs
Raw speech-to-text segments often span 8 to 15 seconds and exceed 120 characters, overflowing timeline monitors in Premiere Pro, DaVinci Resolve, Final Cut Pro, CapCut, and web video players. Naive converters also introduce subtle millisecond rounding bugs that reject subtitle imports in strict broadcast validators.
Every build of JSON to SRT runs an automated Vitest unit suite and a Playwright Chromium end-to-end suite verifying the following timing and formatting invariants:
Millisecond carry-safe rounding
Floating-point timestamps such as 1.9996s or 59.9996s are converted to rounded integer milliseconds before decomposing hours, minutes, and seconds, preventing invalid 00:00:01,1000 carry overflows.
Strict SubRip and W3C WebVTT syntax
SRT exports enforce 1-based sequential cue numbers and comma separators (HH:MM:SS,mmm --> HH:MM:SS,mmm). WebVTT exports emit a compliant WEBVTT file header and dot separators (HH:MM:SS.mmm).
Word-level pause and turn splitting
When word arrays exist, cues split cleanly at natural speech pauses (configurable gap threshold), speaker turn boundaries, maximum cue durations, and exact line-character budgets (8 to 84 characters across 1 or 2 lines).
Unaligned word & CJK fallback
Numeric tokens skipped by forced aligners in WhisperX receive interpolated timestamps from neighboring words. Segment-only transcripts and CJK text without spaces split proportionally by character count while keeping punctuation off line starts.
Negative timestamp offsets clamp safely at 00:00:00,000 and enforce a minimum 50-millisecond cue duration (endSec > startSec) so shifted tracks never produce zero-length or inverted cues.
Supported ASR Engines and JSON Schemas
The parser automatically inspects top-level keys and normalizes five widely used speech recognition JSON formats into a unified cue timeline:
| ASR Engine / Format | Detected JSON Fields | Dedicated Preset |
|---|---|---|
OpenAI Whisper API (verbose_json) | segments[] and top-level or nested words[] with float second start / end | Verbose JSON preset |
| WhisperX (Pyannote Diarized) | segments[] with speaker labels (SPEAKER_00) and aligned word objects
| WhisperX diarized preset |
whisper.cpp CLI (-oj / -ojf) | transcription[] with millisecond offsets.from / to, string timestamps, and tokens[] | whisper.cpp preset |
| Deepgram Nova | results.channels[0].alternatives[0].words[] with punctuated_word and numeric speaker IDs
| Main converter |
| AssemblyAI Utterances | utterances[] and words[] using integer millisecond start / end timestamps and speaker tags
| WebVTT converter |
For vertical Reels, Shorts, and TikTok timelines, our Short Video Caption Splitter configures a 16-character single-line ceiling out of the box.
Independent Non-Affiliation Notice and Contact
JSON to SRT (jsontosrt.com) is an independent, clean-room software project released under the MIT License. It is not affiliated with, endorsed by, or sponsored by OpenAI, WhisperX authors, Georgi Gerganov (whisper.cpp), Deepgram, Inc., or AssemblyAI, Inc. Third-party product and format names appear strictly to describe compatible input schemas.
Contact Maintainers
For parser edge cases, schema compatibility requests, accessibility feedback, or partnership inquiries, email hello@jsontosrt.com. When reporting a JSON dialect edge case, strip private dialogue text and share only a minimal structural sample. Review our Privacy Policy and Terms of Use for full data handling and licensing details.