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

WhisperX JSON to SRT with Speaker Labels

Turn WhisperX + pyannote.audio diarization JSON into speaker-labeled subtitles. Preserves SPEAKER_00 and custom speaker names while splitting cues cleanly whenever the active speaker changes.

Quick Workflow Mode One click sets format, line width, line count, and speaker tags
No 2 MB cap / Zero upload
Detected: WhisperX Diarized JSON | 5 cues | Duration: 00:12.6 (12.6s) | Size: 6.2 KB
Line-Fit (<=42c) 100% (5/5)
Reading Speed 24.6 CPS (5 >20 CPS)
Words / Cues 36 words / 5 cues
Track Duration 00:12.6 (12.6s)
Auto-converts on edit or file drop

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

Showing 5 of 5 cues
# Start End Max Chars Speed Cue Lines
1 00:00:00,240 00:00:03,980 41 21.1 CPS
[SPEAKER_00] Can we export speaker labels
from WhisperX without uploading client
2 00:00:04,000 00:00:04,360 15 41.7 CPS
audio anywhere?
3 00:00:04,920 00:00:07,940 40 20.5 CPS
[SPEAKER_01] Yes, every diarized segment
stays in local memory,
4 00:00:08,680 00:00:09,680 36 36.0 CPS
and pauses split long turns cleanly.
5 00:00:10,120 00:00:12,640 41 27.8 CPS
[SPEAKER_00] Perfect, let us download the
SRT file for timeline review.

Browser-Local Pipeline

How It Works in 3 Steps

Pre-tuned for WhisperX Diarized 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 WhisperX Diarized

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

Active preset rules (/whisperx-diarized-json-to-srt/)

  • Reads segment-level speaker strings (segments[].speaker) and word-level speaker assignments (segments[].words[].speaker) produced by WhisperX wav2vec2 forced alignment and pyannote diarization.
  • Handles WhisperX unaligned tokens such as numerals, currency symbols, and punctuation marks where word objects omit start and end floats by inheriting neighbor boundaries safely.
  • Starts a fresh subtitle cue whenever the speaker label changes between words so two voices never collide inside one unlabeled caption block.
  • Prepends [SPEAKER_XX] to cue turns when speaker prefixes are enabled, and accounts for prefix length during line wrapping so captions stay clean on screen.
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 whisperx json to srt speaker labels

Why are some words in WhisperX JSON missing start and end timestamps?
WhisperX computes word timings through phoneme-level wav2vec2 alignment. Digits like "2026" or symbols like "%" have no direct acoustic phoneme match in basic models, so WhisperX leaves start and end undefined on those word entries. Our parser interpolates timestamps from adjacent aligned words instead of crashing or dropping numbers.
Can I rename SPEAKER_00 and SPEAKER_01 to real guest names before downloading SRT?
Yes. Run a quick string replace on "SPEAKER_00" in your JSON or edit the text directly inside the JSON input pane, and the live preview updates every speaker prefix across all cues immediately.
What happens if I uncheck the speaker prefix toggle on a WhisperX file?
Unchecking Include speaker prefix hides the [SPEAKER_00] label from the exported SRT or VTT lines while still respecting speaker turn boundaries during cue segmentation.

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