100% Client-Side RAM Execution / Clean-Room MIT Open Source / Spec-Tested Subtitle Output

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 Blob and triggers a local URL.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.